m4-patches
[Top][All Lists]
Advanced

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

Re: branch-1_4 doc improvements


From: Eric Blake
Subject: Re: branch-1_4 doc improvements
Date: Fri, 14 Jul 2006 19:55:24 -0600
User-agent: Thunderbird 1.5.0.4 (Windows/20060516)

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

> 
> And here it goes.  I added more tests, and in the process fixed format and
> indir to be truly blind (ie. indir(`indir') should warn the same way
> indir(`builtin') already did).

Looks like I forgot to attach the actual patch.

> 
> 2006-07-14  Eric Blake  <address@hidden>
> 
>       * src/builtin.c (m4_format, m4_indir): Warn on too few arguments.
>       * doc/m4.texinfo (Defn, Builtin, Debug Levels, Debug Output): Add
>       more examples.
>       (Dnl): Update example to show side effects.
>       * checks/get-them: Generate three digit test names.
>       * checks/Makefile.in (CHECKS): Accomodate 100+ tests.

And finally, the patch I've been working on for a week, which turned up
all the smaller issues along the way.  I changed the formatting to use
@deffn consistently, fixed grammar mistakes as I saw them, and adjusted
wording where it was awkward.  I've tested info, pdf, and html outputs to
make sure all three look reasonable.

Unless anyone else has a last-minute itch, I hope to release 1.4.5 tomorrow.

2006-07-14  Eric Blake  <address@hidden>

        * doc/m4.texinfo: Global cleanup.  Avoid @code{...}'d, as it
        looks bad in info.  Use @deffn rather than @example for
        describing prototypes.  Fix awkward wording and grammar.

- --
Life is short - so eat dessert first!

Eric Blake             address@hidden
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2.1 (Cygwin)
Comment: Public key at home.comcast.net/~ericblake/eblake.gpg
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFEuEsM84KuGfSFAYARAm17AKDTAbbk1UsjPbe5zS4y4DktvtoIFwCeOnTC
UE4xNU5uB3s6OTwh6otfMN8=
=vbAO
-----END PGP SIGNATURE-----
Index: checks/Makefile.in
===================================================================
RCS file: /sources/m4/m4/checks/Attic/Makefile.in,v
retrieving revision 1.1.1.1.2.10
diff -u -p -r1.1.1.1.2.10 Makefile.in
--- checks/Makefile.in  3 Jul 2006 17:01:07 -0000       1.1.1.1.2.10
+++ checks/Makefile.in  14 Jul 2006 15:00:37 -0000
@@ -32,7 +32,7 @@ PATH_SEPARATOR = @PATH_SEPARATOR@
 AWK = @AWK@
 
 # Vern says that the first star is required around an Alpha make bug.
-CHECKS = $(srcdir)/*[0-9][0-9].*
+CHECKS = $(srcdir)/*[0-9][0-9][0-9].*
 # Makefile.in is automatically distributed by automake.
 DISTFILES = $(srcdir)/get-them $(srcdir)/check-them $(srcdir)/stamp-checks
 
Index: checks/get-them
===================================================================
RCS file: /sources/m4/m4/checks/Attic/get-them,v
retrieving revision 1.1.1.1.2.3
diff -u -p -r1.1.1.1.2.3 get-them
--- checks/get-them     8 Jul 2006 21:20:44 -0000       1.1.1.1.2.3
+++ checks/get-them     14 Jul 2006 15:00:37 -0000
@@ -23,7 +23,7 @@ BEGIN {
 
   split($0, tmp, ",");
   node = substr(tmp[1], 7);
-  if (length(node) > 11)
+  if (length(node) > 10)
     printf("Node: %s - truncated", node);
   else
     printf("Node: %s ", node);
@@ -45,7 +45,7 @@ BEGIN {
       close (file);
     seq++;
     count++;
-    file = sprintf("%02d.%s", count, node);
+    file = sprintf("%03d.%s", count, node);
     printf("dnl @ %s:%d: Origin of test\n", FILENAME, NR) > file;
     next;
   }
Index: doc/m4.texinfo
===================================================================
RCS file: /sources/m4/m4/doc/m4.texinfo,v
retrieving revision 1.1.1.1.2.41
diff -u -p -r1.1.1.1.2.41 m4.texinfo
--- doc/m4.texinfo      13 Jul 2006 22:09:54 -0000      1.1.1.1.2.41
+++ doc/m4.texinfo      14 Jul 2006 15:00:38 -0000
@@ -1427,6 +1427,8 @@ expansion is a special token, which poin
 definition.  This token is only meaningful as the second argument to
 @code{define} (and @code{pushdef}), and is ignored in any other context.
 
+The macro @code{defn} is recognized only with parameters.
+
 Its normal use is best understood through an example, which shows how to
 rename @code{undefine} to @code{zap}:
 
@@ -1470,7 +1472,27 @@ defn(`string')
 @result{}
 @end example
 
-The macro @code{defn} is recognized only with parameters.
+However, it is important to remember that @code{m4} rescanning is purely
+textual.  If an unbalanced right quote string occurs in a macro
+definition, the rescan will see that embedded quote as the termination
+of the quoted string, and the remainder of the macro's definition will
+be rescanned unquoted.  Thus it is a good idea to avoid unbalanced right
+quotes in macro definitions or arguments to macros.
+
address@hidden
+define(`foo', a'a)
address@hidden
+define(`a', `A')
address@hidden
+define(`echo', `$@')
address@hidden
+foo
address@hidden'A
+defn(`foo')
address@hidden'
+echo(foo)
address@hidden'
address@hidden example
 
 @node Pushdef
 @section Temporarily redefining macros
@@ -1617,6 +1639,51 @@ another definition that has covered the 
 
 The macro @code{builtin} is recognized only with parameters.
 
+This can be used even if @var{name} has been given another definition
+that has covered the original, or been undefined so that no @var{name}
+maps to the builtin.
+
address@hidden
+pushdef(`define', `hidden')
address@hidden
+undefine(`undefine')
address@hidden
+define(`foo', `bar')
address@hidden
+foo
address@hidden
+builtin(`define', `foo', `BAR')
address@hidden
+foo
address@hidden
+undefine(`foo')
address@hidden(foo)
+foo
address@hidden
+builtin(`undefine', `foo')
address@hidden
+foo
address@hidden
address@hidden example
+
+Note that this can be used to invoke builtins that normally require
+parameters without actually providing them; but it will provoke a
+warning, and usually result in a void expansion.
+
address@hidden
+builtin
address@hidden
+builtin()
address@hidden:2: m4: undefined builtin `'
address@hidden
+builtin(`builtin')
address@hidden:3: m4: Warning: too few arguments to builtin `builtin'
address@hidden
+builtin(`builtin',)
address@hidden:4: m4: undefined builtin `'
address@hidden
address@hidden example
+
 @node Conditionals
 @chapter Conditionals, loops, and recursion
 
@@ -2114,10 +2181,32 @@ debugmode(opt @var{flags})
 The argument @var{flags} should be a subset of the letters listed above.
 As special cases, if the argument starts with a @samp{+}, the flags are
 added to the current debug flags, and if it starts with a @samp{-}, they
-are removed.  If no argument is present, the debugging flags are set to
-zero (as if no @option{-d} was given), and with an empty argument the flags
-are reset to the default.
+are removed.  If no argument is present, the debugging flags are cleared
+(as if no @option{-d} was given), and with an empty argument the flags
+are reset to the default of @samp{aeq}.
 
address@hidden
+define(`foo', `FOO')
address@hidden
+traceon(`foo')
address@hidden
+debugmode()
address@hidden
+foo
address@hidden: -1- foo -> `FOO'
address@hidden
+debugmode
address@hidden
+foo
address@hidden: -1- foo
address@hidden
+debugmode(`+l')
address@hidden
+foo
address@hidden:8: -1- foo
address@hidden
address@hidden example
+ 
 @node Debug Output
 @section Saving debugging output
 
@@ -2140,6 +2229,25 @@ will send all further debug and trace ou
 @code{debugfile} is called without any arguments, debug and trace output
 are sent to the standard error output.
 
address@hidden
+traceon(`divnum')
address@hidden
+divnum(`extra')
address@hidden:2: m4: Warning: excess arguments to builtin `divnum' ignored
address@hidden: -1- divnum(`extra') -> `0'
address@hidden
+debugfile()
address@hidden
+divnum(`extra')
address@hidden:4: m4: Warning: excess arguments to builtin `divnum' ignored
address@hidden
+debugfile
address@hidden
+divnum
address@hidden: -1- divnum -> `0'
address@hidden
address@hidden example
+
 @node Input Control
 @chapter Input control
 
@@ -2190,11 +2298,11 @@ input following the matching close paren
 next newline, on whatever line containing it, will still be discarded.
 
 @example
-dnl(`this is ignored',
-`so is this') and this too
+dnl(`args are ignored, but side effects occur',
+define(`foo', `like this')) while this text is ignored: undefine(`foo')
 @error{}stdin:2: m4: Warning: excess arguments to builtin `dnl' ignored
-but not this
address@hidden not this
+See how `foo' was defined, foo?
address@hidden how foo was defined, like this?
 @end example
 
 @node Changequote
@@ -2310,6 +2418,8 @@ start comment delimiter.
 
 Calling @code{changecom} without any arguments, or with an empty string
 for the first argument, disables the commenting mechanism completely.
+To restore the original comment start of @samp{#}, you must explicitly
+ask for it.
 
 @example
 define(`comment', `COMMENT')
@@ -2318,6 +2428,10 @@ changecom
 @result{}
 # Not a comment anymore
 @result{}# Not a COMMENT anymore
+changecom(`#')
address@hidden
+# comment again
address@hidden comment again
 @end example
 
 @node Changeword
Index: src/builtin.c
===================================================================
RCS file: /sources/m4/m4/src/Attic/builtin.c,v
retrieving revision 1.1.1.1.2.23
diff -u -p -r1.1.1.1.2.23 builtin.c
--- src/builtin.c       13 Jul 2006 22:09:54 -0000      1.1.1.1.2.23
+++ src/builtin.c       14 Jul 2006 15:00:38 -0000
@@ -733,7 +733,7 @@ m4_indir (struct obstack *obs, int argc,
   symbol *s;
   const char *name = ARG (1);
 
-  if (bad_argc (argv[0], argc, 1, -1))
+  if (bad_argc (argv[0], argc, 2, -1))
     return;
 
   s = lookup_symbol (name, SYMBOL_LOOKUP);
@@ -1596,6 +1596,8 @@ m4_translit (struct obstack *obs, int ar
 static void
 m4_format (struct obstack *obs, int argc, token_data **argv)
 {
+  if (bad_argc (argv[0], argc, 2, -1))
+    return;
   format (obs, argc - 1, argv + 1);
 }
 
Index: doc/m4.texinfo
===================================================================
RCS file: /sources/m4/m4/doc/m4.texinfo,v
retrieving revision 1.1.1.1.2.43
diff -u -p -r1.1.1.1.2.43 m4.texinfo
--- doc/m4.texinfo      14 Jul 2006 20:43:23 -0000      1.1.1.1.2.43
+++ doc/m4.texinfo      15 Jul 2006 00:10:09 -0000
@@ -99,9 +99,9 @@ subsequent changes by Fran@,{c}ois Pinar
 on the Internet.  All names and email addresses can be found in the
 files @file{AUTHORS} and @file{THANKS} from the GNU M4 distribution.
 
-This is release @value{VERSION}.  It is now to be considered stable,
-future releases in the 1.4.x series are only meant to fix bugs, increase
-speed, or improve documentation.  address@hidden
+This is release @value{VERSION}.  It is now considered stable:  future
+releases in the 1.4.x series are only meant to fix bugs, increase speed,
+or improve documentation.  address@hidden
 
 An experimental feature, which would improve @code{m4} usefulness,
 allows for changing the syntax for what is a @dfn{word} in @code{m4}.
@@ -292,15 +292,16 @@ input to the output, expanding macros as
 builtin or user-defined, and can take any number of arguments.
 Besides just doing macro expansion, @code{m4} has builtin functions
 for including named files, running shell commands, doing integer
-arithmetic, manipulating text in various ways, recursion, address@hidden
address@hidden can be used either as a front-end to a compiler, or as a
-macro processor in its own right.
+arithmetic, manipulating text in various ways, performing recursion,
address@hidden @code{m4} can be used either as a front-end to a compiler, or
+as a macro processor in its own right.
 
-The @code{m4} macro processor is widely available on all UNIXes.
+The @code{m4} macro processor is widely available on all UNIXes, and has
+been standardized by @acronym{POSIX}.
 Usually, only a small percentage of users are aware of its existence.
 However, those who find it often become committed users.  The
 popularity of GNU Autoconf, which requires GNU @code{m4} for
address@hidden the @file{configure} scripts, is an incentive
address@hidden @file{configure} scripts, is an incentive
 for many to install it, while these people will not themselves
 program in @code{m4}.  GNU @code{m4} is mostly compatible with the
 System V, Release 3 version, except for some minor differences.
@@ -308,7 +309,7 @@ System V, Release 3 version, except for 
 
 Some people find @code{m4} to be fairly addictive.  They first use
 @code{m4} for simple problems, then take bigger and bigger challenges,
-learning how to write complex @code{m4} sets of macros along the way.
+learning how to write complex sets of @code{m4} macros along the way.
 Once really addicted, users pursue writing of sophisticated @code{m4}
 applications even to solve simple problems, devoting more time
 debugging their @code{m4} scripts than doing real work.  Beware that
@@ -317,7 +318,7 @@ debugging their @code{m4} scripts than d
 @node History
 @section Historical references
 
address@hidden has been an important ancestor of @code{m4}.  See
address@hidden was an important ancestor of @code{m4}.  See
 C. Stratchey: ``A General Purpose Macro generator'', Computer Journal
 8,3 (1965), pp. 225 ff.  @code{GPM} is also succinctly described into
 David Gries classic ``Compiler Construction for Digital Computers''.
@@ -329,7 +330,7 @@ macro-processor language, which inspired
 
 Kernighan and Ritchie then joined forces to develop the original
 @code{m4}, as described in ``The M4 Macro Processor'', Bell
-Laboratories (1977) which had only 21 builtin macros.
+Laboratories (1977).  It had only 21 builtin macros.
 
 While @code{GPM} was more @emph{pure}, @code{m4} is meant to deal with
 the true intricacies of real life: macros can be recognized without
@@ -337,14 +338,14 @@ being pre-announced, skipping whitespace
 more constructs are builtin instead of derived, etc.
 
 Originally, the Kernighan and Plauger macro-processor, and then
address@hidden formed the engine for the Rational FORTRAN preprocessor,
address@hidden, formed the engine for the Rational FORTRAN preprocessor,
 that is, the @code{Ratfor} equivalent of @code{cpp}.  Later, @code{m4}
 was used as a frontend for @code{Ratfor}, @code{C} and @code{Cobol}.
 
 Ren@'e Seindal released his implementation of @code{m4}, GNU @code{m4},
 in 1990, with the aim of removing the artificial limitations in many
-of the traditional @code{m4}'s: like maximum line length, macro size,
-number of macros and so on.
+of the traditional @code{m4} implementations, such as maximum line
+length, macro size, or number of macros.
 
 The late Professor A. Dain Samples described and implemented a further
 evolution in the form of @code{M5}: ``User's Guide to the M5 Macro
@@ -425,7 +426,7 @@ calls, or treating the empty string as z
 @itemx address@hidden
 Use @var{REGEXP} as an alternative syntax for macro names.  This
 experimental option will not be present on all GNU @code{m4}
-implementations. (@pxref{Changeword}).
+implementations (@pxref{Changeword}).
 @end table
 
 @cindex macro definitions, on the command line
@@ -458,7 +459,7 @@ similar tools.  This is useful, for exam
 front end to a compiler.  Source file name and line number information
 is conveyed by directives of the form @samp{#line @var{linenum}
 "@var{file}"}, which are inserted as needed into the middle of the
-input.  Such directives mean that the following line originated or was
+output.  Such directives mean that the following line originated or was
 expanded from the contents of input file @var{file} at line
 @var{linenum}.  The @samp{"@var{file}"} part is often omitted when
 the file name did not change from the previous directive.
@@ -576,7 +577,7 @@ for more details.
 @itemx address@hidden
 This enables tracing for the macro @var{NAME}, at any point where it is
 defined.  @var{NAME} need not be defined when this option is given.
-This option may be given more than once.
+This option may be given more than once.  @xref{Trace}, for more details.
 @end table
 
 @cindex command line, file names on the
@@ -588,7 +589,7 @@ conventional, but not required, for inpu
 
 The input files are read in the sequence given.  The standard input can
 only be read once, so the file name @file{-} should only appear once on
-the command line.  It is an error if a file ends in the middle of
+the command line.  It is an error if an input file ends in the middle of
 argument collection or a quoted string.
 
 If you need to read a file whose name starts with a @file{-}, you can
@@ -655,10 +656,25 @@ As each of the predefined macros in @cod
 call of the macro will be shown, giving descriptive names to the
 arguments, e.g.,
 
address@hidden ignore
address@hidden
-regexp(@var{string}, @var{regexp}, opt @var{replacement})
address@hidden example
address@hidden Composite example (@var{string}, @dvar{count, 1}, @
+  @address@hidden)
+This is a sample prototype.  There is not really a macro named
address@hidden, but this documents that if there were, it would be a
+Composite macro, rather than a Builtin.  It requires at least one
+argument, @var{string}.  Remember that in @code{m4}, there must not be a
+space between the macro name and the opening parenthesis, unless it was
+intended to call the macro without any arguments.  The brackets around
address@hidden and @var{argument} show that these arguments are optional.
+If @var{count} is omitted, the macro behaves as if count were @samp{1},
+whereas if @var{argument} is omitted, the macro behaves as if it were
+the empty string.  A blank argument is not the same as an omitted
+argument.  For example, @samp{example(`a')}, @samp{example(`a',`1')},
+and @samp{example(`a',`1',)} would behave identically with @var{count}
+set to @samp{1}; while @samp{example(`a',)} and @samp{example(`a',`')}
+would explicitly pass the empty string for @var{count}.  The ellipses
+(@address@hidden) show that the macro processes additional arguments
+after @var{argument}, rather than ignoring them.
address@hidden deffn
 
 All macro arguments in @code{m4} are strings, but some are given
 special interpretation, e.g., as numbers, file names, regular
@@ -670,11 +686,6 @@ even if the argument has leading zeros; 
 a number results in 0 rather than an error, although a warning will be
 issued.
 
-The @samp{opt} before the third argument shows that this argument is
-optional---if it is left out, it is taken to be the empty string.  An
-ellipsis (@samp{...}) last in the argument list indicates that any
-number of arguments may follow.
-
 This document consistently writes and uses @dfn{builtin}, without a
 hyphen, as if it were an English word.  This is how the @code{builtin}
 primitive is spelled within @code{m4}.
@@ -714,8 +725,8 @@ Examples of legal names are: @samp{foo},
 
 @cindex quoted string
 A quoted string is a sequence of characters surrounded by the quotes
address@hidden and @kbd{'}, where the number of start and end quotes within the
-string balances.  The value of a string token is the text, with one
address@hidden and @kbd{'}, where the nested start and end quotes within the
+string are balanced.  The value of a string token is the text, with one
 level of quotes stripped off.  Thus
 
 @comment ignore
@@ -793,7 +804,7 @@ then expand the resulting call
 
 @comment ignore
 @example
-format(`Result is %d', `32768')
+format(`Result is %d', 32768)
 @end example
 
 @noindent
@@ -840,7 +851,7 @@ which is a macro invocation without any 
 
 @comment ignore
 @example
-name(arg1, arg2, ..., address@hidden)
+name(arg1, arg2, @dots{}, address@hidden)
 @end example
 
 @noindent
@@ -880,27 +891,28 @@ without arguments.  For any of these mac
 parenthesis does not immediately follow their name, the builtin macro
 call is not triggered.  This solves the most usual cases, like for
 @samp{include} or @samp{eval}.  Later in this document, the sentence
-``This macro is recognized only when given arguments'' refers to this
+``This macro is recognized only with parameters'' refers to this
 specific provision.
 
-There is also a command call option (@option{--prefix-builtins}, or
+There is also a command line option (@option{--prefix-builtins}, or
 @option{-P}) which requires all builtin macro names to be prefixed
 by @samp{m4_} for them to be recognized.  The option has no effect
 whatsoever on user defined macros.  For example, with this option,
 one has to write @code{m4_dnl} and even @code{m4_m4exit}.
 
 If your version of GNU @code{m4} has the @code{changeword} feature
-compiled in, there it offers far more flexibility in specifying the
+compiled in, it offers far more flexibility in specifying the
 syntax of macro names, both builtin or user-defined.  @xref{Changeword},
 for more information on this experimental feature.
 
-Of course, the simplest way to prevent a name to be interpreted
+Of course, the simplest way to prevent a name from being interpreted
 as a call to an existing macro is to quote it.  The remainder of
 this section studies a little more deeply how quoting affects macro
 invocation, and how quoting can be used to inhibit macro invocation.
 
 Even if quoting is usually done over the whole macro name, it can also
-be done over only a few characters of this name.  It is also possible
+be done over only a few characters of this name (provided, of course,
+that the unquoted portions are not also a macro).  It is also possible
 to quote the empty string, but this works only @emph{inside} the name.
 For example:
 
@@ -983,7 +995,9 @@ as a macro.
 
 If the name is followed by an opening parenthesis, the arguments will be
 collected before the macro is called.  If too few arguments are
-supplied, the missing arguments are taken to be the empty string.  If
+supplied, the missing arguments are taken to be the empty string.
+However, some builtins are documented to behave differently for a
+missing optional argument than for an explicit empty string.  If
 there are too many arguments, the excess arguments are ignored.
 
 Normally @code{m4} will issue warnings if a builtin macro is called
@@ -1038,7 +1052,7 @@ foo(() (`(') `(')
 @noindent
 is a macro call, with one argument, whose value is @samp{() (() (}.
 Commas separate arguments, except when they occur inside quotes,
-comments, or unquoted parentheses, @pxref{Pseudo Arguments} for
+comments, or unquoted parentheses, @xref{Pseudo Arguments}, for
 examples.
 
 It is common practice to quote all arguments to macros, unless you are
@@ -1087,8 +1101,8 @@ expanded, into @samp{Hello world}.
 @cindex macros, how to define new
 @cindex defining new macros
 Macros can be defined, redefined and deleted in several different ways.
-Also, it is possible to redefine a macro, without losing a previous
-value, which can be brought back at a later time.
+Also, it is possible to redefine a macro without losing a previous
+value, and bring back the original value at a later time.
 
 @menu
 * Define::                      Defining a new macro
@@ -1105,20 +1119,16 @@ value, which can be brought back at a la
 @node Define
 @section Defining a macro
 
address@hidden define
 The normal way to define or redefine macros is to use the builtin
 @code{define}:
 
address@hidden ignore
address@hidden
-define(@var{name} [, @var{expansion}])
address@hidden example
-
address@hidden
-which defines @var{name} to expand to @var{expansion}.  If
address@hidden Builtin define (@var{name}, @ovar{expansion})
+Defines @var{name} to expand to @var{expansion}.  If
 @var{expansion} is not given, it is taken to be empty.
 
 The expansion of @code{define} is void.
+The macro @code{define} is recognized only with parameters.
address@hidden deffn
 
 The following example defines the macro @var{foo} to expand to the text
 @samp{Hello World.}.
@@ -1149,7 +1159,8 @@ one
 @result{}two
 @end example
 
-The first argument to @code{define} does not have to be a simple word.
+As a GNU extension, the first argument to @code{define} does not have to
+be a simple word.
 It can be any text string, even the empty string.  A macro with a
 non-standard name cannot be invoked in the normal way, as the name is
 not recognised.  It can only be referenced by the builtins @ref{Indir}
@@ -1175,8 +1186,6 @@ array(eval(`10 + 7'))
 
 Change the @code{%d} to @code{%s} and it is an associative array.
 
-The macro @code{define} is recognized only with parameters.
-
 @node Arguments
 @section Arguments to macros
 
@@ -1355,19 +1364,15 @@ interpreting the @code{$} sign as a refe
 @cindex macros, how to delete
 @cindex deleting macros
 @cindex undefining macros
address@hidden undefine
 A macro definition can be removed with @code{undefine}:
 
address@hidden ignore
address@hidden
-undefine(@var{name})
address@hidden example
-
address@hidden
-which removes the macro @var{name}.  The macro name must necessarily be
-quoted, since it will be expanded otherwise.
address@hidden Builtin undefine (@address@hidden)
+For each argument, remove the macro @var{name}.  The macro names must
+necessarily be quoted, since they will be expanded otherwise.
 
 The expansion of @code{undefine} is void.
+The macro @code{undefine} is recognized only with parameters.
address@hidden deffn
 
 @example
 foo bar blah
@@ -1401,24 +1406,16 @@ f(`bye')
 It is not an error for @var{name} to have no macro definition.  In that
 case, @code{undefine} does nothing.
 
-The macro @code{undefine} is recognized only with parameters.
-
 @node Defn
 @section Renaming macros
 
 @cindex macros, how to rename
 @cindex renaming macros
address@hidden defn
 It is possible to rename an already defined macro.  To do this, you need
 the builtin @code{defn}:
 
address@hidden ignore
address@hidden
-defn(@var{name})
address@hidden example
-
address@hidden
-which expands to the @emph{quoted definition} of @var{name}.  If the
address@hidden Builtin defn (@var{name})
+Expands to the @emph{quoted definition} of @var{name}.  If the
 argument is not a defined macro, the expansion is void.
 
 If @var{name} is a user-defined macro, the quoted definition is simply
@@ -1428,6 +1425,7 @@ definition.  This token is only meaningf
 @code{define} (and @code{pushdef}), and is ignored in any other context.
 
 The macro @code{defn} is recognized only with parameters.
address@hidden deffn
 
 Its normal use is best understood through an example, which shows how to
 rename @code{undefine} to @code{zap}:
@@ -1501,19 +1499,12 @@ echo(foo)
 @cindex temporary redefinition of macros
 @cindex redefinition of macros, temporary
 It is possible to redefine a macro temporarily, reverting to the
-previous definition at a later time.
address@hidden popdef
address@hidden pushdef
-This is done with the builtins @code{pushdef} and @code{popdef}:
+previous definition at a later time.  This is done with the builtins
address@hidden and @code{popdef}:
 
address@hidden ignore
address@hidden
-pushdef(@var{name} [, @var{expansion}])
-popdef(@var{name})
address@hidden example
-
address@hidden
-which are quite analogous to @code{define} and @code{undefine}.
address@hidden Builtin pushdef (@var{name}, @ovar{expansion})
address@hidden Builtin popdef (@address@hidden)
+Analogous to @code{define} and @code{undefine}.
 
 These macros work in a stack-like fashion.  A macro is temporarily
 redefined with @code{pushdef}, which replaces an existing definition of
@@ -1525,6 +1516,11 @@ If a macro has several definitions (of w
 the topmost definition can be removed with @code{popdef}.  If there is
 no previous definition, @code{popdef} behaves like @code{undefine}.
 
+The expansion of both @code{pushdef} and @code{popdef} is void.
+The macros @code{pushdef} and @code{popdef} are recognized only with
+parameters.
address@hidden deffn
+
 @example
 define(`foo', `Expansion one.')
 @result{}
@@ -1576,12 +1572,16 @@ foo
 @result{}foo
 @end example
 
address@hidden local variables
address@hidden variables, local
+Local variables within macros are made with @code{pushdef} and
address@hidden  At the start of the macro a new definition is pushed,
+within the macro it is manipulated and at the end it is popped,
+revealing the former definition.
+
 It is possible to temporarily redefine a builtin with @code{pushdef}
 and @code{defn}.
 
-The macros @code{pushdef} and @code{popdef} are recognized only with
-parameters.
-
 @node Indir
 @section Indirect call of macros
 
@@ -1589,17 +1589,17 @@ parameters.
 @cindex call of macros, indirect
 @cindex macros, indirect call of
 @cindex GNU extensions
address@hidden indir
 Any macro can be called indirectly with @code{indir}:
 
address@hidden ignore
address@hidden
-indir(@var{name}, ...)
address@hidden example
address@hidden Builtin indir (@var{name}, @dots{})
+Results in a call to the macro @var{name}, which is passed the
+rest of the arguments.  If @var{name} is not defined, an error message
+is printed, and the expansion is void.
 
address@hidden
-which results in a call to the macro @var{name}, which is passed the
-rest of the arguments.  This can be used to call macros with ``invalid''
+The macro @code{indir} is recognized only with parameters.
address@hidden deffn
+
+This can be used to call macros with ``invalid''
 names (@code{define} allows such names to be defined):
 
 @example
@@ -1615,8 +1615,6 @@ The point is, here, that larger macro pa
 defined, that will not be called by accident.  They can @emph{only} be
 called through the builtin @code{indir}.
 
-The macro @code{indir} is recognized only with parameters.
-
 @node Builtin
 @section Indirect call of builtins
 
@@ -1624,20 +1622,60 @@ The macro @code{indir} is recognized onl
 @cindex call of builtins, indirect
 @cindex builtins, indirect call of
 @cindex GNU extensions
address@hidden builtin
 Builtin macros can be called indirectly with @code{builtin}:
 
address@hidden ignore
address@hidden Builtin builtin (@var{name}, @dots{})
+Results in a call to the builtin @var{name}, which is passed the
+rest of the arguments.  If @var{name} does not name a builtin, an error
+message is printed, and the expansion is void.
+
+The macro @code{builtin} is recognized only with parameters.
address@hidden deffn
+
+This can be used even if @var{name} has been given another definition
+that has covered the original, or been undefined so that no @var{name}
+maps to the builtin.
+
 @example
-builtin(@var{name}, ...)
+pushdef(`define', `hidden')
address@hidden
+undefine(`undefine')
address@hidden
+define(`foo', `bar')
address@hidden
+foo
address@hidden
+builtin(`define', `foo', `BAR')
address@hidden
+foo
address@hidden
+undefine(`foo')
address@hidden(foo)
+foo
address@hidden
+builtin(`undefine', `foo')
address@hidden
+foo
address@hidden
 @end example
 
address@hidden
-which results in a call to the builtin @var{name}, which is passed the
-rest of the arguments.  This can be used, if @var{name} has been given
-another definition that has covered the original.
+Note that this can be used to invoke builtins that normally require
+parameters without actually providing them; but it will provoke a
+warning, and usually result in a void expansion.
 
-The macro @code{builtin} is recognized only with parameters.
address@hidden
+builtin
address@hidden
+builtin()
address@hidden:2: m4: undefined builtin `'
address@hidden
+builtin(`builtin')
address@hidden:3: m4: Warning: too few arguments to builtin `builtin'
address@hidden
+builtin(`builtin',)
address@hidden:4: m4: undefined builtin `'
address@hidden
address@hidden example
 
 This can be used even if @var{name} has been given another definition
 that has covered the original, or been undefined so that no @var{name}
@@ -1689,7 +1727,7 @@ builtin(`builtin',)
 
 Macros, expanding to plain text, perhaps with arguments, are not quite
 enough.  We would like to have macros expand to different things, based
-on decisions taken at run-time.  E.g., we need some kind of conditionals.
+on decisions taken at run-time.  For that, we need some kind of conditionals.
 Also, we would like to have some kind of loop construct, so we could do
 something a number of times, or while some condition is true.
 
@@ -1703,22 +1741,18 @@ something a number of times, or while so
 @section Testing macro definitions
 
 @cindex conditionals
address@hidden ifdef
 There are two different builtin conditionals in @code{m4}.  The first is
 @code{ifdef}:
 
address@hidden ignore
address@hidden
-ifdef(@var{name}, @var{string-1}, opt @var{string-2})
address@hidden example
-
address@hidden
-which makes it possible to test whether a macro is defined or not.  If
address@hidden is defined as a macro, @code{ifdef} expands to
address@hidden Builtin ifdef (@var{name}, @var{string-1}, @ovar{string-2})
+If @var{name} is defined as a macro, @code{ifdef} expands to
 @var{string-1}, otherwise to @var{string-2}.  If @var{string-2} is
 omitted, it is taken to be the empty string (according to the normal
 rules).
 
+The macro @code{ifdef} is recognized only with parameters.
address@hidden deffn
+
 @example
 ifdef(`foo', ``foo' is defined', ``foo' is not defined')
 @result{}foo is not defined
@@ -1731,26 +1765,35 @@ ifdef(`no_such_macro', `yes', `no', `ext
 @result{}no
 @end example
 
-The macro @code{ifdef} is recognized only with parameters.
-
 @node Ifelse
 @section Comparing strings
 
 @cindex comparing strings
address@hidden ifelse
 The other conditional, @code{ifelse}, is much more powerful.  It can be
 used as a way to introduce a long comment, as an if-else construct, or
 as a multibranch, depending on the number of arguments supplied:
 
address@hidden ignore
address@hidden
-ifelse(@var{comment})
-ifelse(@var{string-1}, @var{string-2}, @var{equal}, opt @var{not-equal})
-ifelse(@var{string-1}, @var{string-2}, @var{equal}, ...)
address@hidden example
-
address@hidden Builtin ifelse (@var{comment})
address@hidden Builtin ifelse (@var{string-1}, @var{string-2}, @var{equal}, @
+  @ovar{not-equal})
address@hidden Builtin ifelse (@var{string-1}, @var{string-2}, @var{equal-1}, @
+  @var{string-3}, @var{string-4}, @var{equal-2}, @dots{})
 Used with only one argument, the @code{ifelse} simply discards it and
-produces no output.  This is a common @code{m4} idiom for introducing a
+produces no output.
+
+If called with three or four arguments, @code{ifelse} expands into
address@hidden, if @var{string-1} and @var{string-2} are equal (character
+for character), otherwise it expands to @var{not-equal}.
+
+If called with six or more arguments, and @var{string-1} and
address@hidden are equal, @code{ifelse} expands into @var{equal},
+otherwise the first three arguments are discarded and the processing
+starts again.
+
+The macro @code{ifelse} is recognized only with parameters.
address@hidden deffn
+
+Using only one argument is a common @code{m4} idiom for introducing a
 block comment, as an alternative to repeatedly using @code{dnl}.  This
 special usage is recognized by GNU @code{m4}, so that in this case, the
 warning about missing arguments is never triggered.
@@ -1763,9 +1806,7 @@ ifelse(`foo', `bar')
 @result{}
 @end example
 
-If called with three or four arguments, @code{ifelse} expands into
address@hidden, if @var{string-1} and @var{string-2} are equal (character
-for character), otherwise it expands to @var{not-equal}.
+Using three or four arguments provides decision points.
 
 @example
 ifelse(`foo', `bar', `true')
@@ -1800,7 +1841,7 @@ foo(`a', `b', `c')
 However, @code{ifelse} can take more than four arguments.  If given more
 than four arguments, @code{ifelse} works like a @code{case} or @code{switch}
 statement in traditional programming languages.  If @var{string-1} and
address@hidden are equal, @code{ifelse} expands into @var{equal}, otherwise
address@hidden are equal, @code{ifelse} expands into @var{equal-1}, otherwise
 the procedure is repeated with the first three arguments discarded.  This
 calls for an example:
 
@@ -1813,8 +1854,6 @@ Naturally, the normal case will be sligh
 examples.  A common use of @code{ifelse} is in macros implementing loops
 of various kinds.
 
-The macro @code{ifelse} is recognized only with parameters.
-
 @node Loops
 @section Loops and recursion
 
@@ -1828,18 +1867,13 @@ than those enforced by your hardware and
 Loops can be programmed using recursion and the conditionals described
 previously.
 
address@hidden shift
 There is a builtin macro, @code{shift}, which can, among other things,
 be used for iterating through the actual arguments to a macro:
 
address@hidden ignore
address@hidden
-shift(...)
address@hidden example
-
address@hidden
-It takes any number of arguments, and expands to all but the first
address@hidden Builtin shift (@dots{})
+Takes any number of arguments, and expands to all but the first
 argument, separated by commas, with each argument quoted.
address@hidden deffn
 
 @example
 shift
@@ -1850,8 +1884,13 @@ shift(`foo', `bar', `baz')
 @result{}bar,baz
 @end example
 
-An example of the use of @code{shift} is this macro, which reverses the
-order of its arguments:
+An example of the use of @code{shift} is this macro:
+
address@hidden Composite reverse (@dots{})
+Takes any number of arguments, and reverse their order.
address@hidden deffn
+
+It is implemented as:
 
 @example
 define(`reverse', `ifelse(`$#', `0', , `$#', `1', ``$1'',
@@ -1871,8 +1910,18 @@ made with @code{shift}, @code{ifelse} an
 @cindex for loops
 @cindex loops, counting
 @cindex counting loops
-Here is an example of a loop macro that implements a simple for loop.  It
-can, for example, be used for simple counting:
+Here is an example of a loop macro that implements a simple for loop.
+
address@hidden Composite forloop (@var{iterator}, @var{start}, @var{end}, 
@var{text})
+Takes the name in @var{iterator}, which must be a valid macro name, and
+successively assign it each integer value from @var{start} to @var{end},
+inclusive.  For each assignment to @var{iterator}, append @var{text} to
+the expansion of the @code{forloop}.  @var{text} may refer to
address@hidden  Any definition of @var{iterator} prior to this
+invocation is restored.
address@hidden deffn
+
+It can, for example, be used for simple counting:
 
 @example
 include(`forloop.m4')
@@ -1881,12 +1930,7 @@ forloop(`i', `1', `8', `i ')
 @result{}1 2 3 4 5 6 7 8 @comment
 @end example
 
-The arguments are a name for the iteration variable, the starting value,
-the final value, and the text to be expanded for each iteration.  With
-this macro, the macro @code{i} is defined only within the loop.  After
-the loop, it retains whatever value it might have had before.
-
-For-loops can be nested, like
+For-loops can be nested, like:
 
 @example
 include(`forloop.m4')
@@ -1957,22 +2001,18 @@ Fortunately, there is support for macro 
 @cindex displaying macro definitions
 @cindex macros, displaying definitions
 @cindex definitions, displaying macro
address@hidden dumpdef
 If you want to see what a name expands into, you can use the builtin
 @code{dumpdef}:
 
address@hidden ignore
address@hidden
-dumpdef(...)
address@hidden example
-
address@hidden
-which accepts any number of arguments.  If called without any arguments,
address@hidden Builtin dumpdef (@dots{})
+Accepts any number of arguments.  If called without any arguments,
 it displays the definitions of all known names, otherwise it displays
-the definitions of the names given.  The output is printed directly on
-the standard error output.
+the definitions of the names given.  The output is printed to the
+current debug file (usually standard error), and is sorted by name.  If
+an unknown name is encountered, a warning is printed.
 
 The expansion of @code{dumpdef} is void.
address@hidden deffn
 
 @example
 define(`foo', `Hello world.')
@@ -2010,28 +2050,23 @@ display.
 @cindex tracing macro expansion
 @cindex macro expansion, tracing
 @cindex expansion, tracing macro
address@hidden traceon
address@hidden traceoff
 It is possible to trace macro calls and expansions through the builtins
 @code{traceon} and @code{traceoff}:
 
address@hidden ignore
address@hidden
-traceon(...)
-traceoff(...)
address@hidden example
-
address@hidden
address@hidden Builtin traceon (@dots{})
address@hidden Builtin traceoff (@dots{})
 When called without any arguments, @code{traceon} and @code{traceoff}
 will turn tracing on and off, respectively, for all defined macros.
-When called with arguments, only the named macros are affected.
+When called with arguments, only the named macros are affected, whether
+or not they are currently defined.
 
 The expansion of @code{traceon} and @code{traceoff} is void.
address@hidden deffn
 
 Whenever a traced macro is called and the arguments have been collected,
 the call is displayed.  If the expansion of the macro call is not void,
 the expansion can be displayed after the call.  The output is printed
-directly on the standard error output.
+to the current debug file (usually standard error).
 
 @example
 define(`foo', `Hello World.')
@@ -2050,7 +2085,9 @@ echo(gnus, and gnats)
 
 The number between dashes is the depth of the expansion.  It is one most
 of the time, signifying an expansion at the outermost level, but it
-increases when macro arguments contain unquoted macro calls.
+increases when macro arguments contain unquoted macro calls.  The
+maximum number that will appear between dashes is controlled by the
+option @option{--nesting-limit}.
 
 Tracing by name is an attribute that is preserved whether the macro is
 defined or not.  This allows the @option{-t} option to select macros to
@@ -2169,15 +2206,10 @@ If no flags are specified with the @opti
 flags.
 
 @cindex GNU extensions
address@hidden debugmode
 There is a builtin macro @code{debugmode}, which allows on-the-fly control of
 the debugging output format:
 
address@hidden ignore
address@hidden
-debugmode(opt @var{flags})
address@hidden example
-
address@hidden Builtin debugmode (@ovar{flags})
 The argument @var{flags} should be a subset of the letters listed above.
 As special cases, if the argument starts with a @samp{+}, the flags are
 added to the current debug flags, and if it starts with a @samp{-}, they
@@ -2185,6 +2217,9 @@ are removed.  If no argument is present,
 (as if no @option{-d} was given), and with an empty argument the flags
 are reset to the default of @samp{aeq}.
 
+The expansion of @code{debugmode} is void.
address@hidden deffn
+
 @example
 define(`foo', `FOO')
 @result{}
@@ -2214,20 +2249,19 @@ foo
 @cindex debugging output, saving
 @cindex output, saving debugging
 @cindex GNU extensions
address@hidden debugfile
 Debug and tracing output can be redirected to files using either the
 @option{-o} option to @code{m4}, or with the builtin macro @code{debugfile}:
 
address@hidden ignore
address@hidden
-debugfile(opt @var{file})
address@hidden example
-
address@hidden
-will send all further debug and trace output to @var{file}.  If
address@hidden is empty, debug and trace output are discarded and if
address@hidden Builtin debugfile (@ovar{file})
+Sends all further debug and trace output to @var{file}.  If
address@hidden is empty, debug and trace output are discarded.  If
 @code{debugfile} is called without any arguments, debug and trace output
-are sent to the standard error output.
+are sent to standard error.  This does not affect warnings, which are
+always sent to standard error.  If @var{file} cannot be opened, the
+current debug file is unchanged.
+
+The expansion of @code{debugfile} is void.
address@hidden deffn
 
 @example
 traceon(`divnum')
@@ -2266,18 +2300,17 @@ to @code{m4}.
 @section Deleting whitespace in input
 
 @cindex deleting whitespace in input
address@hidden dnl
-The builtin @code{dnl} reads and discards all characters, up to and
-including the first newline:
+The builtin @code{dnl} stands for ``Discard to Next Line'':
 
address@hidden ignore
address@hidden
-dnl
address@hidden example
address@hidden Builtin dnl
+All characters, up to and including the next newline, are discarded
+without performing any macro expansion.
 
address@hidden
-and it is often used in connection with @code{define}, to remove the
-newline that follow the call to @code{define}.  Thus
+The expansion of @code{dnl} is void.
address@hidden deffn
+
+It is often used in connection with @code{define}, to remove the
+newline that follows the call to @code{define}.  Thus
 
 @example
 define(`foo', `Macro `foo'.')dnl A very simple macro, indeed.
@@ -2310,23 +2343,18 @@ See how `foo' was defined, foo?
 
 @cindex changing the quote delimiters
 @cindex quote delimiters, changing the
address@hidden changequote
 The default quote delimiters can be changed with the builtin
 @code{changequote}:
 
address@hidden ignore
address@hidden
-changequote(opt @var{start}, opt @var{end})
address@hidden example
-
address@hidden
-where @var{start} is the new start-quote delimiter and @var{end} is the
address@hidden Builtin changequote (@dvar{start, `}, @dvar{end, '})
+This sets @var{start} as the new start-quote delimiter and @var{end} as the
 new end-quote delimiter.  If any of the arguments are missing, the default
 quotes (@code{`} and @code{'}) are used instead of the void arguments.
 @comment FIXME POSIX requires that with one argument, the closing quote
 @comment be set to newline, not '.
 
 The expansion of @code{changequote} is void.
address@hidden deffn
 
 @example
 changequote(`[', `]')
@@ -2376,27 +2404,27 @@ Neither quote string should start with a
 as they will be confused with names in the input.  Doing so disables
 the quoting mechanism.
 
+Changing the quotes to have the same start and end string disables
+nesting of quotes.  This makes it impossible to double-quote strings
+across macro expansions, so it is not done very often.
+
 @node Changecom
 @section Changing comment delimiters
 
 @cindex changing comment delimiters
 @cindex comment delimiters, changing
address@hidden changecom
 The default comment delimiters can be changed with the builtin
 macro @code{changecom}:
 
address@hidden ignore
address@hidden
-changecom(opt @var{start}, opt @var{end})
address@hidden example
-
address@hidden
-where @var{start} is the new start-comment delimiter and @var{end} is
address@hidden Builtin changecom (@ovar{start}, @ovar{end})
+This sets @var{start} as the new start-comment delimiter and @var{end} as
 the new end-comment delimiter.  If only one argument is provided,
 newline becomes the new end-comment delimiter.  The comment delimiters
-can be of any length.
+can be of any length.  Omitting the first argument, or using the empty
+string as the first argument, disables comments.
 
 The expansion of @code{changecom} is void.
address@hidden deffn
 
 @example
 define(`comment', `COMMENT')
@@ -2439,7 +2467,6 @@ changecom(`#')
 
 @cindex lexical structure of words
 @cindex words, lexical structure of
address@hidden changeword
 @quotation
 The macro @code{changeword} and all associated functionality is
 experimental.  It is only available if the @option{--enable-changeword}
@@ -2459,9 +2486,23 @@ Initially a word is defined by the follo
 [_a-zA-Z][_a-zA-Z0-9]*
 @end example
 
-Using @code{changeword}, you can change this regular expression.  Relaxing
address@hidden's lexical rules might be useful (for example) if you wanted to
-apply translations to a file of numbers:
+Using @code{changeword}, you can change this regular expression:
+
address@hidden {Optional builtin} changeword (@var{regex})
+Changes the regular expression for recognizing macro names to be
address@hidden  If @var{regex} is empty, use
address@hidden  @var{regex} must obey the constraint
+that every prefix of the desired final pattern is also accepted by the
+regular expression.  If @var{regex} contains grouping parentheses, the
+macro invoked is the portion that matched the first group, rather than
+the entire matching string.
+
+The expansion of @code{changeword} is void.
+The macro @code{changeword} is recognized only with parameters.
address@hidden deffn
+
+Relaxing the lexical rules of @code{m4} might be useful (for example) if
+you wanted to apply translations to a file of numbers:
 
 @example
 ifdef(`changeword', `', `m4exit(`77')')
@@ -2516,10 +2557,10 @@ macro invocation, so one can use @code{m
 scripts without getting @code{shift} commands swallowed, and plain
 text without losing various common words.
 
address@hidden's macro substitution is based on text, while @TeX{}'s is based
-on tokens.  @code{changeword} can throw this difference into relief.  For
-example, here is the same idea represented in @TeX{} and @code{m4}.
-First, the @TeX{} version:
+In @code{m4}, macro substitution is based on text, while in @TeX{}, it
+is based on tokens.  @code{changeword} can throw this difference into
+relief.  For example, here is the same idea represented in @TeX{} and
address@hidden  First, the @TeX{} version:
 
 @comment ignore
 @example
@@ -2563,15 +2604,11 @@ than the default regular expression.  Yo
 with the empty string to restore the default word definition, and regain
 the parsing speed.
 
-The builtin macro @code{changeword} is recognized only when given
-arguments.
-
 @node M4wrap
 @section Saving input
 
 @cindex saving input
 @cindex input, saving
address@hidden m4wrap
 It is possible to `save' some text until the end of the normal input has
 been seen.  Text can be saved, to be read again by @code{m4} when the
 normal input has been exhausted.  This feature is normally used to
@@ -2580,14 +2617,13 @@ files.
 
 To save input text, use the builtin @code{m4wrap}:
 
address@hidden ignore
address@hidden
-m4wrap(@var{string}, ...)
address@hidden example
address@hidden Builtin m4wrap (@ovar{string}, @dots{})
+Stores @var{string} in a safe place, to be reread when end of input is
+reached.  As a GNU extension, additional arguments are concatenated with
+a space to the @var{string}.
 
address@hidden
-which stores @var{string} and the rest of the arguments in a safe place,
-to be reread when end of input is reached.
+The expansion of @code{m4wrap} is void.
address@hidden deffn
 
 @example
 define(`cleanup', `This is the `cleanup' action.
@@ -2645,28 +2681,24 @@ f(`10')
 @node Include
 @section Including named files
 
address@hidden include
address@hidden sinclude
 There are two builtin macros in @code{m4} for including files:
 
address@hidden ignore
address@hidden
-include(@var{file})
-sinclude(@var{file})
address@hidden example
-
address@hidden
-both of which cause the file named @var{file} to be read by
address@hidden Builtin include (@var{file})
address@hidden Builtin sinclude (@var{file})
+Both macros cause the file named @var{file} to be read by
 @code{m4}.  When the end of the file is reached, input is resumed from
 the previous input file.
 
 The expansion of @code{include} and @code{sinclude} is therefore the
 contents of @var{file}.
 
-It is an error for an @code{include}d file not to exist.  If you do
-not want error messages about non-existent files, @code{sinclude} can
-be used to include a file, if it exists, expanding to nothing if it
-does not.  The empty string counts as a file that does not exist.
+If @var{file} does not exist (or cannot be read), the expansion is void,
+and @code{include} will fail with an error while @code{sinclude} is
+silent.  The empty string counts as a file that does not exist.
+
+The macros @code{include} and @code{sinclude} are recognized only with
+parameters.
address@hidden deffn
 
 @example
 include(`none')
@@ -2722,12 +2754,9 @@ This is `bar':  >>bar<<
 @end example
 
 This use of @code{include} is not trivial, though, as files can contain
-quotes, commas and parentheses, which can interfere with the way the
+quotes, commas, and parentheses, which can interfere with the way the
 @code{m4} parser works.
 
-The builtin macros @code{include} and @code{sinclude} are recognized
-only when given arguments.
-
 @node Search Path
 @section Searching for include files
 
@@ -2782,20 +2811,15 @@ limited by the number of available file 
 @cindex diverting output to files
 @cindex output, diverting to files
 @cindex files, diverting output to
address@hidden divert
 Output is diverted using @code{divert}:
 
address@hidden ignore
address@hidden
-divert(opt @var{number})
address@hidden example
-
address@hidden
-where @var{number} is the diversion to be used.  If @var{number} is left
address@hidden Builtin divert (@dvar{number, 0})
+The current diversion is changed to @var{number}.  If @var{number} is left
 out or empty, it is assumed to be zero.  If @var{number} cannot be
 parsed, the diversion is unchanged.
 
 The expansion of @code{divert} is void.
address@hidden deffn
 
 When all the @code{m4} input will have been processed, all existing
 diversions are automatically undiverted, in numerical order.
@@ -2846,21 +2870,17 @@ This is a common programming idiom in @c
 @node Undivert
 @section Undiverting output
 
address@hidden undivert
 Diverted text can be undiverted explicitly using the builtin
 @code{undivert}:
 
address@hidden ignore
address@hidden
-undivert(opt @var{number}, ...)
address@hidden example
-
address@hidden
-which undiverts the diversions given by the arguments, in the order
address@hidden Builtin undivert (@address@hidden)
+Undiverts the diversions given by the arguments, in the order
 given.  If no arguments are supplied, all diversions are undiverted, in
-numerical order.
+numerical order.  As a GNU extension, if @var{number} is not numeric,
+treat it as a file name instead.
 
 The expansion of @code{undivert} is void.
address@hidden deffn
 
 @example
 divert(`1')
@@ -2951,20 +2971,18 @@ include(`foo')
 @result{}
 @end example
 
+If the file is not found (or cannot be read), an error message is
+issued, and the expansion is void.
+
 @node Divnum
 @section Diversion numbers
 
 @cindex diversion numbers
address@hidden divnum
-The builtin @code{divnum}:
+The current diversion is tracked by the builtin @code{divnum}:
 
address@hidden ignore
address@hidden
-divnum
address@hidden example
-
address@hidden
-expands to the number of the current diversion.
address@hidden Builtin divnum
+Expands to the number of the current diversion.
address@hidden deffn
 
 @example
 Initial divnum
@@ -3007,6 +3025,10 @@ No output is produced at all.
 
 Clearing selected diversions can be done with the following macro:
 
address@hidden Composite cleardivert (@address@hidden)
+Discard the contents of each listed diversion.
address@hidden deffn
+
 @example
 define(`cleardivert',
 `pushdef(`_n', divnum)divert(`-1')undivert($@@)divert(_n)popdef(`_n')')
@@ -3015,7 +3037,7 @@ define(`cleardivert',
 
 It is called just like @code{undivert}, but the effect is to clear the
 diversions, given by the arguments.  (This macro has a nasty bug!  You
-should try to see if you can find it and correct it.  @xref{Answers}.)
+should try to see if you can find it and correct it.  @pxref{Answers})
 
 @node Text handling
 @chapter Macros for text handling
@@ -3038,16 +3060,13 @@ various ways, extracting substrings, sea
 
 @cindex length of strings
 @cindex strings, length of
address@hidden len
 The length of a string can be calculated by @code{len}:
 
address@hidden ignore
address@hidden
-len(@var{string})
address@hidden example
address@hidden Builtin len (@var{string})
+Expands to the length of @var{string}, as a decimal number.
 
address@hidden
-which expands to the length of @var{string}, as a decimal number.
+The macro @code{len} is recognized only with parameters.
address@hidden deffn
 
 @example
 len()
@@ -3056,25 +3075,20 @@ len(`abcdef')
 @result{}6
 @end example
 
-The builtin macro @code{len} is recognized only when given arguments.
-
 @node Index macro
 @section Searching for substrings
 
address@hidden index
 Searching for substrings is done with @code{index}:
 
address@hidden ignore
address@hidden
-index(@var{string}, @var{substring})
address@hidden example
-
address@hidden
-which expands to the index of the first occurrence of @var{substring} in
address@hidden Builtin index (@var{string}, @var{substring})
+Expands to the index of the first occurrence of @var{substring} in
 @var{string}.  The first character in @var{string} has index 0.  If
 @var{substring} does not occur in @var{string}, @code{index} expands to
 @samp{-1}.
 
+The macro @code{index} is recognized only with parameters.
address@hidden deffn
+
 @example
 index(`gnus, gnats, and armadillos', `nat')
 @result{}7
@@ -3082,24 +3096,16 @@ index(`gnus, gnats, and armadillos', `da
 @result{}-1
 @end example
 
-The builtin macro @code{index} is recognized only when given arguments.
-
 @node Regexp
 @section Searching for regular expressions
 
 @cindex regular expressions
 @cindex GNU extensions
address@hidden regexp
 Searching for regular expressions is done with the builtin
 @code{regexp}:
 
address@hidden ignore
address@hidden
-regexp(@var{string}, @var{regexp}, opt @var{replacement})
address@hidden example
-
address@hidden
-which searches for @var{regexp} in @var{string}.  The syntax for regular
address@hidden Builtin regexp (@var{string}, @var{regexp}, @ovar{replacement})
+Searches for @var{regexp} in @var{string}.  The syntax for regular
 expressions is the same as in GNU Emacs.
 @ifnothtml
 @xref{Regexps, , Syntax of Regular Expressions, emacs, The GNU Emacs
@@ -3125,7 +3131,8 @@ warning is issued if there were fewer su
 @address@hidden requested, or if there is a trailing @samp{\}.  If there
 was no match, @code{regexp} expands to the empty string.
 
-The builtin macro @code{regexp} is recognized only when given arguments.
+The macro @code{regexp} is recognized only with parameters.
address@hidden deffn
 
 @example
 regexp(`GNUs not Unix', `\<[a-z]\w+')
@@ -3154,20 +3161,18 @@ regexp(`abc', `b', `\1\')
 
 @cindex extracting substrings
 @cindex substrings, extracting
address@hidden substr
 Substrings are extracted with @code{substr}:
 
address@hidden ignore
address@hidden
-substr(@var{string}, @var{from}, opt @var{length})
address@hidden example
-
address@hidden
-which expands to the substring of @var{string}, which starts at index
address@hidden Builtin substr (@var{string}, @var{from}, @ovar{length})
+Expands to the substring of @var{string}, which starts at index
 @var{from}, and extends for @var{length} characters, or to the end of
 @var{string}, if @var{length} is omitted.  The starting index of a string
 is always 0.  The expansion is empty if there is an error parsing
address@hidden or @var{length}.
address@hidden or @var{length}, if @var{from} is beyond the end of
address@hidden, or if @var{length} is negative.
+
+The macro @code{substr} is recognized only with parameters.
address@hidden deffn
 
 @example
 substr(`gnus, gnats, and armadillos', `6')
@@ -3176,32 +3181,25 @@ substr(`gnus, gnats, and armadillos', `6
 @result{}gnats
 @end example
 
-The builtin macro @code{substr} is recognized only when given arguments.
-
 @node Translit
 @section Translating characters
 
 @cindex translating characters
 @cindex characters, translating
address@hidden translit
 Character translation is done with @code{translit}:
 
address@hidden ignore
address@hidden
-translit(@var{string}, @var{chars}, @var{replacement})
address@hidden example
-
address@hidden
-which expands to @var{string}, with each character that occurs in
address@hidden Builtin translit (@var{string}, @var{chars}, @ovar{replacement})
+Expands to @var{string}, with each character that occurs in
 @var{chars} translated into the character from @var{replacement} with
 the same index.
 
 If @var{replacement} is shorter than @var{chars}, the excess characters
 are deleted from the expansion.  If @var{replacement} is omitted, all
-characters in @var{string}, that are present in @var{chars} are deleted
+characters in @var{string} that are present in @var{chars} are deleted
 from the expansion.
 
-Both @var{chars} and @var{replacement} can contain character-ranges,
+As a GNU extension, both @var{chars} and @var{replacement} can contain
+character-ranges,
 e.g., @samp{a-z} (meaning all lowercase letters) or @samp{0-9} (meaning
 all digits).  To include a dash @samp{-} in @var{chars} or
 @var{replacement}, place it first or last.
@@ -3210,6 +3208,9 @@ It is not an error for the last characte
 than the first.  In that case, the range runs backwards, i.e.,
 @samp{9-0} means the string @samp{9876543210}.
 
+The macro @code{translit} is recognized only with parameters.
address@hidden deffn
+
 @example
 translit(`GNUs not Unix', `A-Z')
 @result{}s not nix
@@ -3224,9 +3225,6 @@ lowercase to uppercase, and the third `m
 while converting them to lowercase.  The two first cases are by far the
 most common.
 
-The builtin macro @code{translit} is recognized only when given
-arguments.
-
 @node Patsubst
 @section Substituting text by regular expression
 
@@ -3234,18 +3232,12 @@ arguments.
 @cindex pattern substitution
 @cindex substitution by regular expression
 @cindex GNU extensions
address@hidden patsubst
 Global substitution in a string is done by @code{patsubst}:
 
address@hidden ignore
address@hidden
-patsubst(@var{string}, @var{regexp}, opt @var{replacement})
address@hidden example
-
address@hidden
-which searches @var{string} for matches of @var{regexp}, and substitutes
address@hidden Builtin patsubst (@var{string}, @var{regexp}, @ovar{replacement})
+Searches @var{string} for matches of @var{regexp}, and substitutes
 @var{replacement} for each match.  The syntax for regular expressions
-is the same as in GNU Emacs.
+is the same as in GNU Emacs (@pxref{Regexp}).
 
 The parts of @var{string} that are not covered by any match of
 @var{regexp} are copied to the expansion.  Whenever a match is found, the
@@ -3266,8 +3258,8 @@ if there is a trailing @samp{\}.
 The @var{replacement} argument can be omitted, in which case the text
 matched by @var{regexp} is deleted.
 
-The builtin macro @code{patsubst} is recognized only when given
-arguments.
+The macro @code{patsubst} is recognized only with parameters.
address@hidden deffn
 
 @example
 patsubst(`GNUs not Unix', `^', `OBS: ')
@@ -3285,10 +3277,25 @@ patsubst(`GNUs not Unix', `not', `NOT\')
 @result{}GNUs NOT Unix
 @end example
 
+This example shows how @samp{\} is handled:
+
address@hidden
+patsubst(`GNUs not Unix', `\(not\)', `\\\10\a'
address@hidden example
+
 Here is a slightly more realistic example, which capitalizes individual
 word or whole sentences, by substituting calls of the macros
 @code{upcase} and @code{downcase} into the strings.
 
address@hidden Composite upcase (@var{text})
address@hidden Composite downcase (@var{text})
address@hidden Composite capitalize (@var{text})
+Expand to @var{text}, but with capitalization changed: @code{upcase}
+changes all letters to upper case, @code{downcase} changes all letters
+to lower case, and @code{capitalize} changes the first character of each
+word to upper case and the remaining characters to lower case.
address@hidden deffn
+
 @example
 define(`upcase', `translit(`$*', `a-z', `A-Z')')dnl
 define(`downcase', `translit(`$*', `A-Z', `a-z')')dnl
@@ -3323,18 +3330,16 @@ patreg(`aba abb 121', `\(.\)\(.\)\1', `\
 @cindex formatted output
 @cindex output, formatted
 @cindex GNU extensions
address@hidden format
 Formatted output can be made with @code{format}:
 
address@hidden ignore
address@hidden
-format(@var{format-string}, ...)
address@hidden example
address@hidden Builtin format (@var{format-string}, @dots{})
+Works much like the C function @code{printf}.  The first argument
address@hidden can contain @samp{%} specifications which are
+satisfied by additional arguments, and the expansion of @code{format} is
+the formatted string.
 
address@hidden
-which works much like the C function @code{printf}.  The first argument
-is a format string, which can contain @samp{%} specifications, and the
-expansion of @code{format} is the formatted string.
+The macro @code{format} is recognized only with parameters.
address@hidden deffn
 
 Its use is best described by a few examples:
 
@@ -3380,9 +3385,8 @@ C Library Manual.
 
 For now, unrecognized specifiers are silently ignored, but it is
 anticipated that a future release of GNU @code{m4} will support more
-specifiers, and give warnings when problems are encountered.
-
-The macro @code{format} is recognized only with parameters.
+specifiers, and give warnings when problems are encountered.  Likewise,
+escape sequences are not yet recognized.
 
 @node Arithmetic
 @chapter Macros for doing arithmetic
@@ -3403,22 +3407,19 @@ decrement operations.
 
 @cindex decrement operator
 @cindex increment operator
address@hidden incr
address@hidden decr
 Increment and decrement of integers are supported using the builtins
 @code{incr} and @code{decr}:
 
address@hidden ignore
address@hidden
-incr(@var{number})
-decr(@var{number})
address@hidden example
-
address@hidden
-which expand to the numerical value of @var{number}, incremented,
address@hidden Builtin incr (@var{number})
address@hidden Builtin decr (@var{number})
+Expand to the numerical value of @var{number}, incremented
 or decremented, respectively, by one.  Except for the empty string, the
 expansion is empty if @var{number} could not be parsed.
 
+The macros @code{incr} and @code{decr} are recognized only with
+parameters.
address@hidden deffn
+
 @example
 incr(`4')
 @result{}5
@@ -3432,26 +3433,21 @@ decr()
 @result{}-1
 @end example
 
-The builtin macros @code{incr} and @code{decr} are recognized only when
-given arguments.
-
 @node Eval
 @section Evaluating integer expressions
 
 @cindex integer expression evaluation
 @cindex evaluation, of integer expressions
 @cindex expressions, evaluation of integer
address@hidden eval
 Integer expressions are evaluated with @code{eval}:
 
address@hidden ignore
address@hidden
-eval(@var{expression}, opt @var{radix}, opt @var{width})
address@hidden example
address@hidden Builtin eval (@var{expression}, @dvar{radix, 10}, @ovar{width})
+Expands to the value of @var{expression}.  The expansion is empty
+if an error is encountered while parsing the arguments.  If specified,
address@hidden and @var{width} control the format of the output.
 
address@hidden
-which expands to the value of @var{expression}.  The expansion is empty
-if an error is encountered while parsing the arguments.
+The macro @code{eval} is recognized only with parameters.
address@hidden deffn
 
 Expressions can contain the following operators, listed in order of
 decreasing precedence.
@@ -3537,7 +3533,7 @@ eval(foo/6)
 @result{}111
 @end example
 
-As the second to last example shows, @code{eval} does not handle macro
+As the last two lines show, @code{eval} does not handle macro
 names, even if they expand to a valid expression (or part of a valid
 expression).  Therefore all macros must be expanded before they are
 passed to @code{eval}.
@@ -3590,8 +3586,6 @@ eval(`10', `16')
 @result{}a
 @end example
 
-The builtin macro @code{eval} is recognized only when given arguments.
-
 @node Shell commands
 @chapter Running shell commands
 
@@ -3630,18 +3624,18 @@ platform @code{m4} is running on.  GNU @
 macros that are predefined to expand to the empty string; checking for
 their existence will confirm platform details.
 
address@hidden ignore
address@hidden
-__gnu__
-__os2__
-os2
-__unix__
-unix
-__windows__
-windows
address@hidden example
address@hidden {Optional builtin} __gnu__
address@hidden {Optional builtin} __os2__
address@hidden {Optional builtin} os2
address@hidden {Optional builtin} __unix__
address@hidden {Optional builtin} unix
address@hidden {Optional builtin} __windows__
address@hidden {Optional builtin} windows
+Each of these macros is conditionally defined as needed to describe the
+environment of @code{m4}.  If defined, each macro expands to the empty
+string.
address@hidden deffn
 
address@hidden gnu
 When GNU extensions are in effect (that is, when you did not use the
 @option{-G} option), GNU @code{m4} will define the macro @code{__gnu__} to
 expand to the empty string.
@@ -3653,21 +3647,15 @@ ifdef(`__gnu__', `Extensions are active'
 @result{}Extensions are active
 @end example
 
address@hidden unix
 @cindex platform macro
-On UNIX systems, GNU @code{m4} without the @option{-G} option will define
-the macro @code{__unix__}, otherwise the macro @code{unix}.  Both will
-expand to the empty string.
+On UNIX systems, GNU @code{m4} will define @code{__unix__} by default,
+or @code{unix} when the @option{-G} option is specified.
 
address@hidden windows
-On native Windows systems, GNU @code{m4} without the @option{-G} option
-will define the macro @code{__windows__}, otherwise the macro
address@hidden  Both will expand to the empty string.
-
address@hidden os2
-On OS/2 systems, GNU @code{m4} without the @option{-G} option will define
-the macro @code{__os2__}, otherwise the macro @code{os2}.  Both will
-expand to the empty string.
+On native Windows systems, GNU @code{m4} will define @code{__windows__}
+by default, or @code{windows} when the @option{-G} option is specified.
+
+On OS/2 systems, GNU @code{m4} will define @code{__os2__} by default, or
address@hidden when the @option{-G} option is specified.
 
 If GNU @code{m4} does not provide a platform macro for your system,
 please report that as a bug.
@@ -3688,16 +3676,10 @@ provided
 @node Syscmd
 @section Executing simple commands
 
address@hidden syscmd
 Any shell command can be executed, using @code{syscmd}:
 
address@hidden ignore
address@hidden
-syscmd(@var{shell-command})
address@hidden example
-
address@hidden
-which executes @var{shell-command} as a shell command.
address@hidden Builtin syscmd (@var{shell-command})
+Executes @var{shell-command} as a shell command.
 
 The expansion of @code{syscmd} is void, @emph{not} the output from
 @var{shell-command}!  Output or error messages from @var{shell-command}
@@ -3708,6 +3690,9 @@ Prior to executing the command, @code{m4
 The default standard input, output and error of @var{shell-command} are
 the same as those of @code{m4}.
 
+The macro @code{syscmd} is recognized only with parameters.
address@hidden deffn
+
 @example
 define(`foo', `FOO')
 @result{}
@@ -3719,23 +3704,15 @@ syscmd(`echo foo')
 Note how the expansion of @code{syscmd} keeps the trailing newline of
 the command, as well as using the newline that appeared after the macro.
 
-The builtin macro @code{syscmd} is recognized only when given arguments.
-
 @node Esyscmd
 @section Reading the output of commands
 
address@hidden esyscmd
 @cindex GNU extensions
 If you want @code{m4} to read the output of a shell command, use
 @code{esyscmd}:
 
address@hidden ignore
address@hidden
-esyscmd(@var{shell-command})
address@hidden example
-
address@hidden
-which expands to the standard output of the shell command
address@hidden Builtin esyscmd (@var{shell-command})
+Expands to the standard output of the shell command
 @var{shell-command}.
 
 Prior to executing the command, @code{m4} flushes its output buffers.
@@ -3744,6 +3721,9 @@ the same as those of @code{m4}.  The err
 is not a part of the expansion: it will appear along with the error
 output of @code{m4}.
 
+The macro @code{esyscmd} is recognized only with parameters.
address@hidden deffn
+
 @example
 define(`foo', `FOO')
 @result{}
@@ -3755,9 +3735,6 @@ esyscmd(`echo foo')
 Note how the expansion of @code{esyscmd} keeps the trailing newline of
 the command, as well as using the newline that appeared after the macro.
 
-The builtin macro @code{esyscmd} is recognized only when given
-arguments.
-
 @node Sysval
 @section Exit codes
 
@@ -3767,17 +3744,13 @@ arguments.
 @cindex exit code from shell commands
 @cindex shell commands, exit code from
 @cindex commands, exit code from shell
address@hidden sysval
 To see whether a shell command succeeded, use @code{sysval}:
 
address@hidden ignore
address@hidden
-sysval
address@hidden example
-
address@hidden
-which expands to the exit status of the last shell command run with
address@hidden or @code{esyscmd}.
address@hidden Builtin sysval
+Expands to the exit status of the last shell command run with
address@hidden or @code{esyscmd}.  Expands to 0 if no command has been
+run yet.
address@hidden deffn
 
 @example
 syscmd(`false')
@@ -3835,23 +3808,19 @@ sysval
 
 @cindex temporary file names
 @cindex files, names of temporary
address@hidden maketemp
 Commands specified to @code{syscmd} or @code{esyscmd} might need a
 temporary file, for output or for some other purpose.
 There is a builtin macro, @code{maketemp}, for making temporary file
 names:
 
address@hidden ignore
address@hidden
-maketemp(@var{template})
address@hidden example
-
address@hidden
-which expands to a name of a new, empty file, made from the string
address@hidden Builtin maketemp (@var{template})
+Expands to a name of a new, empty file, made from the string
 @var{template}, which should end with the string @samp{XXXXXX}.  The six
address@hidden's are then replaced, usually with something that includes the
-process id of the @code{m4} process, in order to make the file name
-unique.
address@hidden characters are then replaced with random data, in order to make
+the file name unique.
+
+The macro @code{maketemp} is recognized only with parameters.
address@hidden deffn
 
 @comment ignore
 @example
@@ -3882,9 +3851,6 @@ sysval
 @end example
 @end ignore
 
-The builtin macro @code{maketemp} is recognized only when given
-arguments.
-
 @node Miscellaneous
 @chapter Miscellaneous builtin macros
 
@@ -3902,19 +3868,14 @@ any of the previous chapters.
 @cindex printing error messages
 @cindex error messages, printing
 @cindex messages, printing error
address@hidden errprint
 You can print error messages using @code{errprint}:
 
address@hidden ignore
address@hidden
-errprint(@var{message}, ...)
address@hidden example
-
address@hidden
-which simply prints @var{message} and the rest of the arguments on the
-standard error output.
address@hidden Builtin errprint (@var{message}, @dots{})
+Prints @var{message} and the rest of the arguments on the
+standard error output, separated by spaces.
 
 The expansion of @code{errprint} is void.
address@hidden deffn
 
 @example
 errprint(`Invalid arguments to forloop
@@ -3924,23 +3885,19 @@ errprint(`Invalid arguments to forloop
 @end example
 
 A trailing newline is @emph{not} printed automatically, so it must be
-supplied as part of the argument, as in the example.  (BSD flavored
address@hidden's do append a trailing newline on each @code{errprint} call).
+supplied as part of the argument, as in the example.  BSD
+implementations of @code{m4} do append a trailing newline on each
address@hidden call, while some other implementations only print the
+first argument.
 
 To make it possible to specify the location of the error, two
 utility builtins exist:
 
address@hidden file
address@hidden line
address@hidden ignore
address@hidden
-__file__
-__line__
address@hidden example
-
address@hidden
-which expands to the quoted name of the current input file, and the
address@hidden Builtin __file__
address@hidden Builtin __line__
+Expand to the quoted name of the current input file, and the
 current input line number in that file.
address@hidden deffn
 
 @example
 errprint(`m4:'__file__:__line__: `input error
@@ -3953,18 +3910,22 @@ errprint(`m4:'__file__:__line__: `input 
 @section Exiting from @code{m4}
 
 @cindex exiting from @code{m4}
address@hidden m4exit
 If you need to exit from @code{m4} before the entire input has been
 read, you can use @code{m4exit}:
 
address@hidden ignore
address@hidden
-m4exit(opt @var{code})
address@hidden example
-
address@hidden
-which causes @code{m4} to exit, with exit code @var{code}.  If
address@hidden is left out, the exit code is zero.
address@hidden Builtin m4exit (@dvar{code, 0})
+Causes @code{m4} to exit, with exit code @var{code}.  If @var{code} is
+left out, the exit code is zero.  No further input is read, and all
+wrapped and diverted text is discarded.
address@hidden deffn
+
+A common use of this is to abort processing:
+
address@hidden Composite fatal_error (@var{message})
+Abort processing with an error message and non-zero status.  Prefix
address@hidden with details about where the error occurred, and print the
+resulting string to standard error.
address@hidden deffn
 
 @example
 define(`fatal_error',
@@ -3996,7 +3957,7 @@ Some bigger @code{m4} applications may b
 containing hundreds of definitions and other costly initializations.
 Usually, the common base is kept in one or more declarative files,
 which files are listed on each @code{m4} invocation prior to the
-user's input file, or else, @code{include}'d from this input file.
+user's input file, or else each input file uses @code{include}.
 
 Reading the common base of a big application, over and over again, may
 be time consuming.  GNU @code{m4} offers some machinery to speed up
@@ -4045,15 +4006,15 @@ m4 -R base.m4f input3.m4
 
 @noindent
 with the varying input.  The first call, containing the @option{-F}
-option, only reads and executes file @file{base.m4}, so defining
-various application macros and computing other initializations.  Only
-once the input file @file{base.m4} has been completely processed, GNU
+option, only reads and executes file @file{base.m4}, defining
+various application macros and computing other initializations.
+Once the input file @file{base.m4} has been completely processed, GNU
 @code{m4} produces on @file{base.m4f} a @dfn{frozen} file, that is, a
 file which contains a kind of snapshot of the @code{m4} internal state.
 
 Later calls, containing the @option{-R} option, are able to reload
-the internal state of @code{m4}'s memory, from @file{base.m4f},
address@hidden to reading any other input files.  By this mean,
+the internal state of @code{m4}, from @file{base.m4f},
address@hidden to reading any other input files.  This means
 instead of starting with a virgin copy of @code{m4}, input will be
 read after having effectively recovered the effect of a prior run.
 In our example, the effect is the same as if file @file{base.m4} has
@@ -4086,10 +4047,10 @@ Some care is necessary because not every
 this to work in all cases.  In particular, the trace attribute of
 macros is not handled, nor the current setting of @code{changeword}.
 Currently, @code{m4wrap} and @code{sysval} also have problems.
-Also, interactions for some options of @code{m4} being used in one call
-and not for the next, have not been fully analyzed yet.  On the other
-end, you may be confident that stacks of @code{pushdef}'ed definitions
-are handled correctly, so are @code{undefine}'d or renamed builtins,
+Also, interactions for some options of @code{m4}, being used in one call
+and not in the next, have not been fully analyzed yet.  On the other
+end, you may be confident that stacks of @code{pushdef} definitions
+are handled correctly, as well as undefined or renamed builtins, and
 changed strings for quotes or comments.  And future releases of GNU M4
 will improve on the utility of frozen files.
 
@@ -4109,13 +4070,14 @@ Path}).
 Frozen files are sharable across architectures.  It is safe to write
 a frozen file on one machine and read it on another, given that the
 second machine uses the same, or a newer version of GNU @code{m4}.
-It is convention, but not required, to give a frozen file the suffix of
address@hidden
+It is conventional, but not required, to give a frozen file the suffix
+of @code{.m4f}.
 
 These are simple (editable) text files, made up of directives,
 each starting with a capital letter and ending with a newline
 (@key{NL}).  Wherever a directive is expected, the character
address@hidden introduces a comment line, empty lines are also ignored.
address@hidden introduces a comment line; empty lines are also ignored if they
+are not part of an embedded string.
 In the following descriptions, each @var{len} refers to the length of
 the corresponding strings @var{str} in the next line of input.  Numbers
 are always expressed in decimal.  There are no escape characters.  The
@@ -4133,8 +4095,9 @@ Selects diversion @var{number}, making i
 number for a non-existing diversion.  To merely specify an active
 selection, use this command with an empty @var{str}.  With 0 as the
 diversion @var{number}, @var{str} will be issued on standard output
-at reload time, however @code{m4} will not produce the @samp{D}
-directive with non-zero length for diversion 0.  This directive may
+at reload time.  GNU @code{m4} will not produce the @samp{D}
+directive with non-zero length for diversion 0, but this can be done
+with manual edits.  This directive may
 appear more than once for the same diversion, in which case the
 diversion is the concatenation of the various uses.  If omitted, then
 diversion 0 is current.
@@ -4189,7 +4152,7 @@ is made to summarize these here.
 @section Extensions in GNU @code{m4}
 
 @cindex GNU extensions
-This version of @code{m4} contains a few facilities, that do not exist
+This version of @code{m4} contains a few facilities that do not exist
 in System V @code{m4}.  These extra facilities are all suppressed by
 using the @option{-G} command line option, unless overridden by other
 command line options.
@@ -4352,12 +4315,11 @@ But GNU @code{m4} ignores certain builti
 arguments, giving @code{adefineb} for the above example.
 
 @item
-Traditional implementations treat @code{define(`f',`1')} (@pxref{Define})
-as though it were @code{undefine(`f')pushdef(`f',`1')}, effectively
-replacing the entire stack of previously pushdef'd definitions with a
-single definition.  GNU @code{m4} behaves as
address@hidden(`f')pushdef(`f',`1')}, keeping all previous definitions on
-the stack intact.
+Traditional implementations handle @code{define(`f',`1')} (@pxref{Define})
+by undefining the entire stack of previous definitions, and if doing
address@hidden(`f')} first.  GNU @code{m4} replaces just the top
+definition on the stack, as if doing @code{popdef(`f')} followed by
address@hidden(`f',`1')}.
 
 @item
 @acronym{POSIX} requires @code{syscmd} (@pxref{Syscmd}) to evaluate
@@ -4440,7 +4402,7 @@ diverted text as being generated by the 
 @code{undivert} call, whereas GNU @code{m4} regards the diverted text as
 being generated at the time it is diverted.
 
-I expect the sync line option to be used mostly when using @code{m4} as
+The sync line option is used mostly when using @code{m4} as
 a front end to a compiler.  If a diverted line causes a compiler error,
 the error messages should most probably refer to the place where the
 diversion were made, and not where it was inserted again.
@@ -4541,8 +4503,7 @@ undivert
 @appendixsec Macro index
 
 References are exclusively to the places where a builtin is introduced
-the first time.  Names starting and ending with @samp{__} have these
-characters removed in the index.
+the first time.
 
 @iftex
 @sp 1

reply via email to

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