m4-patches
[Top][All Lists]
Advanced

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

Re: POSIX behavior of eval


From: Eric Blake
Subject: Re: POSIX behavior of eval
Date: Wed, 28 Feb 2007 21:30:46 +0000 (UTC)
User-agent: Loom/3.14 (http://gmane.org/)

Eric Blake <ebb9 <at> byu.net> writes:

> The Austin Group approved XCU ERN 118:

They also approved XCU ERN 137.  This patch has some code cleanups that I 
noticed while implementing ${1} semantics and porting --warn-macro-sequence 
from the branch, I'm committing this to reduce the size of that patch.  main.c 
is listed in diff -b, since I changed some indenting.

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

        POSIX XCU ERN 137 was approved.
        * modules/mpeval.c (numb_extension): Delete.
        * modules/m4.c (numb_extension): Likewise.
        * modules/evalparse.c (comma_term, condition_term): Always
        implement ?: and , operators.
        * m4/symtab.c: Update comment to match reality.
        * src/freeze.c (produce_frozen_state, reload_frozen_state): Avoid
        dereferencing context directly when accessor exists.
        * src/main.c (usage): Prefer GNU_M4 over EMACS.
        (struct macro_definition): Rename...
        (struct deferred): ...to match usage.  All uses changed.
        * doc/m4.texinfo (Eval): Document this change.
        (Operation modes, Changeresyntax): Fix wording to prefer GNU_M4
        over emacs.
        (Preprocessor features, Changesyntax): Fix inaccuracies.
        * NEWS: Import branch NEWS items for 1.4.x series.  Document
        change in eval.

Index: NEWS
===================================================================
RCS file: /sources/m4/m4/NEWS,v
retrieving revision 1.39
diff -u -r1.39 NEWS
--- NEWS        28 Feb 2007 14:36:22 -0000      1.39
+++ NEWS        28 Feb 2007 21:24:37 -0000
@@ -103,12 +103,12 @@
     regular expression flavor, to match `-r'/`--regexp-syntax' command-line
     option.
 
-*** New `debuglen' builtin is introduced which allows runtime setting of
-    debug output length, previously controlled only by the `-l' command
-    line argument.  Additionally, whether using the new macro or the
-    command line argument, the length limitation now affects dumpdef output
-    as well as trace output, undergoes argument validation, and accepts an
-    optional multiplier suffix.
+*** New `debuglen' builtin allows runtime setting of debug output length,
+    previously controlled only by the `-l' command line argument.
+    Additionally, whether using the new macro or the command line argument,
+    the length limitation now affects dumpdef output as well as trace
+    output, undergoes argument validation, and accepts an optional
+    multiplier suffix.
   - FIXME the multiplier suffix isn't reliable yet
 
 *** New `mkdtemp' builtin parallels `mkstemp', but allows the creation of
@@ -162,8 +162,7 @@
     macro.
 
 *** The `eval' and `mpeval' builtins now support the following new
-    operators: `>>>', `\', `?:', and  `,'.  However, when complying
-    strictly with POSIX, `?:' and `,' are rejected inside `eval'.
+    operators: `>>>', `\', `?:', and  `,'.
 
 *** The `maketemp' builtin now always warns that it is obsolete, even in GNU
     mode where it uses the same secure algorithm as `mkstemp', because of
@@ -192,13 +191,329 @@
   - FIXME: format 2 still needs to catch more missing state; once 2.0 is
     released, any further changes would introduce format 3.
 
-FIXME: include the (long) list of changes in 1.4.x that were not already
-  in earlier betas.
-* Version 1.4.9
-* Version 1.4.8
-* Version 1.4.7
-* Version 1.4.6
-* Version 1.4.5
+*** Improvements made in the 1.4.x stable series have been incorporated.
+
+* Version 1.4.9 - ?? ??? 2007, by ???  (CVS version 1.4.8c)
+
+** Minor documentation and portability cleanups.
+
+* Version 1.4.8b - 24 Feb 2007, by Eric Blake  (CVS version 1.4.8a)
+
+** Fix a regression introduced in 1.4.8 that made m4 unable to process
+   files larger than 2GiB on some platforms.
+
+** Fix a regression introduced in 1.4.8 that made m4 dump core when
+   invoked as 'm4 -- file'.
+
+** The `eval' builtin now follows C precedence rules.  Additionally, the
+   short-circuit operators correctly short-circuit division by zero.  The
+   previously undocumented alias of '=' meaning '==' in eval now triggers a
+   deprecation warning, so that a future version of M4 can implement a form
+   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-macro-sequence' command-line option allows detection of
+   sequences in `define' and `pushdef' definitions that match an optional
+   regular expression.  The default regular expression is
+   `\$\({[^}]*}\|[0-9][0-9]+\)', corresponding to the sequences that might
+   not behave correctly when upgrading to the eventual M4 2.0.  By default,
+   M4 2.0 will follow the POSIX requirement that a macro definition
+   containing `$11' must expand to the first argument concatenated with 1,
+   rather than the eleventh argument; and will take advantage of the POSIX
+   wording that allows implementations to treat `${11}' as the eleventh
+   argument instead of literal text.  Be aware that Autoconf 2.61 will not
+   work with this option enabled with the default regular expression; but
+   Autoconf 2.62 will be compatible with this option.
+
+** Improved portability to platforms such as BSD/OS and AIX.
+
+* Version 1.4.8 - 20 November 2006, by Eric Blake  (CVS version 1.4.7a)
+
+** The `divert' macro and `-H'/`--hashsize' command line option no longer
+   cause a core dump when handed extra large values.  Also, `divert' now
+   uses memory proportional to the number of diversions in use, rather than
+   to the maximum diversion number encountered, so that large diversion
+   numbers are less likely to exhaust system memory; and is no longer
+   limited by the maximum number of file descriptors.
+
+** The `--help' and `--version' command line options now consistently
+   override all earlier options.  For example, `m4 --debugfile=trace
+   --help' now no longer accidentally creates an empty file `trace'.
+
+** The `-L'/`--nesting-limit' command line option can now be set to 0
+   to remove the default limit of 1024.  However, it is still possible that
+   heavily nested input can cause abrupt program termination due to stack
+   overflow.
+
+** Problems encountered when writing to standard error, such as with the
+   `errprint' macro, now always cause a non-zero exit status.
+
+** Warnings and errors issued during macro expansion are now consistently
+   reported at the line where the macro name was detected, rather than
+   where the close parenthesis resides.  Text wrapped by `m4wrap' now
+   remembers the location that was in effect when m4wrap was invoked,
+   rather than changing to line 0 and the empty string for a file.  The
+   macros `__line__' and `__file__' now work correctly even as the last
+   token in an included file.
+
+** The `builtin' and `indir' macros now transparently handle builtin
+   tokens generated by `defn'.
+
+** When diversions created by the `divert' macro collect enough text that
+   M4 must use temporary files, the environment variable $TMPDIR is now
+   consulted, and a better effort is made to clean up those files in the
+   event of a fatal signal.
+
+** The `mkstemp' builtin is added with the same GNU semantics as `maketemp',
+   based on the recommendation of POSIX to deprecate the POSIX semantics of
+   `maketemp' as inherently insecure.  In GNU mode (no -G supplied on the
+   command line), `maketemp' silently retains the secure GNU semantics, but
+   a future release of M4 will change this to emit a warning.  In
+   traditional mode (m4 -G), `maketemp' now uses the POSIX-mandated
+   insecure semantics, and issues a warning that you should convert your
+   script to use `mkstemp' instead.  Additionally, `mkstemp' and `maketemp'
+   are now well-defined even if the template argument does not end in six
+   `X' characters.
+
+** The manual has been improved, including a new section on a composite
+   macro `foreach'.
+
+** The `changecom' and `changequote' macros now treat an empty second
+   argument the same as if it were missing, rather than using the empty
+   string and making it impossible to end a comment or quote.
+
+** The `translit' macro now operates in linear instead of quadratic time,
+   and is now eight-bit clean.
+
+** The `-D', `-U', `-s', and `-t' command line options now take effect
+   after any files encountered earlier on the command line, rather than up
+   front, as is done in traditional implementations and required by POSIX.
+
+* Version 1.4.7 - 25 September 2006, by Eric Blake  (CVS version 1.4.6a)
+
+** Fix regression from 1.4.5 in handling a file that ends in a macro
+   expansion without arguments instead of a newline.
+
+** The define and pushdef macros now warn when the first argument is not
+   a string, rather than silently doing nothing.
+
+** Standard input can now be read more than once, as in 'm4 - file -', and
+   is not closed until all wrapped text is handled.  This makes a
+   difference when stdin is not a regular file, and also fixes bugs when
+   using the syscmd or esyscmd macros from wrapped text.
+
+** When standard input is a seekable file, the m4exit, syscmd, and esyscmd
+   macros now restore the current position to the next unread byte rather
+   than discarding an arbitrary amount of buffered data.
+
+** SysV command-line compatibility is no longer a goal of GNU M4; the
+   focus will be instead on POSIX compatibility.  This release continues to
+   support previous usage, but adds warnings in areas which will allow a
+   future version of GNU M4 to use its own extensions without being tied to
+   the SysV command line interface.
+
+** The no-op compatibility command line options -B, -N, -S, -T, and
+   --diversions may be withdrawn or assigned new meanings in future
+   releases, so they now issue a warning if used.
+
+** A new command line option -i replaces the compatibility -e as the
+   short spelling of --interactive, for consistency with other GNU tools; a
+   warning is issued if the old spelling is used, and it may be assigned
+   new meaning in future releases.
+
+** A new command line option --debugfile replaces the options -o and
+   --error-output as the preferred spelling.  The old options were
+   misleading in their names and inconsistent with other GNU tools; they
+   are still silently accepted, but no longer documented in --help, and may
+   be assigned new meanings in future releases.
+
+* Version 1.4.6 - 25 August 2006, by Eric Blake  (CVS version 1.4.5a)
+
+** Fix buffer overruns in regexp and patsubst macros when handed a trailing
+   backslash in the replacement text, or when handling \n substitutions
+   beyond the number of \(\) groups.
+
+** Fix memory leak in regexp, patsubst, and changeword macros.
+
+** The format macro now understands %F, %g, and %G.
+
+** When loading frozen files, m4 now exits with status 63 if version
+   mismatch is detected.
+
+** Fix bugs that occurred when invoked with stdout or stderr closed,
+   and detect write failures to stdout or to the target of the debugfile
+   macro.  In particular, the syscmd and esyscmd macros can no longer
+   interfere with the debug stream or diversions.
+
+** The m4exit macro now converts values outside the range 0-255 to 1.
+
+** It is now an error if a command-line input file ends in the middle of a
+   comment, matching the behavior of mid-string and mid-argument
+   collection.
+
+** The dnl macro now warns if end of file is encountered instead of a
+   newline.
+
+** The error message when end of file is encountered now uses the file and
+   line where the dangling construct started, rather than `NONE:0:'.
+
+** The debugmode and __file__ macros, and the -s/--synclines option, now
+   show what directory a file was found in when the -I/--include option or
+   M4PATH variable had an effect.
+
+** The changequote and changecom macros now work with 8-bit characters, and
+   quotes and comments that begin with `(' are properly recognized
+   following a word.
+
+** The new macro __program__ is added, which allows the input file to issue
+   an error message that resembles messages from m4.  Warning and error
+   messages have been reformatted to comply with GNU Coding Standards.
+
+** The errprint, m4wrap, and shift macros are now recognized only with
+   arguments.
+
+** The index, substr, translit, regexp, and patsubst macros now produce
+   output when given only one argument, but still warn about a missing
+   second argument.
+
+** The patsubst macro now reliably finds zero-length matches at the end
+   of a string.
+
+* Version 1.4.5 - 15 July 2006, by Eric Blake  (CVS version 1.4.4c)
+
+** Fix sysval on BeOS, OS/2, and other systems that store exit status
+   in the low-order byte.  Additionally, on Unix platforms, if syscmd was
+   terminated by a signal, sysval now displays the signal number shifted
+   left by eight bits, to match traditional m4 implementations.
+
+** The maketemp macro is no longer subject to platform limitations (such as
+   26 or 32 max files from a given template).
+
+** Frozen files now require that the first directive be V (version), to
+   better diagnose version mismatch.  Additionally, if the F directive
+   (builtin function) names an unknown builtin that existed in the m4 that
+   froze the file but not in the current m4 (for example, changeword), the
+   warning is deferred until an attempt is made to actually use the
+   builtin.  This allows downgrading from beta m4-1.4o to stable m4-1.4.5
+   without breaking autoconf.
+
+** The format and indir macros are now recognized only with arguments.
+
+** The eval macro no longer crashes on x86 architectures when dividing the
+   minimum integer by -1.
+
+** On systems with ecvt and fcvt, format no longer truncates trailing
+   zeroes on integers printed with %.0f.  On systems without these
+   functions, format is no longer subject to a buffer overflow that
+   permitted arbitrary code execution.
+
+** On native Windows builds, the macro __windows__ is provided instead of
+   __unix__.  Likewise, on OS/2 builds, the macro __os2__ is provided.
+   This allows input files to determine when syscmd might behave
+   differently.
+
+** Fix bug in 1.4.3 patch to use \n line-endings that did not work for
+   cygwin.
+
+** When given the empty string or 0, undivert is now documented as a no-op
+   rather than closing stdout, warning about a non-existent file, or trying
+   to read a directory as a file.
+
+** Many documentation improvements.  Also, the manual is now distributed
+   under FDL 1.2, rather than a stricter verbatim-only license.
+
+** Raise the -L (--nesting-limit) command line option limit from 250 to
+   1024.
+
+** The decr, incr, divert, m4exit, and substr macros treat an empty number
+   as 0, issue a warning, and expand as normal; rather than issuing an
+   error and expanding to the empty string.
+
+** The eval macro now treats an empty radix argument as 10, handles radix 1,
+   and treats the width argument as number of digits excluding the sign,
+   for compatibility with other m4 implementations.
+
+** The ifdef, divert, m4exit, substr, and translit macros now correctly
+   ignore extra arguments.
+
+** The popdef and undefine macros now correctly accept multiple arguments.
+
+** Although changeword is on its last leg, if enabled, it now reverts to the
+   default (faster) regexp when passed the empty string.
+
+** The regexp and substr macros now warn and ignore a trailing backslash in
+   the replacement, and warn on \n for n larger than the number of
+   sub-expressions in the regexp.
+
+* Version 1.4.4b - 17 June 2006, by Eric Blake  (CVS version 1.4.4a)
+
+** Fix a recursive push_string crashing bug, which affected changequote of
+   three or more characters on some compilers.
+
+** Use automake to fix build portability issues.
+
+** Fix a recursive m4wrap crashing bug.
+
+** Fix a 1 in 2**32 hash crashing bug.
+
+** Tracing a macro by name is now persistent, even if the macro is
+   subsequently undefined or redefined.  The traceon and traceoff macros no
+   longer warn about undefined symbols.  This solves a crash when using
+   indir on an undefined macro traced with the -t option, as well as an
+   incorrect result of ifdef.  Furthermore, tracing is no longer
+   transferred with builtins, solving the bug of "m4 -tm4_eval" failing to
+   give trace output on the input
+   "define(`m4_eval',defn(`eval'))m4_eval(1)".
+
+** Fix a crash when a macro is undefined while collecting its arguments, by
+   always using the definition that was in effect before argument
+   collection.  This behavior matches the C pre-processor, and means that
+   the sequence "define(`f',`1')f(define(`f',`2'))f" is now documented to
+   result in "12", rather than the previously undocumented "22".
+
+** Update the regex engine to fix several bugs.
+
+** Fix a potential crash on machines where char is signed.
+
+* Version 1.4.4 - October 2005, by Gary V. Vaughan
+
+** ./configure --infodir=/usr/share/info now works correctly.
+
+** When any file named on the command line is missing exit with status 1.
+
+* Version 1.4.3 - March 2005, by Gary V. Vaughan
+
+** DESTDIR installs now work correctly.
+
+** Don't segfault with uncompilable regexps to changeword().
+
+** Always use \n line-endings for frozen files (fixes a Windows bug).
+
+** Portability fix for systems lacking mkstemp(3).
+
+** Approximately 20% speed up in the common case of usage with autoconf.
+
+** Supported on QNX 6.3.
+
+* Version 1.4.2 - August 2004, by Paul Eggert
+
+** No user visible changes; portability bug fixes only.
+
+* Version 1.4.1 - June 2004, by Paul Eggert
+
+** The 1.4.x series is intended to be stable; features added in 1.4[a-q]
+   were not backported to 1.4.x unless specifically mentioned above.
+
+** maketemp now creates an empty file with the given name, instead of merely
+   returning the name of a nonexistent file.  This closes a security hole.
 
 * Version beta 1.4q - August 2001, by Gary V. Vaughan
 
@@ -355,13 +670,6 @@
 
 *** All 8-bit characters can now be used for quotes.
 
-FIXME: include the (long) list of changes in 1.4.x that were not already
-  in earlier betas.
-* Version 1.4.4
-* Version 1.4.3
-* Version 1.4.2
-* Version 1.4.1
-
 * Version 1.4 - October 1994, by Franc,ois Pinard
 
 ** (No user visible changes)
Index: src/freeze.c
===================================================================
RCS file: /sources/m4/m4/src/freeze.c,v
retrieving revision 1.61
diff -u -r1.61 freeze.c
--- src/freeze.c        25 Feb 2007 23:19:32 -0000      1.61
+++ src/freeze.c        28 Feb 2007 21:24:37 -0000
@@ -239,12 +239,12 @@
       || strcmp (m4_get_syntax_rquote (M4SYNTAX), DEF_RQUOTE))
     {
       fprintf (file, "Q%lu,%lu\n",
-              (unsigned long int) context->syntax->lquote.length,
-              (unsigned long int) context->syntax->rquote.length);
-      produce_mem_dump (file, context->syntax->lquote.string,
-                       context->syntax->lquote.length);
-      produce_mem_dump (file, context->syntax->rquote.string,
-                       context->syntax->rquote.length);
+              (unsigned long int) M4SYNTAX->lquote.length,
+              (unsigned long int) M4SYNTAX->rquote.length);
+      produce_mem_dump (file, M4SYNTAX->lquote.string,
+                       M4SYNTAX->lquote.length);
+      produce_mem_dump (file, M4SYNTAX->rquote.string,
+                        M4SYNTAX->rquote.length);
       fputc ('\n', file);
     }
 
