m4-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

split -E functionality


From: Eric Blake
Subject: split -E functionality
Date: Fri, 2 Feb 2007 02:49:01 +0000 (UTC)
User-agent: Loom/3.14 (http://gmane.org/)

Based on Ralf's complaint[1], I decided that the 1.4.8 meaning of -E does two 
independently useful things - turns warnings into errors, and quits execution 
on the first warning.  This patch makes that distinction explicit in 1.4.9 - 
you must use -EE instead of -E to get the old behavior, and the new behavior 
of -E is friendlier to detecting non-portable macro definitions via --warn-
syntax.

[1] http://lists.gnu.org/archive/html/autoconf-patches/2007-01/msg00136.html

2007-02-01  Eric Blake  <address@hidden>

        * src/m4.c (fatal_warnings): New variable.
        (usage): Document new -E behavior.
        (main): Make -E an additive option.
        (m4_error, m4_error_at_line): Change exit status when required.
        * NEWS: Document this change.
        * doc/m4.texinfo (Operation modes): Likewise.
        Reported by Ralf Wildenhues.

Index: NEWS
===================================================================
RCS file: /sources/m4/m4/NEWS,v
retrieving revision 1.1.1.1.2.91
diff -u -r1.1.1.1.2.91 NEWS
--- NEWS        28 Jan 2007 01:54:36 -0000      1.1.1.1.2.91
+++ NEWS        1 Feb 2007 19:14:18 -0000
@@ -15,6 +15,11 @@
   of variable assignment as an extension.
 * The `include' builtin now affects exit status on failure, as required by
   POSIX.  Use `sinclude' if you need a successful exit status.
+* The `-E'/`--fatal-warnings' command-line option now has two levels.  When
+  specified only once, warnings affect exit status, but execution
+  continues, so that you can see all warnings instead of fixing them one
+  at a time.  To acheive 1.4.8 behavior, where the first warning
+  immediately exits, specify -E twice on the command line.
 * A new `--warn-syntax' command-line option allows detection of
   non-portable syntax that might be broken when upgrading to M4 2.0.  For
   example, POSIX requires a macro definition containing `$11' to expand to
Index: doc/m4.texinfo
===================================================================
RCS file: /sources/m4/m4/doc/m4.texinfo,v
retrieving revision 1.1.1.1.2.109
diff -u -r1.1.1.1.2.109 m4.texinfo
--- doc/m4.texinfo      28 Jan 2007 01:54:43 -0000      1.1.1.1.2.109
+++ doc/m4.texinfo      1 Feb 2007 19:14:18 -0000
@@ -551,8 +551,14 @@
 
 @item -E
 @itemx --fatal-warnings
-Stop execution and exit @code{m4} once the first warning or error has
-been issued, considering all of them to be fatal.
+Controls the effect of warnings.  If unspecified, then execution
+continues and exit status is unaffected when a warning is printed.  If
+specified exactly once, warnings become fatal; when one is issued,
+execution continues, but the exit status will be non-zero.  If specified
+multiple times, then execution halts with non-zero status the first time
+a warning is issued.  The introduction of behavior levels is new to M4
+1.4.9; for behavior consistent with earlier versions, you should specify
address@hidden twice.
 
 @item -i
 @itemx --interactive
Index: src/m4.c
===================================================================
RCS file: /sources/m4/m4/src/Attic/m4.c,v
retrieving revision 1.1.1.1.2.42
diff -u -r1.1.1.1.2.42 m4.c
--- src/m4.c    28 Jan 2007 01:54:44 -0000      1.1.1.1.2.42
+++ src/m4.c    1 Feb 2007 19:14:18 -0000
@@ -52,6 +52,9 @@
 /* Suppress warnings about missing arguments.  */
 int suppress_warnings = 0;
 
+/* If true, then warnings affect exit status.  */
+static bool fatal_warnings = false;
+
 /* If not zero, then value of exit status for warning diagnostics.  */
 int warning_status = 0;
 
@@ -69,6 +72,10 @@
 /* The name this program was run with. */
 const char *program_name;
 
+/* Global catchall for any errors that should affect final error status, but
+   where we try to continue execution in the meantime.  */
+int retcode;
+
 struct macro_definition
 {
   struct macro_definition *next;
@@ -90,6 +97,8 @@
   va_start (args, format);
   verror_at_line (status, errnum, current_line ? current_file : NULL,
                  current_line, format, args);
+  if (fatal_warnings && ! retcode)
+    retcode = EXIT_FAILURE;
 }
 
 /*-------------------------------.
@@ -103,6 +112,8 @@
   va_list args;
   va_start (args, format);
   verror_at_line (status, errnum, line ? file : NULL, line, format, args);
+  if (fatal_warnings && ! retcode)
+    retcode = EXIT_FAILURE;
 }
 
 #ifdef USE_STACKOVF
@@ -147,7 +158,8 @@
       --version                output version information and exit\n\
 ", stdout);
       fputs ("\
-  -E, --fatal-warnings         stop execution after first warning\n\
+  -E, --fatal-warnings         once: warnings become errors, twice: stop\n\
+                               execution at first error\n\
   -i, --interactive            unbuffer output, ignore interrupts\n\
   -P, --prefix-builtins        force a `m4_' prefix to all builtins\n\
   -Q, --quiet, --silent        suppress some warnings for builtins\n\
@@ -265,10 +277,6 @@
   { NULL, 0, NULL, 0 },
 };
 
-/* Global catchall for any errors that should affect final error status, but
-   where we try to continue execution in the meantime.  */
-int retcode;
-
 /* Process a command line file NAME, and return true only if it was
    stdin.  */
 static bool
@@ -388,7 +396,10 @@
        break;
 
       case 'E':
-       warning_status = EXIT_FAILURE;
+       if (! fatal_warnings)
+         fatal_warnings = true;
+       else
+         warning_status = EXIT_FAILURE;
        break;
 
       case 'F':
@@ -543,8 +554,7 @@
          break;
 
        default:
-         M4ERROR ((warning_status, 0,
-                   "INTERNAL ERROR: bad code in deferred arguments"));
+         M4ERROR ((0, 0, "INTERNAL ERROR: bad code in deferred arguments"));
          abort ();
        }
 






reply via email to

[Prev in Thread] Current Thread [Next in Thread]