summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTavian Barnes <tavianator@gmail.com>2010-11-30 23:46:52 -0500
committerTavian Barnes <tavianator@gmail.com>2010-11-30 23:46:52 -0500
commit950fe8f2b1249369ab0b419b0063e6683bc8080e (patch)
treed1252a031054f8c8e7b2789966b625426be4f69a
parent4b9641002a7b0edac8d88762385315939d2ff753 (diff)
downloaddimension-950fe8f2b1249369ab0b419b0063e6683bc8080e.tar.xz
Check for platform support for ioctl(TIOCGWINSZ).
-rw-r--r--configure.ac18
-rw-r--r--dimension/Makefile.am2
-rw-r--r--dimension/platform.c40
-rw-r--r--dimension/platform.h31
-rw-r--r--dimension/progressbar.c12
5 files changed, 94 insertions, 9 deletions
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 <sys/ioctl.h>
+ #include <unistd.h>
+ ],
+ [
+ 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 <tavianator@gmail.com> *
+ * *
+ * 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 <http://www.gnu.org/licenses/>. *
+ *************************************************************************/
+
+#include "platform.h"
+
+#if DMNSN_TIOCGWINSZ
+ #include <sys/ioctl.h>
+ #include <unistd.h>
+#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 <tavianator@gmail.com> *
+ * *
+ * 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 <http://www.gnu.org/licenses/>. *
+ *************************************************************************/
+
+#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 <sys/ioctl.h>
+#include "platform.h"
#include <stdarg.h>
#include <stdio.h>
-#include <unistd.h>
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);