@@ -254,12 +254,10 @@
       || strcmp (m4_get_syntax_ecomm (M4SYNTAX), DEF_ECOMM))
     {
       fprintf (file, "C%lu,%lu\n",
-              (unsigned long int) context->syntax->bcomm.length,
-              (unsigned long int) context->syntax->ecomm.length);
-      produce_mem_dump (file, context->syntax->bcomm.string,
-                       context->syntax->bcomm.length);
-      produce_mem_dump (file, context->syntax->ecomm.string,
-                       context->syntax->ecomm.length);
+              (unsigned long int) M4SYNTAX->bcomm.length,
+              (unsigned long int) M4SYNTAX->ecomm.length);
+      produce_mem_dump (file, M4SYNTAX->bcomm.string, M4SYNTAX->bcomm.length);
+      produce_mem_dump (file, M4SYNTAX->ecomm.string, M4SYNTAX->ecomm.length);
       fputc ('\n', file);
     }
 
@@ -495,7 +493,7 @@
        m4__module_open (context, "gnu", NULL);
       /* Disable { and } categories, since ${11} was not supported in
          1.4.x.  */
-      m4_set_syntax (context->syntax, 'O', '+', "{}");
+      m4_set_syntax (M4SYNTAX, 'O', '+', "{}");
       break;
     default:
       if (version > 2)
