GNU M4 NEWS - User visible changes.

* Noteworthy changes in Version 1.6 (????-??-??) [stable]
  Released by ????, based on git versions 1.4.10b.x-* and 1.5.*

** Add new capability to automatically generate make dependency rules.
   This is enabled by the new command-line option pair '--makedep=FILE'
   and '--makedep-target=TARGET' and further tuned by
   '--makedep-gen-missing-argfiles', '--makedep-gen-missing-include',
   '--makedep-gen-missing-sinclude', '--makedep-gen-missing-all',
   '--makedep-phony-argfiles', '--makedep-phony-include',
   '--makedep-phony-sinclude', and '--makedep-phony-all'.

** Fix regressions introduced in 1.4.10b:
*** Using `builtin' or `indir' to perform nested `shift' calls triggered
    an assertion failure (not present in 1.4.11).
*** The command-line option -dV, as well as the builtin `debugmode(V)',
    failed to enable `t' and `c' debug options (not present in 1.4.11).
*** Comments that contain unbalanced quotes were not rescanned correctly
    when passed through $@ (not present in 1.4.11).
*** Using `defn' on a traced but undefined macro triggered an assertion
    failure (also present in 1.4.11, but not 1.4.12).

** Remove the undocumented command-line option '-N', as no one complained
   about the assertion failure regression that it introduced in 1.4.7.

** Remove the experimental `changeword` builtin, as it causes severe
   performance penalties and most distros did not enable it.  What's more,
   it had many years of being able to trigger a crash if used incorrectly.

** The `-o'/`--error-output' command-line options, which were replaced by
   `--debugfile' in 1.4.7, now issue a deprecation warning.  This warning
   harmlessly triggers with versions of Autoconf 2.60 and earlier, but can
   be silenced by applying this patch:
     http://git.sv.gnu.org/gitweb/?p=autoconf.git;a=commitdiff;h=714eeee87

** Fix the `m4wrap' builtin to accumulate wrapped text in FIFO order, as
   required by POSIX.  The manual mentions a way to restore the LIFO order
   present in earlier GNU M4 versions.  NOTE: this change exposes a bug
   in Autoconf 2.59 and earlier (which was fixed in Autoconf 2.60).

   If you want your package to work with pre-installed Autoconf without
   requiring 2.60, then add these lines to your project's configure.ac,
   prior to calling AC_INIT:

     # As long as this project is not ready to upgrade to autoconf 2.60
     # or newer, make sure that newer M4 will still use LIFO order:
     m4_define([m4_wrap], [m4_ifdef([_$0_text],
       [m4_define([_$0_text], [$1]m4_defn([_$0_text]))],
       [m4_define([_$0_text], [$1])m4_builtin([m4wrap],
         [m4_default(m4_defn([_$0_text])m4_undefine([_$0_text]))])])])

   On the other hand, if you want to install Autoconf 2.59 or earlier,
   then apply this patch:
     http://git.sv.gnu.org/gitweb/?p=autoconf.git;a=commitdiff;h=56d42fa71

** The `divert' builtin now accepts an optional second argument of text
   that is immediately placed in the new diversion, regardless of whether
   the current expansion is nested within argument collection of another
   macro.  It has also been optimized for faster performance.

** The `substr' builtin now treats negative arguments as indices relative
   to the end of the string, and accepts an optional fourth argument of
   text to supply in place of the selected substring.  The manual gives an
   example of how to recover M4 1.4.x behavior, as well as an example of
   simulating the new negative argument semantics with older M4.

** The `index' builtin now takes an optional third argument as the index
   to begin searching from, with a negative argument relative to the end of
   the string.

** The `-d'/`--debug' command-line option now understands `-' and `+'
   modifiers, the way the builtin `debugmode' has always done; this allows
   `-d-V' to disable prior debug settings from the command line, similar to
   using the builtin `debugmode' without arguments.  The mode string can
   now contain `-' or `+' at more than just the first byte.  The option
   `--debugmode' is added as an alias for `-d'.  The new flag `d' is added
   to control whether dereferencing an undefined macro causes a warning.
   The new flag `o' is added to control whether `dumpdef' outputs to stderr
   or the current `debugfile' location.  When the command line option is
   given the empty string, the mode is treated as `adeq' instead of `aeq'.
   Also, the position of `-d' with respect to files on the command line is
   now significant.

** The `debugmode' builtin (but not the `-d' command line option) now
   understands an argument of "?" as a request to expand to a quoted string
   describing the current debug flag settings.

