Patchwork [Fortran] Detecting the terminal width

login
register
mail settings
Submitter Mikael Morin
Date June 1, 2013, 3:33 p.m.
Message ID <51AA143B.7080401@sfr.fr>
Download mbox | patch
Permalink /patch/248082/
State New
Headers show

Comments

Mikael Morin - June 1, 2013, 3:33 p.m.
Le 01/06/2013 10:42, Janus Weil a écrit :
> Ok. Unfortunately I'm not much of a autoconf hero (better to say: not
> at all).
Any person using autoconf is some of a hero. ;-)

> I can not test it on my system with --enable-maintainer-mode
> because I get:
> 
> configure.ac:2: error: Please use exactly Autoconf 2.64 instead of 2.69.
> 
> Why on earth does GCC require an old autoconf version?
There is an answer here:
http://gcc.gnu.org/ml/gcc-help/2011-01/msg00248.html

The bottom line is:
GCC versions the generated files, so require exactly one autoconf.
And I suppose it just hasn't been updated to require the latest one.


> New patch attached ...
Tobias doesn't seem to argue (too much) against it, so OK.

Attached is what I get with autoconf-2.64/automake-1.11.1


Thanks
Mikael
Janus Weil - June 1, 2013, 7:16 p.m.
>> Ok. Unfortunately I'm not much of a autoconf hero (better to say: not
>> at all).
> Any person using autoconf is some of a hero. ;-)

Totally ...


>> I can not test it on my system with --enable-maintainer-mode
>> because I get:
>>
>> configure.ac:2: error: Please use exactly Autoconf 2.64 instead of 2.69.
>>
>> Why on earth does GCC require an old autoconf version?
> There is an answer here:
> http://gcc.gnu.org/ml/gcc-help/2011-01/msg00248.html

Yes, I also found this in the meantime.


> The bottom line is:
> GCC versions the generated files, so require exactly one autoconf.
> And I suppose it just hasn't been updated to require the latest one.

Makes sense somehow, although it is pretty inconvenient.


>> New patch attached ...
> Tobias doesn't seem to argue (too much) against it, so OK.

Thanks. Committed as r199585:

http://gcc.gnu.org/viewcvs/gcc?view=revision&revision=199585

Cheers,
Janus

Patch

Index: config.in
===================================================================
--- config.in	(révision 199575)
+++ config.in	(copie de travail)
@@ -199,6 +199,12 @@ 
 #endif
 
 
+/* Define to 1 if `TIOCGWINSZ' requires <sys/ioctl.h>. */
+#ifndef USED_FOR_TARGET
+#undef GWINSZ_IN_SYS_IOCTL
+#endif
+
+
 /* mcontext_t fields start with __ */
 #ifndef USED_FOR_TARGET
 #undef HAS_MCONTEXT_T_UNDERSCORES
@@ -1247,7 +1253,7 @@ 
 #endif
 
 
-/* Define if your AIX linker supports a large TOC. */
+/* Define if your PowerPC64 linker supports a large TOC. */
 #ifndef USED_FOR_TARGET
 #undef HAVE_LD_LARGE_TOC
 #endif
Index: configure
===================================================================
--- configure	(révision 199575)
+++ configure	(copie de travail)
@@ -8293,6 +8293,66 @@  $as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h
 
 fi
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether termios.h defines TIOCGWINSZ" >&5
+$as_echo_n "checking whether termios.h defines TIOCGWINSZ... " >&6; }
+if test "${ac_cv_sys_tiocgwinsz_in_termios_h+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <termios.h>
+#ifdef TIOCGWINSZ
+  yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then :
+  ac_cv_sys_tiocgwinsz_in_termios_h=yes
+else
+  ac_cv_sys_tiocgwinsz_in_termios_h=no
+fi
+rm -f conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_tiocgwinsz_in_termios_h" >&5
+$as_echo "$ac_cv_sys_tiocgwinsz_in_termios_h" >&6; }
+
+if test $ac_cv_sys_tiocgwinsz_in_termios_h != yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether sys/ioctl.h defines TIOCGWINSZ" >&5
+$as_echo_n "checking whether sys/ioctl.h defines TIOCGWINSZ... " >&6; }
+if test "${ac_cv_sys_tiocgwinsz_in_sys_ioctl_h+set}" = set; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#ifdef TIOCGWINSZ
+  yes
+#endif
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "yes" >/dev/null 2>&1; then :
+  ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=yes
+else
+  ac_cv_sys_tiocgwinsz_in_sys_ioctl_h=no
+fi
+rm -f conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&5
+$as_echo "$ac_cv_sys_tiocgwinsz_in_sys_ioctl_h" >&6; }
+
+  if test $ac_cv_sys_tiocgwinsz_in_sys_ioctl_h = yes; then
+
+$as_echo "#define GWINSZ_IN_SYS_IOCTL 1" >>confdefs.h
+
+  fi
+fi
+
 for ac_header in limits.h stddef.h string.h strings.h stdlib.h time.h iconv.h \
 		 fcntl.h unistd.h sys/file.h sys/time.h sys/mman.h \
 		 sys/resource.h sys/param.h sys/times.h sys/stat.h \
@@ -17834,7 +17894,7 @@  else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 17837 "configure"
+#line 17897 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -17940,7 +18000,7 @@  else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 17943 "configure"
+#line 18003 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
Index: configure.ac
===================================================================
--- configure.ac	(révision 199575)
+++ configure.ac	(copie de travail)
@@ -939,6 +939,7 @@  AC_HEADER_STDC
 AC_HEADER_TIME
 ACX_HEADER_STRING
 AC_HEADER_SYS_WAIT
+AC_HEADER_TIOCGWINSZ
 AC_CHECK_HEADERS(limits.h stddef.h string.h strings.h stdlib.h time.h iconv.h \
 		 fcntl.h unistd.h sys/file.h sys/time.h sys/mman.h \
 		 sys/resource.h sys/param.h sys/times.h sys/stat.h \
Index: fortran/error.c
===================================================================
--- fortran/error.c	(révision 199575)
+++ fortran/error.c	(copie de travail)
@@ -30,6 +30,15 @@  along with GCC; see the file COPYING3.  If not see
 #include "flags.h"
 #include "gfortran.h"
 
+#ifdef HAVE_TERMIOS_H
+# include <termios.h>
+#endif
+
+#ifdef GWINSZ_IN_SYS_IOCTL
+# include <sys/ioctl.h>
+#endif
+
+
 static int suppress_errors = 0;
 
 static int warnings_not_errors = 0; 
@@ -59,9 +68,26 @@  gfc_pop_suppress_errors (void)
 }
 
 
+/* Determine terminal width (for trimming source lines in output).  */
+
 static int
 get_terminal_width (void)
 {
+  /* Only limit the width if we're outputting to a terminal.  */
+#ifdef HAVE_UNISTD_H
+  if (!isatty (STDERR_FILENO))
+    return INT_MAX;
+#endif
+  
+  /* Method #1: Use ioctl (not available on all systems).  */
+#ifdef TIOCGWINSZ
+  struct winsize w;
+  w.ws_col = 0;
+  if (ioctl (0, TIOCGWINSZ, &w) == 0 && w.ws_col > 0)
+    return w.ws_col;
+#endif
+
+  /* Method #2: Query environment variable $COLUMNS.  */
   const char *p = getenv ("COLUMNS");
   if (p)
     {
@@ -69,7 +95,8 @@  get_terminal_width (void)
       if (value > 0)
 	return value;
     }
-  /* Use a reasonable default.  */
+
+  /* If both fail, use reasonable default.  */
   return 80;
 }