@@ -646,7 +644,7 @@
 
          /* Syntax under M4_SYNTAX_MASKS is handled specially; all
             other characters are additive.  */
-         if ((m4_set_syntax (context->syntax, syntax,
+         if ((m4_set_syntax (M4SYNTAX, syntax,
                              (m4_syntax_code (syntax) & M4_SYNTAX_MASKS
                               ? '=' : '+'), string[0]) < 0)
              && (syntax != '\0'))
Index: doc/m4.texinfo
===================================================================
RCS file: /sources/m4/m4/doc/m4.texinfo,v
retrieving revision 1.97
diff -u -r1.97 m4.texinfo
--- doc/m4.texinfo      28 Feb 2007 14:36:22 -0000      1.97
+++ doc/m4.texinfo      28 Feb 2007 21:24:37 -0000
@@ -655,11 +655,12 @@
 @item address@hidden@address@hidden
 @itemx address@hidden@address@hidden
 Set the regular expression syntax according to @var{RESYNTAX-SPEC}.
-When this option is not given, @var{RESYNTAX-SPEC} is omitted,
address@hidden M4 uses emacs compatible regular expressions.
address@hidden, for more details on the format and meaning of
address@hidden  This option may be given more than once, and order
-with respect to file names is significant.
+When this option is not given, or @var{RESYNTAX-SPEC} is omitted,
address@hidden M4 uses the flavor @code{GNU_M4}, which provides
+emacs-compatible regular expressions.  @xref{Changeresyntax}, for more
+details on the format and meaning of @var{RESYNTAX-SPEC}.  This option
+may be given more than once, and order with respect to file names is
+significant.
 
 @item --safer
 Cripple the following builtins, since each can perform potentially
@@ -735,13 +736,12 @@
 
 @item -D @address@hidden@address@hidden
 @itemx address@hidden@address@hidden@r{]}
-This enters @var{NAME} into the symbol table, before any input files are
-read.  If @address@hidden is missing, the value is taken to be the
-empty string.  The @var{VALUE} can be any string, and the macro can be
-defined to take arguments, just as if it was defined from within the
-input.  This option may be given more than once; order with respect to
-file names is significant, and redefining the same @var{NAME} loses the
-previous value.
+This enters @var{NAME} into the symbol table.  If @address@hidden is
+missing, the value is taken to be the empty string.  The @var{VALUE} can
+be any string, and the macro can be defined to take arguments, just as
+if it was defined from within the input.  This option may be given more
+than once; order with respect to file names is significant, and
+redefining the same @var{NAME} loses the previous value.
 
 @item --import-environment
 Imports every variable in the environment as a macro.  This is done
@@ -763,13 +763,12 @@
 
 @item -p @address@hidden@address@hidden
 @itemx address@hidden@address@hidden@r{]}
-This enters @var{NAME} into the symbol table, before any input files are
-read.  If @address@hidden is missing, the value is taken to be the
-empty string.  The @var{VALUE} can be any string, and the macro can be
-defined to take arguments, just as if it was defined from within the
-input.  This option may be given more than once; order with respect to
-file names is significant, and redefining the same @var{NAME} adds
-another definition to its stack.
+This enters @var{NAME} into the symbol table.  If @address@hidden is
+missing, the value is taken to be the empty string.  The @var{VALUE} can
+be any string, and the macro can be defined to take arguments, just as
+if it was defined from within the input.  This option may be given more
+than once; order with respect to file names is significant, and
+redefining the same @var{NAME} adds another definition to its stack.
 
 @item -s
 @itemx --synclines
@@ -1924,6 +1923,20 @@
 @result{}1
 @end example
 
+Remember that @samp{#} defaults to the comment character; if you forget
+quotes to inhibit the comment behavior, your macro definition may not
+end where you expected.
+
address@hidden
+dnl Attempt to define a macro to just `$#'
+define(underquoted, $#)
+oops)
address@hidden
+underquoted
address@hidden)
address@hidden
address@hidden example
+
 The notation @code{$*} can be used in the expansion text to denote all
 the actual arguments, unquoted, with commas in between.  For example
 
@@ -4168,7 +4181,8 @@
 the value of @var{resyntax}, equivalent to passing @var{resyntax} as the
 argument to the command line option @option{--regexp-syntax}
 (@pxref{Operation modes, , Invoking m4}).  If @var{resyntax} is empty,
-the default flavor is reverted to emacs style.
+the default flavor is reverted to the @code{GNU_M4} style, compatible
+with emacs.
 
 @var{resyntax} can be any one of the values in the table below.  Case is
 not important, and @kbd{-} or @kbd{ } can be substituted for @kbd{_} in
@@ -4354,8 +4368,6 @@
 @comment FIXME - we should also consider supporting:
 @comment @item Ignore - characters that are ignored if they appear in
 @comment the input; perhaps defaulting to '\0', category 'I'.
address@hidden @item Assign -character used in macro definitions for default
address@hidden variables, category '='.
 @end table
 
 @noindent
@@ -4412,6 +4424,10 @@
 Argument separator
 @item $
 Dollar
address@hidden @{
+Left brace
address@hidden @}
+Right brace
 @item O
 Other
 @item @@
@@ -4428,8 +4444,6 @@
 End comment
 @comment @item I
 @comment Ignore
address@hidden @item =
address@hidden Assign
 @end table
 
 The remaining characters of each @var{syntax-spec} form the set of
@@ -6046,11 +6060,10 @@
 @end deffn
 
 All binary operators, except exponentiation, are left associative.  C
-operators that perform variable assignment, such as @samp{=} or
address@hidden, are forbidden by @acronym{POSIX}, since @code{eval} only
-operates on constants, not variables.  Attempting to use them results
-in an error.
address@hidden fixme If XCU ERN 137 is approved, then we could provide an
+operators that perform variable assignment, such as @samp{+=} or
address@hidden, are not implemented, since @code{eval} only operates on
+constants, not variables.  Attempting to use them results in an error.
address@hidden FIXME - since XCU ERN 137 is approved, we could provide an
 @comment extension that supported assignment operators.
 
 Note that some older @code{m4} implementations use @samp{^} as an
@@ -6122,6 +6135,7 @@
 which shifts in 0 bits rather than twos-complement sign-extension.  A
 ratio operator @samp{\} behaves like normal division @samp{/} on
 integers, but is provided for symmetry with @code{mpeval}.
+Additionally, the C operators @samp{,} and @samp{?:} are supported.
 
 @example
 eval(`2 ** 3 ** 2')
@@ -6146,40 +6160,18 @@
 @result{}1
 eval(`6 \ 3')
 @result{}2
address@hidden example
-
-Furthermore, when you do not use the @option{--traditional} command line
-option (or @option{-G}, @pxref{Limits control, , Invoking m4}), the C
-operators @samp{,} and @samp{?:} are supported.  But in traditional
-mode, @acronym{POSIX} requires that the use of these two operators cause
-an error.
-
address@hidden
-$ @kbd{m4}
-eval(`1?2:3')
+eval(`1 ? 2 : 3')
 @result{}2
-eval(`0?2:3')
+eval(`0 ? 2 : 3')
 @result{}3
-eval(`1?2:1/0')
+eval(`1 ? 2 : 1/0')
 @result{}2
-eval(`0?1/0:3')
+eval(`0 ? 1/0 : 3')
 @result{}3
-eval(`4,5')
+eval(`4, 5')
 @result{}5
 @end example
 
address@hidden options: -G
address@hidden status: 1
address@hidden
-$ @kbd{m4 --posix}
-eval(`1?2:3')
address@hidden:stdin:1: eval: invalid operator: 1?2:3
address@hidden
-eval(`4,5')
address@hidden:stdin:2: eval: invalid operator: 4,5
address@hidden
address@hidden example
-
 Within @var{expression}, (but not @var{radix} or @var{width}), numbers
 without a special prefix are decimal.  A simple @samp{0} prefix
 introduces an octal number.  @samp{0x} introduces a hexadecimal number.
Index: m4/symtab.c
===================================================================
RCS file: /sources/m4/m4/m4/symtab.c,v
retrieving revision 1.70
diff -u -r1.70 symtab.c
--- m4/symtab.c 27 Jan 2007 00:25:14 -0000      1.70
+++ m4/symtab.c 28 Feb 2007 21:24:37 -0000
@@ -32,15 +32,16 @@
    simply ordered on the stack by age.  The most recently pushed definition
    will then always be the first found.
 
-   Also worthy of mention is the way traced symbols are managed:  the trace
-   bit is associated with a particular symbol name.  If a symbol is
-   undefined and then redefined, it does not lose its trace bit (in GNU
-   mode).  This is achieved by not removing traced symbol names from the
-   symbol table, even if their value stack is empty.  That way, when the
-   name is given a new value, it is pushed onto the empty stack, and the
-   trace bit attached to the name was never lost.  There is a small amount
-   of fluff in these functions to make sure that such symbols (with empty
-   value stacks) are invisible to the users of this module.  */
+   Also worthy of mention is the way traced symbols are managed: the
+   trace bit is associated with a particular symbol name.  If a symbol
+   is undefined and then redefined, it does not lose its trace bit.
+   This is achieved by not removing traced symbol names from the
+   symbol table, even if their value stack is empty.  That way, when
+   the name is given a new value, it is pushed onto the empty stack,
+   and the trace bit attached to the name was never lost.  There is a
+   small amount of fluff in these functions to make sure that such
+   symbols (with empty value stacks) are invisible to the users of
+   this module.  */
 
 #define M4_SYMTAB_DEFAULT_SIZE         2047
 
Index: modules/evalparse.c
===================================================================
RCS file: /sources/m4/m4/modules/evalparse.c,v
retrieving revision 1.16
diff -u -r1.16 evalparse.c
--- modules/evalparse.c 6 Jan 2007 19:56:54 -0000       1.16
+++ modules/evalparse.c 28 Feb 2007 21:24:37 -0000
@@ -341,9 +341,6 @@
   numb_init (v2);
   while ((et = eval_lex (&v2)) == COMMA)
     {
-      /* Unless XCU ERN 137 is approved, eval must reject this in
-        POSIX mode.  */
-      numb_extension (context);
       et = eval_lex (&v2);
       if (et == ERROR)
        return UNKNOWN_INPUT;
@@ -374,9 +371,6 @@
   numb_init (v3);
   if ((et = eval_lex (&v2)) == QUESTION)
     {
-      /* Unless XCU ERN 137 is approved, eval must reject this in
-        POSIX mode.  */
-      numb_extension (context);
       et = eval_lex (&v2);
       if (et == ERROR)
        return UNKNOWN_INPUT;
Index: modules/m4.c
===================================================================
RCS file: /sources/m4/m4/modules/m4.c,v
retrieving revision 1.103
diff -u -r1.103 m4.c
--- modules/m4.c        28 Feb 2007 14:36:22 -0000      1.103
+++ modules/m4.c        28 Feb 2007 21:24:37 -0000
@@ -1111,15 +1111,6 @@
 #define numb_urshift(c, x, y)                          \
    (*(x) = (number) ((unumber) *(x) >> (unumber) *(y)))
 
-#define numb_extension(c)                            \
-  do                                                 \
-    {                                                \
-      /* Revisit this if XCU ERN 137 is approved.  */ \
-      if (m4_get_posixly_correct_opt (context))              \
-       return INVALID_OPERATOR;                      \
-    }                                                \
-  while (0)
-
 
 /* The function ntoa () converts VALUE to a signed ascii representation in
    radix RADIX.  */
Index: modules/mpeval.c
===================================================================
RCS file: /sources/m4/m4/modules/mpeval.c,v
retrieving revision 1.23
diff -u -r1.23 mpeval.c
--- modules/mpeval.c    15 Jan 2007 14:04:27 -0000      1.23
+++ modules/mpeval.c    28 Feb 2007 21:24:37 -0000
@@ -143,7 +143,6 @@
 static void numb_lshift (m4 *context, number *x, number *y);
 static void numb_rshift (m4 *context, number *x, number *y);
 #define numb_urshift(c, x, y) numb_rshift (c, x, y)
-#define numb_extension(c) /* no-op */
 
 
 static number numb_ZERO;
Index: src/main.c
===================================================================
RCS file: /sources/m4/m4/src/main.c,v
retrieving revision 1.108
diff -u -b -r1.108 main.c
--- src/main.c  5 Feb 2007 17:31:10 -0000       1.108
+++ src/main.c  28 Feb 2007 21:24:47 -0000
@@ -33,12 +33,12 @@
 
 #define AUTHORS _("Rene' Seindal"), "Gary V. Vaughan", "Eric Blake"
 
-typedef struct macro_definition
+typedef struct deferred
 {
-  struct macro_definition *next;
+  struct deferred *next;
   int code;                    /* deferred optchar */
-  const char *macro;
-} macro_definition;
+  const char *value;
+} deferred;
 
 
 /* Error handling functions.  */
@@ -92,7 +92,7 @@
   -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\
-  -r, --regexp-syntax[=SPEC]   set default regexp syntax to SPEC [EMACS]\n\
+  -r, --regexp-syntax[=SPEC]   set default regexp syntax to SPEC [GNU_M4]\n\
       --safer                  disable potentially unsafe builtins\n\
   -W, --warnings               enable all warnings\n\
 "), stdout);
@@ -325,13 +325,12 @@
 int
 main (int argc, char *const *argv, char *const *envp)
 {
-  macro_definition *head = NULL;       /* head of deferred argument list */
-  macro_definition *tail = NULL;
-  macro_definition *defn;
+  deferred *head = NULL;       /* head of deferred argument list */
+  deferred *tail = NULL;
+  deferred *defn;
   int optchar;                 /* option character */
   size_t size;                 /* for parsing numeric option arguments */
 
-  macro_definition *defines;
   bool read_stdin = false;     /* true iff we have read from stdin */
   bool import_environment = false; /* true to import environment */
   bool seen_file = false;
@@ -428,7 +427,7 @@
 
        defn = xmalloc (sizeof *defn);
        defn->code = optchar;
-       defn->macro = optarg;
+       defn->value = optarg;
        defn->next = NULL;
 
        if (head == NULL)
@@ -641,7 +640,7 @@
        {
          defn = xmalloc (sizeof *defn);
          defn->code = 'D';
-         defn->macro = *env;
+         defn->value = *env;
          defn->next = head;
          head = defn;
        }
@@ -649,22 +648,20 @@
 
   /* Handle deferred command line macro definitions.  Must come after
      initialization of the symbol table.  */
+  defn = head;
+  while (defn != NULL)
   {
-    defines = head;
+      deferred *next;
+      const char *arg = defn->value;
 
-    while (defines != NULL)
-      {
-       macro_definition *next;
-       const char *arg = defines->macro;
-
-       switch (defines->code)
+      switch (defn->code)
          {
          case 'D':
          case 'p':
            {
              m4_symbol_value *value = m4_symbol_value_create ();
 
-             /* defines->arg is read-only, so we need a copy.  */
+           /* defn->value is read-only, so we need a copy.  */
              char *macro_name = xstrdup (arg);
              char *macro_value = strchr (macro_name, '=');
 
@@ -673,7 +670,7 @@
              m4_set_symbol_value_text (value, xstrdup (macro_value
                                                        ? macro_value : ""));
 
-             if (defines->code == 'D')
+           if (defn->code == 'D')
                m4_symbol_define (M4SYMTAB, macro_name, value);
              else
                m4_symbol_pushdef (M4SYMTAB, macro_name, value);
@@ -691,13 +688,10 @@
            break;
 
          case 'r':
-           m4_set_regexp_syntax_opt (context,
-                                     m4_regexp_syntax_encode (arg));
+         m4_set_regexp_syntax_opt (context, m4_regexp_syntax_encode (arg));
            if (m4_get_regexp_syntax_opt (context) < 0)
-             {
                m4_error (context, EXIT_FAILURE, 0,
                          _("bad regexp syntax option: `%s'"), arg);
-             }
            break;
 
          case 't':
@@ -737,10 +731,9 @@
            abort ();
          }
 
-       next = defines->next;
-       free (defines);
-       defines = next;
-      }
+      next = defn->next;
+      free (defn);
+      defn = next;
   }
 
   /* Handle remaining input files.  Each file is pushed on the input,






reply via email to

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