** A new `qindir' builtin is added, similar to `indir', but where the
   output is quoted rather than rescanned for further macro expansion.

** A new predefined text macro, `__m4_version__', expands to the unquoted
   version number of M4, if GNU extensions are enabled.  While you should
   generally favor feature tests over version number checks, this macro can
   be used, via `defn', to determine whether the version of m4 processing
   your file is adequate.

** The `defn', `popdef', and `undefine' builtins gained a new warning when
   operating on an undefined macro name, to match the warning already
   present in `builtin', `indir', and `dumpdef'.  For backwards
   compatibility, the warning can be disabled by using `debugmode(`-d')'
   (or the command line option `--debug=-d').  The flag is also cleared by
   the command line option `-E'/`--fatal-warnings', so that scripts written
   for 1.4.x do not cause the script to fail because of new warnings.

** Enhance the `indir' builtin to trace indirect macros, where the trace
   is requested via `traceon' or the command-line option `-t'.  Previously,
   it was impossible to trace macro names such as `foo-bar' which could
   only be invoked indirectly, without relying on global tracing (such as
   with `debugmode(`t')').

** Aspects of tracing output that were previously undocumented have been
   slightly altered, and the effect of the builtin `debugmode' on trace
   output is more fully documented.  As POSIX does not specify trace output
   format, parsing such output is inherently fragile in the first place.
   The intent is that future M4 versions will not change documented trace
   output without adding additional `debugmode' flags.

** Enhance the `ifdef', `ifelse', and `shift' builtins, as well as all
   user macros, to transparently handle builtin tokens generated by `defn'.

** Allow the concatenation of builtin macros with arbitrary text in
   several contexts, via the `defn' builtin or argument expansion, rather
   than warning and converting the builtin token to an empty string.
   However, it is still not possible to use a concatenated builtin when
   defining a macro.

** Enhance the `defn', `dumpdef', `ifdef', `popdef', `traceon', `traceoff',
   and `undefine' macros to warn when encountering a builtin token in the
   context of a macro name, rather than acting on the empty string.  This
   was already done for `define', `pushdef', `builtin', and `indir'.

** Fix the `eval' builtin to reject input like `0x' that C does not
   accept as an integer literal, rather than silently treating it as zero
   (present since "the beginning").

** Enhance the `eval' builtin to understand the `?:' and `>>>' operators,
   and downgrade a failed parse due to an unknown operator from an error to
   a warning (the same as for all other syntax errors).  Further, the
   builtin now refuses to recognize `=' as a synonym for `==' (this had
   emitted a warning since 1.4.8b).

** A number of portability improvements inherited from gnulib.


* Noteworthy changes in Version 1.4.10b (2008-02-25) [beta]
  Released by Eric Blake, based on git version 1.4.10a

Note that M4 1.4.10b was released prior to 1.4.11, and includes all the
features of 1.4.11 except for C99 parsing in the `format' builtin; it might
have been better if it had been numbered 1.5.88a.  It also contains the
following beta features that were deemed worth deferring until 1.6:

** Further enhance the `index' builtin to often achieve sublinear results.

** Enhance the `regexp' and `patsubst' builtins to cache frequently used
   regular expressions, which speeds up typical Autoconf usage.

** Enhance the `format' builtin to warn for more suspicious usages, such as
   missing arguments or problems parsing according to the format string.

** Enhance the `ifelse' and `shift' builtins so that tail-recursive
   algorithms based on `$@' operate in linear, rather than quadratic, time
   and memory.

** A number of portability improvements inherited from gnulib.


* Noteworthy changes in release 1.4.20 (2025-05-10) [stable]

** Fix a bug in the `eval' builtin where it does not suppress warnings
   about division by zero that occurs within a more complex expression on
   the right hand side of || or && (present since short-circuiting was
   introduced in 1.4.8b).

** The `syscmd' and `esyscmd' builtins no longer mishandle a command line
   starting with `-' or `+' (present since "the beginning").

** Fix regression introduced in 1.4.19 where trace output (such as with
   `debugmode(t)') could read invalid memory when tracing a series of
   pushed macros that are popped during argument collection.

** Fix regression introduced in 1.4.19 where the `format' builtin
   inadvertently took on locale-dependent parsing and output of floating
   point numbers as a side-effect of introducing message translations.
   While it would be nice for m4 to be fully locale-aware, such a behavior
   change belongs in a major version release such as 1.6, and not a minor
   release.

** Fix regression introduced in 1.4.11 where the experimental `changeword'
   builtin could cause a crash if given a regex that does not match all
   one-byte prefixes of valid longer matches.  As a reminder, `changeword'
   is not recommended for production use, and will likely not be present
   in the next major version release.

** On non-Unix platforms where binary files differ from text, loading a
   frozen file (which should be cross-platform compatible) now correctly
   uses binary mode.

** Several documentation improvements to the manual.

** Update to comply with newer C standards, and inherit portability
   improvements from gnulib.


* Noteworthy changes in release 1.4.19 (2021-05-28) [stable]

** A number of portability improvements inherited from gnulib, including
   the ability to perform stack overflow detection on more platforms
   without linking to GNU libsigsegv.


* Noteworthy changes in release 1.4.18d (2021-05-11) [beta]

** A number of portability improvements inherited from gnulib.


* Noteworthy changes in release 1.4.18b (2021-05-07) [beta]

** The symbol hash table now defaults to 65537 buckets instead of 509, as
   modern systems have enough memory to benefit from fewer hash collisions
   by default.

** Introduce the use of gettext, with the immediate benefit of nicer
   UTF-8 author names.  Over time, more translations of program messages
   will become available.

** A number of portability improvements inherited from gnulib.


* Noteworthy changes in release 1.4.18 (2016-12-31) [stable]

** Diagnose --word-regexp as unsupported if it was not configured.

** Preliminary support for OS/2.

** A number of portability improvements inherited from gnulib.


* Noteworthy changes in release 1.4.17 (2013-09-22) [stable]

** Fix compilation with newer glibc headers.

** A number of portability improvements inherited from gnulib.


* Noteworthy changes in release 1.4.16 (2011-03-01) [stable]

** Fix regressions in the `index' builtin.  On glibc platforms, this
   avoids false positives from a strstr bug in glibc 2.9 through 2.12;
   on many other platforms, it fixes two separate regressions, a false
   positive introduced in 1.4.11 and a false negative in 1.4.15.

** A number of portability improvements inherited from gnulib.


* Noteworthy changes in release 1.4.15 (2010-08-31) [stable]

** Fix regression introduced in 1.4.9b where the `format' builtin could
   crash on an invalid format string.

** Fix compilation against newer glibc, and on AIX 7.1BETA.

** A number of portability improvements inherited from gnulib.


* Noteworthy changes in Version 1.4.14 (2010-02-24) [stable]
  Released by Eric Blake, based on git version 1.4.13.*

** Fix regression introduced in 1.4.12 where executing with stdout closed
   could crash m4 on exit on some platforms.

** Fix regressions introduced in 1.4.13 in the `esyscmd' builtin, where
   closed file descriptors could interfere with child execution, and where
   a child status of 127 made m4 print a spurious message to stderr.

** Fix a security hole in 'make dist', present since at least M4 1.4, that
   could affect anybody attempting to redistribute modified sources (see
   Automake CVE-2009-4029).

** A number of portability improvements inherited from gnulib.


* Noteworthy changes in Version 1.4.13 (2009-04-01) [stable]
  Released by Eric Blake, based on git version 1.4.12.*

** The manual is now distributed under the terms of FDL 1.3.

** The `divert' and `undivert' builtins have been made more efficient
   when using temporary files for large diversions.

** The `translit' builtin has been made more efficient when the second
   argument is short.

** The input engine has been optimized for faster processing.

** The command line option `--debugfile', introduced in 1.4.7, now
   treats its argument as optional, in order to allow setting the debug
   output back to stderr when used without an argument; and order is now
   significant with respect to command line files.  You must therefore use
   `m4 --debugfile=trace file', not `m4 file --debugfile trace'.  This
   change does not affect the deprecated `-o'/`--error-output' option.

** The `syscmd' and `esyscmd' builtins can be configured to use an
   alternate shell, via the new `configure' option `--with-syscmd-shell'.

** A number of portability improvements inherited from gnulib.


* Noteworthy changes in Version 1.4.12 (2008-10-10) [stable]
  Released by Eric Blake, based on git version 1.4.11.*

** Fix regression introduced in 1.4.4b where using `traceon' could delete
   a macro.  This was most noticeable with `traceon(`traceon')', but
   would also happen in cases such as `foo(traceon(`foo'))'.

** Fix regression introduced in 1.4.7 where `m4 -N9' died with an assertion
   failure.

** Fix regression introduced in 1.4.11 where `defn' died with an assertion
   failure on a traced but undefined macro.

** New `-g'/`--gnu' command-line option overrides `-G'/`--traditional'.
   For now, the environment variable POSIXLY_CORRECT has no effect on M4
   behavior; but a future release of M4 will behave as though --traditional
   is implied if POSIXLY_CORRECT is set (this future change is necessary,
   because in the current release, there is no way to disable GNU
   extensions that conflict with POSIX without the use of a non-POSIX
   command-line argument).  Clients of M4 that want to use GNU extensions,
   even when POSIXLY_CORRECT is set, should start using the -g command-line
   argument, even though it is currently a no-op if -G did not appear
   earlier in the command line, so that the client will not break in the
   face of an upgraded m4 and a POSIXLY_CORRECT execution environment.

** The `-L'/`--nesting-limit' command-line option now defaults to 0 for
   unlimited on platforms that can detect and deal with stack overflow.  On
   systems that lack alternate stack support, such as Cygwin, and on
   systems that do not obey the POSIX semantics for distinguishing stack
   overflow from other exceptions, such as Linux, you can optionally
   install the libsigsegv library (version 2.6 or newer recommended) to
   enhance m4's ability to accurately report stack overflow:
   https://www.gnu.org/software/libsigsegv/

** A number of portability improvements inherited from gnulib.


* Noteworthy changes in Version 1.4.11 (2008-04-02) [stable]
  Released by Eric Blake, based on git version 1.4.10a

** Security fixes for the -F option, for bugs present since -F was
   introduced in 1.3: Avoid core dump with 'm4 -F file -t undefined', and
   avoid arbitrary code execution with certain file names.

** Fix regression introduced in 1.4.9b in the `divert' builtin when more
   than 512 kibibytes are saved in diversions on platforms like NetBSD
   or darwin where fopen(name,"a+") seeks to the end of the file.

** The output of the `maketemp' and `mkstemp' builtins is now quoted if a
   file was created.  This is a minor security fix, because it was possible
   (although rather unlikely) that an unquoted string could match an
   existing macro name, such that use of the `mkstemp' output would trigger
   inadvertent macro expansion and operate on the wrong file name.

** Enhance the `defn' builtin to support concatenation of multiple text
   arguments, as required by POSIX.  However, at this time, it is not
   possible to concatenate a builtin macro with anything else; a warning is
   now issued if this is attempted, although a future version of M4 may
   lift this restriction to match other implementations.

** Enhance the `format' builtin to parse all C99 floating point numbers,
   even on platforms where strtod(3) is buggy, although the replacement
   function does have the known issue of rounding errors when parsing
   some decimal floating point values.  This fixes testsuite failures
   introduced in 1.4.9b.

** Enhance the `index' builtin to guarantee linear behavior, in spite of
   the surprisingly large number of systems with a brain-dead quadratic
   strstr(3).

** A number of portability improvements inherited from gnulib.


* Noteworthy changes in Version 1.4.10 (2007-07-09) [stable]
  Released by Eric Blake, based on CVS version 1.4.9c

** Upgrade from GPL version 2 to GPL version 3 or later.

** A number of portability improvements inherited from gnulib.

** Avoid undefined behavior introduced in 1.4.9b in the `format' builtin
   when handling %c.  However, this area of code has never been documented,
   and currently does not match the POSIX behavior of printf(1), so it may
   have further changes in the next version.


* Noteworthy changes in Version 1.4.9b (2007-05-29) [beta]
  Released by Eric Blake, based on CVS version 1.4.9a

** Fix regression introduced in 1.4.9 in the `eval' builtin when performing
   division.

** Fix regression introduced in 1.4.8 in the `-F' option that made it
   impossible to freeze more than 512 kibibytes of diverted text.

** The synclines option `-s' no longer generates sync lines in the middle of
   multiline comments or quoted strings.

** Work around a number of corner-case POSIX compliance bugs in various
   broken stdio libraries.  In particular, the `syscmd' builtin behaves
   more predictably when stdin is seekable.

** The `format' builtin now understands formats such as %a, %A, and %'hhd,
   and works around a number of platform printf bugs.  Furthermore, the
   sequence format(%*.*d,-1,-1,1) no longer outputs random data.  However,
   some non-compliant platforms such as mingw still have known bugs in
   strtod that may cause testsuite failures.

** The testsuite is improved to also run gnulib portability tests for the
   features that M4 imports from gnulib.

* Noteworthy changes in Version 1.4.9 (2007-03-23) [stable]
  Released by Eric Blake, based on CVS version 1.4.8c

** Minor documentation and portability cleanups.

* Noteworthy changes in Version 1.4.8b (2007-02-24) [beta]
  Released by Eric Blake, based on 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 achieve 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.

* Noteworthy changes in Version 1.4.8 (2006-11-20) [stable]
  Released by Eric Blake, based on 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.

* Noteworthy changes in Version 1.4.7 (2006-09-25) [stable]
  Released by Eric Blake, based on 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.

* Noteworthy changes in Version 1.4.6 (2006-08-25) [stable]
  Released by Eric Blake, based on 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.

* Noteworthy changes in Version 1.4.5 (2006-07-15) [stable]
  Released by Eric Blake, based on 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.

* Noteworthy changes in Version 1.4.4b (2006-06-17) [beta]
  Released by Eric Blake, based on 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.

* Noteworthy changes in Version 1.4.4 (Oct 2005) [stable]
  Released 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.

* Noteworthy changes in Version 1.4.3 (Mar 2005) [stable]
  Released 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.

* Noteworthy changes in Version 1.4.2 (Aug 2004) [stable]
  Released by Paul Eggert

** No user visible changes; portability bug fixes only.

* Noteworthy changes in Version 1.4.1 (Jun 2004) [stable]
  Released by Paul Eggert

** 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.

* Noteworthy changes in Version 1.4 (Oct 1994) [stable]
  Released by François Pinard

** (No user visible changes)


Version 1.3 - September 1994, by François Pinard

* Diversions are created as needed.  Option `-N' is still accepted, but
otherwise ignored.  Users should use only negative diversion numbers,
instead of high positive numbers, for diverting to nowhere.

* Diversions should also work faster.  No temporary files will be needed
at all if all diversions taken altogether do not use more than 512K.

* Frozen state files may be produced with the `--freeze-state' (-F)
option and later brought back through the `--reload-state' (-R) option.

Version 1.2 - July 1994, by François Pinard

* In patsubst(STRING, REGEXP, REPLACEMENT), \& in REPLACEMENT has been
changed to represent this part of STRING matched by the whole REGEXP,
instead of the whole STRING as before.  \0 does the same, but emits a
diagnostic saying it will disappear in some subsequent release.

* eval(EXPR) emits a diagnostic if EXPR has suffixed crumb.  The same for
other numeric conversions in incr(), decr(), divert(), etc.

* `--fatal-warnings' (-E) stops execution at first warning.

* `--nesting-limit=LEVEL' (-L LEVEL) sets a limit to macro nesting.
It is initially fixed at 250.

* `--word-regexp=REGEXP' (-W REGEXP) modifies macro name syntax, like
does the new `changeword(REGEXP)' macro.  This feature is experimental,
tell me your opinions about it.  You do need --enable-changeword at
configure time to get these things.  Do *not* depend on them yet.

* Trace output format is scannable by GNU Emacs' next-error function.

* Stack overflow is detected and diagnosed on some capable systems.

* Various bugs have been corrected, m4 should be more portable.  See the
ChangeLog for details.

Version 1.1 - November 1993, by François Pinard

Changes which might affect existing GNU m4 scripts:

* Option `-V' has been removed, use `--version' instead.  `--version'
writes on standard output instead of standard error, and inhibits any
script execution.

* `--no-gnu-extensions' has been renamed `--traditional'.

* In `eval', `^' used to indicate exponentiation, use `**' instead.

* The automatic undiversion which takes place at end of all input is
forced into the main output stream.

Changes which are unlikely to affect existing scripts:

* `--help' prints an usage summary on standard output.  Script execution
is then inhibited.

* `--prefix-builtins' (-P) prefixes all builtin macros by `m4_'.

* Most builtin macros for which arguments are mandatory, called without
any arguments, are no more recognized as builtin macros: they are
consequently copied verbatim to the output stream.

* `define' and `pushdef' are usable with only one argument, they give
this argument an empty definition.

* `eval' new operators for binary representation handling: `^' for
exclusive-or, `~' for the bitwise negation, `<<' and `>>' for shifts.

* `eval' recognizes the notation 0bDIGITS for binary numbers and the
notation 0rRADIX:DIGITS for numbers in any radix from 1 to 36.

Version 1.0.3 - December 1992, by François Pinard

Changes for the user:

* `dnl' outputs a diagnostic if immediately followed by `('.  Usually,
`dnl' is followed by newline or whitespace.

* `ifelse' accepts without complaining the common idiom of having only
one argument.  This is useful for introducing long comments.

* `eval' always expresses values as signed, whatever the radix.

* M4OPTS environment variable is no longer obeyed.

* `--no-warnings' option is renamed `--silent'.

* Debug lines use a new format more compatible with GNU standards.

* Various bugs have been corrected.  See the ChangeLog for details.

Changes for the installer:

* GNU m4 now uses an Autoconf-generated configure script, and should be
more easily portable in many ways.  (Cray is not supported yet).

* `make check' has been made more portable, expect no errors.

Changes for the programmer:

* Sources have been fully reindented to comply with GNU standards, and
cleaned up in many ways.

* Sources have been protoized.  Non-ANSI compilers are automatically
detected, then sources are unprotoized on the fly before compilation.

* GNU m4 uses newer versions of obstack, regex, getopt, etc.

Version 1.0 - October 1991, by René Seindal

* Uses GNU configure, taken from the gdb distribution.

* Uses GNU getopt(), with long option names.

* The -Q/+quiet option is added, which suppresses warnings about missing
or superfluous arguments to built-in macros.

* Added default options via the M4OPTS environment variable.

* Several minor bugs have been fixed.

Version 0.99 - July 1991, by René Seindal

* The builtins `incr' and `decr' are now implemented without use of
`eval'.

* The builtin `indir' is added, to allow for indirect macro calls
(allows use of "illegal" macro names).

* The debugging and tracing facilities has been enhanced considerably.
See the manual for details.

* The -tMACRO option is added, marks MACRO for tracing as soon as it
is defined.

* Builtins are traced after renaming iff they were before.

* Named files can now be undiverted.

* The -Nnum option can be used to increase the number of diversions
available.

* Calling changecom without arguments now disables all comment handling.

* A bug in `dnl' is fixed.

* A bug in the multi-character quoting code is fixed.

* Several typos in the manual has been corrected.  More probably persist.

Version 0.75 - November 1990, by René Seindal

* Implemented search path for include files (-I option and M4PATH
environment variable).

* Implemented builtin `format' for printf-like formatting.

* Implemented builtin `regexp' for searching for regular expressions.

* Implemented builtin `patsubst' for substitution with regular
expressions.

* Implemented builtin `esyscmd', which expands to a shell commands output.

* Implemented `__file__' and `__line__' for use in error messages.

* Implemented character ranges in `translit'.

* Implemented control over debugging output.

* Implemented multi-character quotes.

* Implemented multi-character comment delimiters.

* Changed predefined macro `gnu' to `__gnu__'.

* Changed predefined macro `unix' to `__unix__', when the -G option is
not used.  With -G, `unix' is still defined.

* Added program name to error messages.

* Fixed two missing null bytes bugs.

Version 0.50 - January 1990, by René Seindal

* Initial beta release.

========================================================================

Local Variables:
mode: outline
fill-column: 75
End:

Copyright (C) 1992-1994, 2004-2014, 2016-2017, 2020-2025 Free Software
Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with no
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
Texts.  A copy of the license is included in the ``GNU Free
Documentation License'' file as part of this distribution.
