diff options
author | Eric Blake <ebb9@byu.net> | 2007-02-28 21:31:12 +0000 |
---|---|---|
committer | Eric Blake <ebb9@byu.net> | 2007-10-06 07:08:10 -0600 |
commit | 37cb2a3e79c237941583ef92d7ffe834c31967b2 (patch) | |
tree | 3125d0f2bddd2bd9b8c50a994b8cb7b489bfc8ea | |
parent | 083f98f05fadf5b6256b7facb37a120955f58c00 (diff) | |
download | m4-37cb2a3e79c237941583ef92d7ffe834c31967b2.tar.gz |
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.
-rw-r--r-- | ChangeLog | 18 | ||||
-rw-r--r-- | NEWS | 352 | ||||
-rw-r--r-- | doc/m4.texinfo | 104 | ||||
-rw-r--r-- | m4/symtab.c | 19 | ||||
-rw-r--r-- | modules/evalparse.c | 6 | ||||
-rw-r--r-- | modules/m4.c | 9 | ||||
-rw-r--r-- | modules/mpeval.c | 1 | ||||
-rw-r--r-- | src/freeze.c | 26 | ||||
-rw-r--r-- | src/main.c | 195 |
9 files changed, 512 insertions, 218 deletions
@@ -1,5 +1,23 @@ 2007-02-28 Eric Blake <ebb9@byu.net> + 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. + POSIX XCU ERN 118 was approved. * modules/m4.c (define): Kill posixly_correct distinction in define behavior, since POSIX says GNU behavior complies. @@ -103,12 +103,12 @@ promoted to 2.0. 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 @@ promoted to 2.0. 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 @@ promoted to 2.0. - 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 @@ FIXME: include the (long) list of changes in 1.4.x that were not already *** 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) diff --git a/doc/m4.texinfo b/doc/m4.texinfo index d4e97255..fc0d01e7 100644 --- a/doc/m4.texinfo +++ b/doc/m4.texinfo @@ -655,11 +655,12 @@ expectations, please report that as a bug. This option is implied if @item -r@r{[}@var{RESYNTAX-SPEC}@r{]} @itemx --regexp-syntax@r{[}=@var{RESYNTAX-SPEC}@r{]} Set the regular expression syntax according to @var{RESYNTAX-SPEC}. -When this option is not given, @var{RESYNTAX-SPEC} is omitted, -@acronym{GNU} M4 uses 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. +When this option is not given, or @var{RESYNTAX-SPEC} is omitted, +@acronym{GNU} 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 @@ spelling, or by using @samp{./@var{number}} if you really meant it. @item -D @var{NAME}@r{[}=@var{VALUE}@r{]} @itemx --define=@var{NAME}@r{[}=@var{VALUE}@r{]} -This enters @var{NAME} into the symbol table, before any input files are -read. If @samp{=@var{VALUE}} 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 @samp{=@var{VALUE}} 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 @@ file names. @item -p @var{NAME}@r{[}=@var{VALUE}@r{]} @itemx --pushdef=@var{NAME}@r{[}=@var{VALUE}@r{]} -This enters @var{NAME} into the symbol table, before any input files are -read. If @samp{=@var{VALUE}} 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 @samp{=@var{VALUE}} 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 @@ nargs((unquoted parentheses, like this, group arguments)) @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. + +@example +dnl Attempt to define a macro to just `$#' +define(underquoted, $#) +oops) +@result{} +underquoted +@result{}0) +@result{}oops +@end 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 @@ Changes the default regular expression syntax used by M4 according to 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 @@ escapes. @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'. -@comment @item Assign -character used in macro definitions for default -@comment variables, category '='. @end table @noindent @@ -4412,6 +4424,10 @@ Close parenthesis Argument separator @item $ Dollar +@item @{ +Left brace +@item @} +Right brace @item O Other @item @@ @@ -4428,8 +4444,6 @@ Begin comment End comment @comment @item I @comment Ignore -@comment @item = -@comment Assign @end table The remaining characters of each @var{syntax-spec} form the set of @@ -6046,11 +6060,10 @@ The macro @code{eval} is recognized only with parameters. @end deffn All binary operators, except exponentiation, are left associative. C -operators that perform variable assignment, such as @samp{=} or -@samp{--}, are forbidden by @acronym{POSIX}, since @code{eval} only -operates on constants, not variables. Attempting to use them results -in an error. -@comment fixme If XCU ERN 137 is approved, then we could provide an +operators that perform variable assignment, such as @samp{+=} or +@samp{--}, are not implemented, since @code{eval} only operates on +constants, not variables. Attempting to use them results in an error. +@comment 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 @@ shifting a negative number as though it were an unsigned bit pattern, 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 @@ eval(`(-1 >>> 1) > (1 << 30)') @result{}1 eval(`6 \ 3') @result{}2 -@end 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. - -@example -$ @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 -@comment options: -G -@comment status: 1 -@example -$ @kbd{m4 --posix} -eval(`1?2:3') -@error{}m4:stdin:1: eval: invalid operator: 1?2:3 -@result{} -eval(`4,5') -@error{}m4:stdin:2: eval: invalid operator: 4,5 -@result{} -@end 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. diff --git a/m4/symtab.c b/m4/symtab.c index 3ce49c36..d5a636f2 100644 --- a/m4/symtab.c +++ b/m4/symtab.c @@ -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 diff --git a/modules/evalparse.c b/modules/evalparse.c index 831e4a00..323908bd 100644 --- a/modules/evalparse.c +++ b/modules/evalparse.c @@ -341,9 +341,6 @@ comma_term (m4 *context, eval_token et, number *v1) 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 @@ condition_term (m4 *context, eval_token et, number *v1) 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; diff --git a/modules/m4.c b/modules/m4.c index 3313dede..997a08c1 100644 --- a/modules/m4.c +++ b/modules/m4.c @@ -1111,15 +1111,6 @@ M4BUILTIN_HANDLER (translit) #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. */ diff --git a/modules/mpeval.c b/modules/mpeval.c index cae83ec7..f906992d 100644 --- a/modules/mpeval.c +++ b/modules/mpeval.c @@ -143,7 +143,6 @@ static void numb_not (m4 *context, number *x); 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; diff --git a/src/freeze.c b/src/freeze.c index 0991216c..7b31b36c 100644 --- a/src/freeze.c +++ b/src/freeze.c @@ -239,12 +239,12 @@ produce_frozen_state (m4 *context, const char *name) || 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 @@ produce_frozen_state (m4 *context, const char *name) || 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 @@ reload_frozen_state (m4 *context, const char *name) 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 @@ ill-formed frozen file, version 2 directive `%c' encountered"), 'S'); /* 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')) @@ -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 @@ Operation modes:\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\ - -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 @@ process_file (m4 *context, const char *name) 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 @@ main (int argc, char *const *argv, char *const *envp) defn = xmalloc (sizeof *defn); defn->code = optchar; - defn->macro = optarg; + defn->value = optarg; defn->next = NULL; if (head == NULL) @@ -513,8 +512,8 @@ main (int argc, char *const *argv, char *const *envp) case 'W': /* FIXME - should W take an optional argument, to allow -Wall, - -Wnone, -Werror, -Wcategory, -Wno-category? If so, then have - -W == -Wall. */ + -Wnone, -Werror, -Wcategory, -Wno-category? If so, then have + -W == -Wall. */ m4_set_suppress_warnings_opt (context, false); break; @@ -641,7 +640,7 @@ main (int argc, char *const *argv, char *const *envp) { defn = xmalloc (sizeof *defn); defn->code = 'D'; - defn->macro = *env; + defn->value = *env; defn->next = head; head = defn; } @@ -649,99 +648,93 @@ main (int argc, char *const *argv, char *const *envp) /* Handle deferred command line macro definitions. Must come after initialization of the symbol table. */ - { - defines = head; + defn = head; + while (defn != NULL) + { + deferred *next; + const char *arg = defn->value; - while (defines != NULL) - { - macro_definition *next; - const char *arg = defines->macro; + switch (defn->code) + { + case 'D': + case 'p': + { + m4_symbol_value *value = m4_symbol_value_create (); - switch (defines->code) + /* defn->value is read-only, so we need a copy. */ + char *macro_name = xstrdup (arg); + char *macro_value = strchr (macro_name, '='); + + if (macro_value != NULL) + *macro_value++ = '\0'; + m4_set_symbol_value_text (value, xstrdup (macro_value + ? macro_value : "")); + + if (defn->code == 'D') + m4_symbol_define (M4SYMTAB, macro_name, value); + else + m4_symbol_pushdef (M4SYMTAB, macro_name, value); + free (macro_name); + } + break; + + case 'U': + m4_symbol_delete (M4SYMTAB, arg); + break; + + case 'm': + /* FIXME - should loading a module result in output? */ + m4_module_load (context, arg, NULL); + break; + + case 'r': + 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': + m4_set_symbol_name_traced (M4SYMTAB, arg, true); + break; + + case '\1': + read_stdin |= process_file (context, arg); + break; + + case POPDEF_OPTION: + if (m4_symbol_lookup (M4SYMTAB, arg)) + m4_symbol_popdef (M4SYMTAB, arg); + break; + + case SYNCOUTPUT_OPTION: { - case 'D': - case 'p': - { - m4_symbol_value *value = m4_symbol_value_create (); - - /* defines->arg is read-only, so we need a copy. */ - char *macro_name = xstrdup (arg); - char *macro_value = strchr (macro_name, '='); - - if (macro_value != NULL) - *macro_value++ = '\0'; - m4_set_symbol_value_text (value, xstrdup (macro_value - ? macro_value : "")); - - if (defines->code == 'D') - m4_symbol_define (M4SYMTAB, macro_name, value); - else - m4_symbol_pushdef (M4SYMTAB, macro_name, value); - free (macro_name); - } - break; - - case 'U': - m4_symbol_delete (M4SYMTAB, arg); - break; - - case 'm': - /* FIXME - should loading a module result in output? */ - m4_module_load (context, arg, NULL); - break; - - case 'r': - 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': - m4_set_symbol_name_traced (M4SYMTAB, arg, true); - break; - - case '\1': - read_stdin |= process_file (context, arg); - break; - - case POPDEF_OPTION: - if (m4_symbol_lookup (M4SYMTAB, arg)) - m4_symbol_popdef (M4SYMTAB, arg); - break; - - case SYNCOUTPUT_OPTION: - { - bool previous = m4_get_syncoutput_opt (context); - m4_set_syncoutput_opt (context, - m4_parse_truth_arg (context, arg, - "--syncoutput", - previous)); - } - break; - - case TRACEOFF_OPTION: - m4_set_symbol_name_traced (M4SYMTAB, arg, false); - break; - - case UNLOAD_MODULE_OPTION: - /* FIXME - should unloading a module result in output? */ - m4_module_unload (context, arg, NULL); - break; - - default: - assert (!"INTERNAL ERROR: bad code in deferred arguments"); - abort (); + bool previous = m4_get_syncoutput_opt (context); + m4_set_syncoutput_opt (context, + m4_parse_truth_arg (context, arg, + "--syncoutput", + previous)); } + break; - next = defines->next; - free (defines); - defines = next; - } - } + case TRACEOFF_OPTION: + m4_set_symbol_name_traced (M4SYMTAB, arg, false); + break; + + case UNLOAD_MODULE_OPTION: + /* FIXME - should unloading a module result in output? */ + m4_module_unload (context, arg, NULL); + break; + + default: + assert (!"INTERNAL ERROR: bad code in deferred arguments"); + abort (); + } + + next = defn->next; + free (defn); + defn = next; + } /* Handle remaining input files. Each file is pushed on the input, and the input read. */ |