From c9db45aaf49be681ba6e16203ab4b455bfa9746e Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Thu, 11 Dec 2014 09:20:24 +0100 Subject: [PATCH] diagnostic.c (get_terminal_width): Renamed from MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 2014-12-11 Tobias Burnus Manuel López-Ibáñez gcc/ * diagnostic.c (get_terminal_width): Renamed from * getenv_columns, removed static, and additionally use ioctl to get width. (diagnostic_set_caret_max_width): Update call. * diagnostic.h (get_terminal_width): Add prototype. * opts.c (print_specific_help): Use it for x_help_columns. * doc/invoke.texi (fdiagnostics-show-caret): Document how the width is set. gcc/fortran/ * error.c (gfc_get_terminal_width): Renamed from get_terminal_width and use same-named common function. (gfc_error_init_1): Update call. Co-Authored-By: Manuel López-Ibáñez From-SVN: r218619 --- gcc/ChangeLog | 7 +++++++ gcc/diagnostic.c | 25 +++++++++++++++++++++---- gcc/diagnostic.h | 2 ++ gcc/doc/invoke.texi | 5 ++++- gcc/fortran/ChangeLog | 11 +++++++++++ gcc/fortran/error.c | 38 +++----------------------------------- gcc/opts.c | 14 ++------------ 7 files changed, 50 insertions(+), 52 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2d0f06e3ff2..fae08cb7ace 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-12-11 Tobias Burnus + Manuel López-Ibáñez + + * error.c (gfc_get_terminal_width): Renamed from + get_terminal_width and use same-named common function. + (gfc_error_init_1): Update call. + 2014-12-10 Ulrich Drepper Minor interface cleanups of libgccjit diff --git a/gcc/diagnostic.c b/gcc/diagnostic.c index 28ef81c5dad..2c2477f2488 100644 --- a/gcc/diagnostic.c +++ b/gcc/diagnostic.c @@ -33,6 +33,14 @@ along with GCC; see the file COPYING3. If not see #include "diagnostic.h" #include "diagnostic-color.h" +#ifdef HAVE_TERMIOS_H +# include +#endif + +#ifdef GWINSZ_IN_SYS_IOCTL +# include +#endif + #include // For placement new. #define pedantic_warning_kind(DC) \ @@ -83,9 +91,10 @@ file_name_as_prefix (diagnostic_context *context, const char *f) /* Return the value of the getenv("COLUMNS") as an integer. If the - value is not set to a positive integer, then return INT_MAX. */ -static int -getenv_columns (void) + value is not set to a positive integer, use ioctl to get the + terminal width. If it fails, return INT_MAX. */ +int +get_terminal_width (void) { const char * s = getenv ("COLUMNS"); if (s != NULL) { @@ -93,6 +102,14 @@ getenv_columns (void) if (n > 0) return n; } + +#ifdef TIOCGWINSZ + struct winsize w; + w.ws_col = 0; + if (ioctl (0, TIOCGWINSZ, &w) == 0 && w.ws_col > 0) + return w.ws_col; +#endif + return INT_MAX; } @@ -103,7 +120,7 @@ diagnostic_set_caret_max_width (diagnostic_context *context, int value) /* One minus to account for the leading empty space. */ value = value ? value - 1 : (isatty (fileno (pp_buffer (context->printer)->stream)) - ? getenv_columns () - 1: INT_MAX); + ? get_terminal_width () - 1: INT_MAX); if (value <= 0) value = INT_MAX; diff --git a/gcc/diagnostic.h b/gcc/diagnostic.h index 3c4906a31f5..0c65deb947f 100644 --- a/gcc/diagnostic.h +++ b/gcc/diagnostic.h @@ -297,6 +297,8 @@ void diagnostic_set_caret_max_width (diagnostic_context *context, int value); void diagnostic_file_cache_fini (void); +int get_terminal_width (void); + /* Expand the location of this diagnostic. Use this function for consistency. */ static inline expanded_location diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 1579702e20a..eb9a64dc9ba 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -3188,7 +3188,10 @@ option is known to the diagnostic machinery). Specifying the @opindex fdiagnostics-show-caret By default, each diagnostic emitted includes the original source line and a caret '^' indicating the column. This option suppresses this -information. +information. The source line is truncated to @var{n} characters, if +the @option{-fmessage-length=n} is given. When the output is done +to the terminal, the width is limited to the width given by the +@env{COLUMNS} environment variable or, if not set, to the terminal width. @end table diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index cce403611ae..8534a453ab1 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,14 @@ +2014-12-11 Tobias Burnus + Manuel López-Ibáñez + + * diagnostic.c (get_terminal_width): Renamed from getenv_columns, + removed static, and additionally use ioctl to get width. + (diagnostic_set_caret_max_width): Update call. + * diagnostic.h (get_terminal_width): Add prototype. + * opts.c (print_specific_help): Use it for x_help_columns. + * doc/invoke.texi (fdiagnostics-show-caret): Document how the + width is set. + 2014-12-10 Bernd Edlinger PR fortran/60718 diff --git a/gcc/fortran/error.c b/gcc/fortran/error.c index a93c7f903fb..851ba90ab10 100644 --- a/gcc/fortran/error.c +++ b/gcc/fortran/error.c @@ -30,14 +30,6 @@ along with GCC; see the file COPYING3. If not see #include "flags.h" #include "gfortran.h" -#ifdef HAVE_TERMIOS_H -# include -#endif - -#ifdef GWINSZ_IN_SYS_IOCTL -# include -#endif - #include "diagnostic.h" #include "diagnostic-color.h" #include "tree-diagnostic.h" /* tree_diagnostics_defaults */ @@ -83,33 +75,9 @@ gfc_pop_suppress_errors (void) /* Determine terminal width (for trimming source lines in output). */ static int -get_terminal_width (void) +gfc_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) - { - int value = atoi (p); - if (value > 0) - return value; - } - - /* If both fail, use reasonable default. */ - return 80; + return isatty (STDERR_FILENO) ? get_terminal_width () : INT_MAX; } @@ -118,7 +86,7 @@ get_terminal_width (void) void gfc_error_init_1 (void) { - terminal_width = get_terminal_width (); + terminal_width = gfc_get_terminal_width (); errors = 0; warnings = 0; gfc_buffer_error (false); diff --git a/gcc/opts.c b/gcc/opts.c index 1b4f97e28d0..34a42a57ddd 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -1231,18 +1231,8 @@ print_specific_help (unsigned int include_flags, the desired maximum width of the output. */ if (opts->x_help_columns == 0) { - const char *p; - - p = getenv ("COLUMNS"); - if (p != NULL) - { - int value = atoi (p); - - if (value > 0) - opts->x_help_columns = value; - } - - if (opts->x_help_columns == 0) + opts->x_help_columns = get_terminal_width (); + if (opts->x_help_columns == INT_MAX) /* Use a reasonable default. */ opts->x_help_columns = 80; } -- 2.30.2