From 950fe8f2b1249369ab0b419b0063e6683bc8080e Mon Sep 17 00:00:00 2001 From: Tavian Barnes Date: Tue, 30 Nov 2010 23:46:52 -0500 Subject: Check for platform support for ioctl(TIOCGWINSZ). --- configure.ac | 18 ++++++++++++++++++ dimension/Makefile.am | 2 ++ dimension/platform.c | 40 ++++++++++++++++++++++++++++++++++++++++ dimension/platform.h | 31 +++++++++++++++++++++++++++++++ dimension/progressbar.c | 12 +++--------- 5 files changed, 94 insertions(+), 9 deletions(-) create mode 100644 dimension/platform.c create mode 100644 dimension/platform.h diff --git a/configure.ac b/configure.ac index 81c299c..336c996 100644 --- a/configure.ac +++ b/configure.ac @@ -125,6 +125,24 @@ AC_COMPILE_IFELSE([ AC_MSG_RESULT([no])] ) +AC_MSG_CHECKING([for ioctl(TIOCGWINSZ)]) +AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM( + [ + #include + #include + ], + [ + struct winsize ws; + ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws); + ] + )], + [AC_DEFINE([DMNSN_TIOCGWINSZ], [1]) + AC_MSG_RESULT([yes])], + [AC_DEFINE([DMNSN_TIOCGWINSZ], [0]) + AC_MSG_RESULT([no])] +) + AC_CHECK_HEADER([GL/glx.h], [enable_glx=yes], [enable_glx=no]) AM_CONDITIONAL([GLX], [test "$enable_glx" != "no"]) diff --git a/dimension/Makefile.am b/dimension/Makefile.am index fdf6040..2f4ee88 100644 --- a/dimension/Makefile.am +++ b/dimension/Makefile.am @@ -65,6 +65,8 @@ dimension_SOURCES = directives.y \ main.c \ parse.c \ parse.h \ + platform.c \ + platform.h \ progressbar.c \ progressbar.h \ realize.c \ diff --git a/dimension/platform.c b/dimension/platform.c new file mode 100644 index 0000000..06c74bc --- /dev/null +++ b/dimension/platform.c @@ -0,0 +1,40 @@ +/************************************************************************* + * Copyright (C) 2009-2010 Tavian Barnes * + * * + * This file is part of Dimension. * + * * + * Dimension is free software; you can redistribute it and/or modify it * + * under the terms of the GNU General Public License as published by the * + * Free Software Foundation; either version 3 of the License, or (at * + * your option) any later version. * + * * + * Dimension is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *************************************************************************/ + +#include "platform.h" + +#if DMNSN_TIOCGWINSZ + #include + #include +#endif + +unsigned int +dmnsn_terminal_width() +{ +#if DMNSN_TIOCGWINSZ + struct winsize ws; + unsigned int width = 80; + if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) == 0) { + width = ws.ws_col; + } + return width; +#else + return 80; +#endif +} diff --git a/dimension/platform.h b/dimension/platform.h new file mode 100644 index 0000000..ffb3406 --- /dev/null +++ b/dimension/platform.h @@ -0,0 +1,31 @@ +/************************************************************************* + * Copyright (C) 2009-2010 Tavian Barnes * + * * + * This file is part of Dimension. * + * * + * Dimension is free software; you can redistribute it and/or modify it * + * under the terms of the GNU General Public License as published by the * + * Free Software Foundation; either version 3 of the License, or (at * + * your option) any later version. * + * * + * Dimension is distributed in the hope that it will be useful, but * + * WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *************************************************************************/ + +#ifndef PLATFORM_H +#define PLATFORM_H + +#include "dimension.h" + +/** + * Get the width of the terminal. + * @return The width (in characters) of the terminal, defaulting to 80. + */ +unsigned int dmnsn_terminal_width(); + +#endif /* PLATFORM_H */ diff --git a/dimension/progressbar.c b/dimension/progressbar.c index 7ea1344..affb42f 100644 --- a/dimension/progressbar.c +++ b/dimension/progressbar.c @@ -18,10 +18,9 @@ *************************************************************************/ #include "progressbar.h" -#include +#include "platform.h" #include #include -#include void dmnsn_progressbar(const char *format, const dmnsn_progress *progress, ...) @@ -38,13 +37,8 @@ dmnsn_progressbar(const char *format, const dmnsn_progress *progress, ...) fflush(stdout); - /* Try to fill the terminal with the progress bar; this is non-portable */ - struct winsize ws; - unsigned int width = 80; - if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) == 0) { - width = ws.ws_col; - } - + /* Try to fill the terminal with the progress bar */ + unsigned int width = dmnsn_terminal_width(); unsigned int increments = width - (len % width); for (unsigned int i = 0; i < increments; ++i) { dmnsn_wait_progress(progress, ((double)(i + 1))/increments); -- cgit v1.2.3