m4-commit
[Top][All Lists]
Advanced

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

Changes to m4/doc/m4.info [branch-1_4]


From: Gary V . Vaughan
Subject: Changes to m4/doc/m4.info [branch-1_4]
Date: Tue, 18 Oct 2005 07:29:14 -0400

Index: m4/doc/m4.info
diff -u m4/doc/m4.info:1.1.1.1.2.9 m4/doc/m4.info:removed
--- m4/doc/m4.info:1.1.1.1.2.9  Fri Apr  1 16:51:16 2005
+++ m4/doc/m4.info      Tue Oct 18 11:29:14 2005
@@ -1,3200 +0,0 @@
-This is m4.info, produced by makeinfo version 4.8 from m4.texinfo.
-
-INFO-DIR-SECTION GNU programming tools
-START-INFO-DIR-ENTRY
-* m4: (m4).                    A powerful macro processor.
-END-INFO-DIR-ENTRY
-
-   This file documents GNU M4 1.4.3a.
-
-   Copyright (C) 1989, 1990, 1991, 1992, 1993, 1994, 2004, 2005 Free
-Software Foundation, Inc.
-
-   Permission is granted to make and distribute verbatim copies of this
-manual provided the copyright notice and this permission notice are
-preserved on all copies.
-
-   Permission is granted to copy and distribute modified versions of
-this manual under the conditions for verbatim copying, provided that
-the entire resulting derived work is distributed under the terms of a
-permission notice identical to this one.
-
-   Permission is granted to copy and distribute translations of this
-manual into another language, under the above conditions for modified
-versions, except that this permission notice may be stated in a
-translation approved by the Foundation.
-
-
-File: m4.info,  Node: Top,  Next: Preliminaries,  Prev: (dir),  Up: (dir)
-
-GNU M4
-******
-
-GNU `m4' is an implementation of the traditional UNIX macro processor.
-It is mostly SVR4 compatible, although it has some extensions (for
-example, handling more than 9 positional parameters to macros).  `m4'
-also has builtin functions for including files, running shell commands,
-doing arithmetic, etc.  Autoconf needs GNU `m4' for generating
-`configure' scripts, but not for running them.
-
-   GNU `m4' was originally written by Rene' Seindal, with subsequent
-changes by Franc,ois Pinard and other volunteers on the Internet.  All
-names and email addresses can be found in the file `THANKS' from the
-GNU `m4' distribution.
-
-   This is release 1.4.3a.  It is now to be considered stable, future
-releases are only meant to fix bugs, increase speed, or improve
-documentation.  However...
-
-   An experimental feature, which would improve `m4' usefulness, allows
-for changing the syntax for what is a "word" in `m4'.  You should use:
-     ./configure --enable-changeword
-   if you want this feature compiled in.  The current implementation
-slows down `m4' considerably and is hardly acceptable.  So, it might go
-away, do not count on it yet.
-
-* Menu:
-
-* Preliminaries::               Introduction and preliminaries
-* Syntax::                      Lexical and syntactic conventions
-
-* Macros::                      How to invoke macros
-* Definitions::                 How to define new macros
-* Conditionals::                Conditionals and loops
-
-* Debugging::                   How to debug macros and input
-
-* Input Control::               Input control
-* File Inclusion::              File inclusion
-* Diversions::                  Diverting and undiverting output
-
-* Text handling::               Macros for text handling
-* Arithmetic::                  Macros for doing arithmetic
-* UNIX commands::               Macros for running UNIX commands
-* Miscellaneous::               Miscellaneous builtin macros
-* Frozen files::                Fast loading of frozen states
-
-* Compatibility::               Compatibility with other versions of m4
-* Concept index::               Index for many concepts
-* Macro index::                 Index for all m4 macros
-
- --- The Detailed Node Listing ---
-
-Introduction and preliminaries
-
-* Intro::                       Introduction to `m4'
-* History::                     Historical references
-
-* Invoking m4::                 Invoking `m4'
-* Bugs::                        Problems and bugs
-* Manual::                      Using this manual
-
-Lexical and syntactic conventions
-
-* Names::                       Macro names
-* Quoted strings::              Quoting input to m4
-* Other tokens::                Other kinds of input tokens
-* Comments::                    Comments in m4 input
-
-How to invoke macros
-
-* Invocation::                  Macro invocation
-* Inhibiting Invocation::       Preventing macro invocation
-* Macro Arguments::             Macro arguments
-* Quoting Arguments::           On Quoting Arguments to macros
-* Macro expansion::             Expanding macros
-
-How to define new macros
-
-* Define::                      Defining a new macro
-* Arguments::                   Arguments to macros
-* Pseudo Arguments::            Pseudo arguments to macros
-* Undefine::                    Deleting a macro
-* Defn::                        Renaming macros
-* Pushdef::                     Temporarily redefining macros
-
-* Indir::                       Indirect call of macros
-* Builtin::                     Indirect call of builtins
-
-Conditionals, loops and recursion
-
-* Ifdef::                       Testing if a macro is defined
-* Ifelse::                      If-else construct, or multibranch
-* Loops::                       Loops and recursion in m4
-
-How to debug macros and input
-
-* Dumpdef::                     Displaying macro definitions
-* Trace::                       Tracing macro calls
-* Debug Levels::                Controlling debugging output
-* Debug Output::                Saving debugging output
-
-Input control
-
-* Dnl::                         Deleting whitespace in input
-* Changequote::                 Changing the quote characters
-* Changecom::                   Changing the comment delimiters
-* Changeword::                  Changing the lexical structure of words
-* M4wrap::                      Saving input until end of input
-
-File inclusion
-
-* Include::                     Including named files
-* Search Path::                 Searching for include files
-
-Diverting and undiverting output
-
-* Divert::                      Diverting output
-* Undivert::                    Undiverting output
-* Divnum::                      Diversion numbers
-* Cleardiv::                    Discarding diverted text
-
-Macros for text handling
-
-* Len::                         Calculating length of strings
-* Index macro::                 Searching for substrings
-* Regexp::                      Searching for regular expressions
-* Substr::                      Extracting substrings
-* Translit::                    Translating characters
-* Patsubst::                    Substituting text by regular expression
-* Format::                      Formatting strings (printf-like)
-
-Macros for doing arithmetic
-
-* Incr::                        Decrement and increment operators
-* Eval::                        Evaluating integer expressions
-
-Running UNIX commands
-
-* Syscmd::                      Executing simple commands
-* Esyscmd::                     Reading the output of commands
-* Sysval::                      Exit codes
-* Maketemp::                    Making names for temporary files
-
-Miscellaneous builtin macros
-
-* Errprint::                    Printing error messages
-* M4exit::                      Exiting from m4
-
-Compatibility with other versions of `m4'
-
-* Extensions::                  Extensions in GNU m4
-* Incompatibilities::           Facilities in System V m4 not in GNU m4
-* Other Incompat::              Other incompatibilities
-
-
-File: m4.info,  Node: Preliminaries,  Next: Syntax,  Prev: Top,  Up: Top
-
-1 Introduction and preliminaries
-********************************
-
-This first chapter explains what is GNU `m4', where `m4' comes from,
-how to read and use this documentation, how to call the `m4' program
-and how to report bugs about it.  It concludes by giving tips for
-reading the remainder of the manual.
-
-   The following chapters then detail all the features of the `m4'
-language.
-
-* Menu:
-
-* Intro::                       Introduction to `m4'
-* History::                     Historical references
-* Invoking m4::                 Invoking `m4'
-* Bugs::                        Problems and bugs
-* Manual::                      Using this manual
-
-
-File: m4.info,  Node: Intro,  Next: History,  Prev: Preliminaries,  Up: 
Preliminaries
-
-1.1 Introduction to `m4'
-========================
-
-`m4' is a macro processor, in the sense that it copies its input to the
-output, expanding macros as it goes.  Macros are either builtin or
-user-defined, and can take any number of arguments.  Besides just doing
-macro expansion, `m4' has builtin functions for including named files,
-running UNIX commands, doing integer arithmetic, manipulating text in
-various ways, recursion, etc...  `m4' can be used either as a front-end
-to a compiler, or as a macro processor in its own right.
-
-   The `m4' macro processor is widely available on all UNIXes.
-Usually, only a small percentage of users are aware of its existence.
-However, those who do often become commited users.  The growing
-popularity of GNU Autoconf, which prerequires GNU `m4' for _generating_
-the `configure' scripts, is an incentive for many to install it, while
-these people will not themselves program in `m4'.  GNU `m4' is mostly
-compatible with the System V, Release 3 version, except for some minor
-differences.  *Note Compatibility::, for more details.
-
-   Some people found `m4' to be fairly addictive.  They first use `m4'
-for simple problems, then take bigger and bigger challenges, learning
-how to write complex `m4' sets of macros along the way.  Once really
-addicted, users pursue writing of sophisticated `m4' applications even
-to solve simple problems, devoting more time debugging their `m4'
-scripts than doing real work.  Beware that `m4' may be dangerous for
-the health of compulsive programmers.
-
-
-File: m4.info,  Node: History,  Next: Invoking m4,  Prev: Intro,  Up: 
Preliminaries
-
-1.2 Historical references
-=========================
-
-The historical notes included here are fairly incomplete, and not
-authoritative at all.  Please knowledgeable users help us to more
-properly write this section.
-
-   `GPM' has been an important ancestor of `m4'.  See C. Stratchey: "A
-General Purpose Macro generator", Computer Journal 8,3 (1965), pp. 225
-ff.  `GPM' is also succintly described into David Gries classic
-"Compiler Construction for Digital Computers".
-
-   While `GPM' was _pure_, `m4' was meant to deal more with the true
-intricacies of real life: macros could be recognized with being
-pre-announced, skipping whitespace or end-of-lines was made easier,
-more constructs were builtin instead of derived, etc.
-
-   Originally, `m4' was the engine for Rational FORTRAN preprocessor,
-that is, the `ratfor' equivalent of `cpp'.
-
-
-File: m4.info,  Node: Invoking m4,  Next: Bugs,  Prev: History,  Up: 
Preliminaries
-
-1.3 Invoking `m4'
-=================
-
-The format of the `m4' command is:
-
-     `m4' [OPTION...] [MACRO-DEFINITIONS...] [INPUT-FILE...]
-
-   All options begin with `-', or if long option names are used, with a
-`--'.  A long option name need not be written completely, and
-unambigous prefix is sufficient.  `m4' understands the following
-options:
-
-`--version'
-     Print the version number of the program on standard output, then
-     immediately exit `m4' without reading any INPUT-FILES.
-
-`--help'
-     Print an help summary on standard output, then immediately exit
-     `m4' without reading any INPUT-FILES.
-
-`-G'
-`--traditional'
-     Suppress all the extensions made in this implementation, compared
-     to the System V version.  *Note Compatibility::, for a list of
-     these.
-
-`-E'
-`--fatal-warnings'
-     Stop execution and exit `m4' once the first warning has been
-     issued, considering all of them to be fatal.
-
-`-dFLAGS'
-`--debug=FLAGS'
-     Set the debug-level according to the flags FLAGS.  The debug-level
-     controls the format and amount of information presented by the
-     debugging functions.  *Note Debug Levels::, for more details on
-     the format and meaning of FLAGS.
-
-`-lNUM'
-`--arglength=NUM'
-     Restrict the size of the output generated by macro tracing.  *Note
-     Debug Levels::, for more details.
-
-`-oFILE'
-`--error-output=FILE'
-     Redirect debug and trace output to the named file.  Error messages
-     are still printed on the standard error output.  *Note Debug
-     Output::, for more details.
-
-`-IDIR'
-`--include=DIR'
-     Make `m4' search DIR for included files that are not found in the
-     current working directory.  *Note Search Path::, for more details.
-
-`-e'
-`--interactive'
-     Makes this invocation of `m4' interactive.  This means that all
-     output will be unbuffered, and interrupts will be ignored.
-
-`-s'
-`--synclines'
-     Generate synchronisation lines, for use by the C preprocessor or
-     other similar tools.  This is useful, for example, when `m4' is
-     used as a front end to a compiler.  Source file name and line
-     number information is conveyed by directives of the form `#line
-     LINENUM "FILENAME"', which are inserted as needed into the middle
-     of the input.  Such directives mean that the following line
-     originated or was expanded from the contents of input file
-     FILENAME at line LINENUM.  The `"FILENAME"' part is often omitted
-     when the file name did not change from the previous directive.
-
-     Synchronisation directives are always given on complete lines per
-     themselves.  When a synchronisation discrepancy occurs in the
-     middle of an output line, the associated synchronisation directive
-     is delayed until the beginning of the next generated line.
-
-`-P'
-`--prefix-builtins'
-     Internally modify _all_ builtin macro names so they all start with
-     the prefix `m4_'.  For example, using this option, one should write
-     `m4_define' instead of `define', and `m4___file__' instead of
-     `__file__'.
-
-`-WREGEXP'
-`--word-regexp=REGEXP'
-     Use an alternative syntax for macro names.  This experimental
-     option might not be present on all GNU `m4' implementations.
-     (*note Changeword::).
-
-`-HN'
-`--hashsize=N'
-     Make the internal hash table for symbol lookup be N entries big.
-     The number should be prime.  The default is 509 entries.  It
-     should not be necessary to increase this value, unless you define
-     an excessive number of macros.
-
-`-LN'
-`--nesting-limit=N'
-     Artificially limit the nesting of macro calls to N levels,
-     stopping program execution if this limit is ever exceeded.  When
-     not specified, nesting is limited to 250 levels.
-
-     The precise effect of this option might be more correctly
-     associated with textual nesting than dynamic recursion.  It has
-     been useful when some complex `m4' input was generated by
-     mechanical means.  Most users would never need this option.  If
-     shown to be obtrusive, this option (which is still experimental)
-     might well disappear.
-
-     This option does _not_ have the ability to break endless
-     rescanning loops, while these do not necessarily consume much
-     memory or stack space.  Through clever usage of rescanning loops,
-     one can request complex, time-consuming computations to `m4' with
-     useful results.  Putting limitations in this area would break `m4'
-     power.  There are many pathological cases: `define(`a', `a')a' is
-     only the simplest example (but *note Compatibility::).  Expecting
-     GNU `m4' to detect these would be a little like expecting a
-     compiler system to detect and diagnose endless loops: it is a
-     quite _hard_ problem in general, if not undecidable!
-
-`-Q'
-`--quiet'
-`--silent'
-     Suppress warnings about missing or superflous arguments in macro
-     calls.
-
-`-B'
-`-S'
-`-T'
-     These options are present for compatibility with System V `m4', but
-     do nothing in this implementation.
-
-`-NN'
-`--diversions=N'
-     These options are present only for compatibility with previous
-     versions of GNU `m4', and were controlling the number of possible
-     diversions which could be used at the same time.  They do nothing,
-     because there is no fixed limit anymore.
-
-
-   Macro definitions and deletions can be made on the command line, by
-using the `-D' and `-U' options.  They have the following format:
-
-`-DNAME'
-`-DNAME=VALUE'
-`--define=NAME'
-`--define=NAME=VALUE'
-     This enters NAME into the symbol table, before any input files are
-     read.  If `=VALUE' is missing, the value is taken to be the empty
-     string.  The VALUE can be any string, and the macro can be defined
-     to take arguments, just as if it was defined from within the input.
-
-`-UNAME'
-`--undefine=NAME'
-     This deletes any predefined meaning NAME might have.  Obviously,
-     only predefined macros can be deleted in this way.
-
-`-tNAME'
-`--trace=NAME'
-     This enters NAME into the symbol table, as undefined but traced.
-     The macro will consequently be traced from the point it is defined.
-
-`-FFILE'
-`--freeze-state FILE'
-     Once execution is finished, write out the frozen state on the
-     specified FILE (*note Frozen files::).
-
-`-RFILE'
-`--reload-state FILE'
-     Before execution starts, recover the internal state from the
-     specified frozen FILE (*note Frozen files::).
-
-
-   The remaining arguments on the command line are taken to be input
-file names.  If no names are present, the standard input is read.  A
-file name of `-' is taken to mean the standard input.
-
-   The input files are read in the sequence given.  The standard input
-can only be read once, so the filename `-' should only appear once on
-the command line.
-
-
-File: m4.info,  Node: Bugs,  Next: Manual,  Prev: Invoking m4,  Up: 
Preliminaries
-
-1.4 Problems and bugs
-=====================
-
-If you have problems with GNU `m4' or think you've found a bug, please
-report it.  Before reporting a bug, make sure you've actually found a
-real bug.  Carefully reread the documentation and see if it really says
-you can do what you're trying to do.  If it's not clear whether you
-should be able to do something or not, report that too; it's a bug in
-the documentation!
-
-   Before reporting a bug or trying to fix it yourself, try to isolate
-it to the smallest possible input file that reproduces the problem.
-Then send us the input file and the exact results `m4' gave you.  Also
-say what you expected to occur; this will help us decide whether the
-problem was really in the documentation.
-
-   Once you've got a precise problem, send e-mail to (Internet)
address@hidden' or (UUCP)
-`mit-eddie!prep.ai.mit.edu!bug-gnu-utils'.  Please include the version
-number of `m4' you are using.  You can get this information with the
-command `m4 --version'.
-
-   Non-bug suggestions are always welcome as well.  If you have
-questions about things that are unclear in the documentation or are
-just obscure features, please report them too.
-
-
-File: m4.info,  Node: Manual,  Prev: Bugs,  Up: Preliminaries
-
-1.5 Using this manual
-=====================
-
-This manual contains a number of examples of `m4' input and output, and
-a simple notation is used to distinguish input, output and error
-messages from `m4'.  Examples are set out from the normal text, and
-shown in a fixed width font, like this
-
-     This is an example of an example!
-
-   To distinguish input from output, all output from `m4' is prefixed
-by the string `=>', and all error messages by the string `error-->'.
-Thus
-
-     Example of input line
-     =>Output line from m4
-     error-->and an error message
-
-   As each of the predefined macros in `m4' is described, a prototype
-call of the macro will be shown, giving descriptive names to the
-arguments, e.g.,
-
-     regexp(STRING, REGEXP, opt REPLACEMENT)
-
-   All macro arguments in `m4' are strings, but some are given special
-interpretation, e.g., as numbers, filenames, regular expressions, etc.
-
-   The `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 (`...') last in the argument list indicates that any number of
-arguments may follow.
-
-   This document consistently writes and uses "builtin", without an
-hyphen, as if it were an English word.  This is how the `builtin'
-primitive is spelled within `m4'.
-
-
-File: m4.info,  Node: Syntax,  Next: Macros,  Prev: Preliminaries,  Up: Top
-
-2 Lexical and syntactic conventions
-***********************************
-
-As `m4' reads its input, it separates it into "tokens".  A token is
-either a name, a quoted string, or any single character, that is not a
-part of either a name or a string.  Input to `m4' can also contain
-comments.
-
-* Menu:
-
-* Names::                       Macro names
-* Quoted strings::              Quoting input to m4
-* Other tokens::                Other kinds of input tokens
-* Comments::                    Comments in m4 input
-
-
-File: m4.info,  Node: Names,  Next: Quoted strings,  Prev: Syntax,  Up: Syntax
-
-2.1 Names
-=========
-
-A name is any sequence of letters, digits, and the character `_'
-(underscore), where the first character is not a digit.  If a name has
-a macro definition, it will be subject to macro expansion (*note
-Macros::).
-
-   Examples of legal names are: `foo', `_tmp', and `name01'.
-
-
-File: m4.info,  Node: Quoted strings,  Next: Other tokens,  Prev: Names,  Up: 
Syntax
-
-2.2 Quoted strings
-==================
-
-A quoted string is a sequence of characters surrounded by the quotes
-``' and `'', where the number of start and end quotes within the string
-balances.  The value of a string token is the text, with one level of
-quotes stripped off.  Thus
-
-     `'
-
-   is the empty string, and
-
-     ``quoted''
-
-   is the string
-
-     `quoted'
-
-   The quote characters can be changed at any time, using the builtin
-macro `changequote'.  *Note Changequote::, for more information.
-
-
-File: m4.info,  Node: Other tokens,  Next: Comments,  Prev: Quoted strings,  
Up: Syntax
-
-2.3 Other tokens
-================
-
-Any character, that is neither a part of a name, nor of a quoted string,
-is a token by itself.
-
-
-File: m4.info,  Node: Comments,  Prev: Other tokens,  Up: Syntax
-
-2.4 Comments
-============
-
-Comments in `m4' are normally delimited by the characters `#' and
-newline.  All characters between the comment delimiters are ignored,
-but the entire comment (including the delimiters) is passed through to
-the output--comments are _not_ discarded by `m4'.
-
-   Comments cannot be nested, so the first newline after a `#' ends the
-comment.  The commenting effect of the begin comment character can be
-inhibited by quoting it.
-
-   The comment delimiters can be changed to any string at any time,
-using the builtin macro `changecom'.  *Note Changecom::, for more
-information.
-
-
-File: m4.info,  Node: Macros,  Next: Definitions,  Prev: Syntax,  Up: Top
-
-3 How to invoke macros
-**********************
-
-This chapter covers macro invocation, macro arguments and how macro
-expansion is treated.
-
-* Menu:
-
-* Invocation::                  Macro invocation
-* Inhibiting Invocation::       Preventing macro invocation
-* Macro Arguments::             Macro arguments
-* Quoting Arguments::           On Quoting Arguments to macros
-* Macro expansion::             Expanding macros
-
-
-File: m4.info,  Node: Invocation,  Next: Inhibiting Invocation,  Prev: Macros, 
 Up: Macros
-
-3.1 Macro invocation
-====================
-
-Macro invocations has one of the forms
-
-     name
-
-which is a macro invocation without any arguments, or
-
-     name(arg1, arg2, ..., argN)
-
-which is a macro invocation with N arguments.  Macros can have any
-number of arguments.  All arguments are strings, but different macros
-might interpret the arguments in different ways.
-
-   The opening parenthesis _must_ follow the NAME directly, with no
-spaces in between.  If it does not, the macro is called with no
-arguments at all.
-
-   For a macro call to have no arguments, the parentheses _must_ be
-left out.  The macro call
-
-     name()
-
-is a macro call with one argument, which is the empty string, not a call
-with no arguments.
-
-
-File: m4.info,  Node: Inhibiting Invocation,  Next: Macro Arguments,  Prev: 
Invocation,  Up: Macros
-
-3.2 Preventing macro invocation
-===============================
-
-An innovation of the `m4' language, compared to some of its
-predecessors (like Stratchey's `GPM', for example), is the ability to
-recognize macro calls without resorting to any special, prefixed
-invocation character.  While generally useful, this feature might
-sometimes be the source of spurious, unwanted macro calls.  So, GNU
-`m4' offers several mechanisms or techniques for inhibiting the
-recognition of names as macro calls.
-
-   First of all, many builtin macros cannot meaningfully be called
-without arguments.  For any of these macros, whenever an opening
-parenthesis does not immediately follow their name, the builtin macro
-call is not triggered.  This solves the most usual cases, like for
-`include' or `eval'.  Later in this document, the sentence "This macro
-is recognized only when given arguments" refers to this specific
-provision.
-
-   There is also a command call option (`--prefix-builtins', or `-P')
-which requires all builtin macro names to be prefixed by `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 `m4_dnl' and
-even `m4_m4exit'.
-
-   If your version of GNU `m4' has the `changeword' feature compiled
-in, there it offers far more flexibility in specifying the syntax of
-macro names, both builtin or user-defined.  *Note Changeword::, for
-more information on this experimental feature.
-
-   Of course, the simplest way to prevent a name to be 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 to quote the empty string, but this works only _inside_ the
-name.  For example:
-
-     `divert'
-     `d'ivert
-     di`ver't
-     div`'ert
-
-all yield the string `divert'.  While in both:
-
-     `'divert
-     divert`'
-
-the `divert' builtin macro will be called.
-
-   The output of macro evaluations is always rescanned.  The following
-example would yield the string `de', exactly as if `m4' has been given
-`substr(abcde, 3, 2)' as input:
-
-     define(`x', `substr(ab')
-     define(`y', `cde, 3, 2)')
-     x`'y
-
-   Unquoted strings on either side of a quoted string are subject to
-being recognized as macro names.  In the following example, quoting the
-empty string allows for the `dnl' macro to be recognized as such:
-
-     define(`macro', `di$1')
-     macro(v)`'dnl
-
-Without the quotes, this would rather yield the string `divdnl'
-followed by an end of line.
-
-   Quoting may prevent recognizing as a macro name the concatenation of
-a macro expansion with the surrounding characters.  In this example:
-
-     define(`macro', `di$1')
-     macro(v)`ert'
-
-the input will produce the string `divert'.  If the quote was removed,
-the `divert' builtin would be called instead.
-
-
-File: m4.info,  Node: Macro Arguments,  Next: Quoting Arguments,  Prev: 
Inhibiting Invocation,  Up: Macros
-
-3.3 Macro arguments
-===================
-
-When a name is seen, and it has a macro definition, it will be expanded
-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
-there are too many arguments, the excess arguments are ignored.
-
-   Normally `m4' will issue warnings if a builtin macro is called with
-an inappropriate number of arguments, but it can be suppressed with the
-`-Q' command line option.  For user defined macros, there is no check
-of the number of arguments given.
-
-   Macros are expanded normally during argument collection, and whatever
-commas, quotes and parentheses that might show up in the resulting
-expanded text will serve to define the arguments as well.  Thus, if FOO
-expands to `, b, c', the macro call
-
-     bar(a foo, d)
-
-   is a macro call with four arguments, which are `a ', `b', `c' and
-`d'.  To understand why the first argument contains whitespace,
-remember that leading unquoted whitespace is never part of an argument,
-but trailing whitespace always is.
-
-
-File: m4.info,  Node: Quoting Arguments,  Next: Macro expansion,  Prev: Macro 
Arguments,  Up: Macros
-
-3.4 Quoting macro arguments
-===========================
-
-Each argument has leading unquoted whitespace removed.  Within each
-argument, all unquoted parentheses must match.  For example, if FOO is
-a macro,
-
-     foo(() (`(') `(')
-
-   is a macro call, with one argument, whose value is `() (() ('.
-
-   It is common practice to quote all arguments to macros, unless you
-are sure you want the arguments expanded.  Thus, in the above example
-with the parentheses, the `right' way to do it is like this:
-
-     foo(`() (() (')
-
-   It is, however, in certain cases necessary to leave out quotes for
-some arguments, and there is nothing wrong in doing it.  It just makes
-life a bit harder, if you are not careful.
-
-
-File: m4.info,  Node: Macro expansion,  Prev: Quoting Arguments,  Up: Macros
-
-3.5 Macro expansion
-===================
-
-When the arguments, if any, to a macro call have been collected, the
-macro is expanded, and the expansion text is pushed back onto the input
-(unquoted), and reread.  The expansion text from one macro call might
-therefore result in more macros being called, if the calls are included,
-completely or partially, in the first macro calls' expansion.
-
-   Taking a very simple example, if FOO expands to `bar', and BAR
-expands to `Hello world', the input
-
-     foo
-
-will expand first to `bar', and when this is reread and expanded, into
-`Hello world'.
-
-
-File: m4.info,  Node: Definitions,  Next: Conditionals,  Prev: Macros,  Up: Top
-
-4 How to define 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.
-
-* Menu:
-
-* Define::                      Defining a new macro
-* Arguments::                   Arguments to macros
-* Pseudo Arguments::            Pseudo arguments to macros
-* Undefine::                    Deleting a macro
-* Defn::                        Renaming macros
-* Pushdef::                     Temporarily redefining macros
-
-* Indir::                       Indirect call of macros
-* Builtin::                     Indirect call of builtins
-
-
-File: m4.info,  Node: Define,  Next: Arguments,  Prev: Definitions,  Up: 
Definitions
-
-4.1 Defining a macro
-====================
-
-The normal way to define or redefine macros is to use the builtin
-`define':
-
-     define(NAME [, EXPANSION])
-
-which defines NAME to expand to EXPANSION.  If EXPANSION is not given,
-it is taken to be empty.
-
-   The expansion of `define' is void.
-
-   The following example defines the macro FOO to expand to the text
-`Hello World.'.
-
-     define(`foo', `Hello world.')
-     =>
-     foo
-     =>Hello world.
-
-   The empty line in the output is there because the newline is not a
-part of the macro definition, and it is consequently copied to the
-output.  This can be avoided by use of the macro `dnl'.  *Note Dnl::,
-for details.
-
-   The macro `define' is recognized only with parameters.
-
-
-File: m4.info,  Node: Arguments,  Next: Pseudo Arguments,  Prev: Define,  Up: 
Definitions
-
-4.2 Arguments to macros
-=======================
-
-Macros can have arguments.  The Nth argument is denoted by `$n' in the
-expansion text, and is replaced by the Nth actual argument, when the
-macro is expanded.  Here is a example of a macro with two arguments.
-It simply exchanges the order of the two arguments.
-
-     define(`exch', `$2, $1')
-     =>
-     exch(arg1, arg2)
-     =>arg2, arg1
-
-   This can be used, for example, if you like the arguments to `define'
-to be reversed.
-
-     define(`exch', `$2, $1')
-     =>
-     define(exch(``expansion text'', ``macro''))
-     =>
-     macro
-     =>expansion text
-
-   *Note Quoting Arguments::, for an explanation of the double quotes.
-
-   GNU `m4' allows the number following the `$' to consist of one or
-more digits, allowing macros to have any number of arguments.  This is
-not so in UNIX implementations of `m4', which only recognize one digit.
-
-   As a special case, the zero'th argument, `$0', is always the name of
-the macro being expanded.
-
-     define(`test', ``Macro name: $0'')
-     =>
-     test
-     =>Macro name: test
-
-   If you want quoted text to appear as part of the expansion text,
-remember that quotes can be nested in quoted strings.  Thus, in
-
-     define(`foo', `This is macro `foo'.')
-     =>
-     foo
-     =>This is macro foo.
-
-The `foo' in the expansion text is _not_ expanded, since it is a quoted
-string, and not a name.
-
-
-File: m4.info,  Node: Pseudo Arguments,  Next: Undefine,  Prev: Arguments,  
Up: Definitions
-
-4.3 Special arguments to macros
-===============================
-
-There is a special notation for the number of actual arguments supplied,
-and for all the actual arguments.
-
-   The number of actual arguments in a macro call is denoted by `$#' in
-the expansion text.  Thus, a macro to display the number of arguments
-given can be
-
-     define(`nargs', `$#')
-     =>
-     nargs
-     =>0
-     nargs()
-     =>1
-     nargs(arg1, arg2, arg3)
-     =>3
-
-   The notation `$*' can be used in the expansion text to denote all
-the actual arguments, unquoted, with commas in between.  For example
-
-     define(`echo', `$*')
-     =>
-     echo(arg1,    arg2, arg3 , arg4)
-     =>arg1,arg2,arg3 ,arg4
-
-   Often each argument should be quoted, and the notation `$@' handles
-that.  It is just like `$*', except that it quotes each argument.  A
-simple example of that is:
-
-     define(`echo', `$@')
-     =>
-     echo(arg1,    arg2, arg3 , arg4)
-     =>arg1,arg2,arg3 ,arg4
-
-   Where did the quotes go?  Of course, they were eaten, when the
-expanded text were reread by `m4'.  To show the difference, try
-
-     define(`echo1', `$*')
-     =>
-     define(`echo2', `$@')
-     =>
-     define(`foo', `This is macro `foo'.')
-     =>
-     echo1(foo)
-     =>This is macro This is macro foo..
-     echo2(foo)
-     =>This is macro foo.
-
-*Note Trace::, if you do not understand this.
-
-   A `$' sign in the expansion text, that is not followed by anything
-`m4' understands, is simply copied to the macro expansion, as any other
-text is.
-
-     define(`foo', `$$$ hello $$$')
-     =>
-     foo
-     =>$$$ hello $$$
-
-   If you want a macro to expand to something like `$12', put a pair of
-quotes after the `$'.  This will prevent `m4' from interpreting the `$'
-sign as a reference to an argument.
-
-
-File: m4.info,  Node: Undefine,  Next: Defn,  Prev: Pseudo Arguments,  Up: 
Definitions
-
-4.4 Deleting a macro
-====================
-
-A macro definition can be removed with `undefine':
-
-     undefine(NAME)
-
-which removes the macro NAME.  The macro name must necessarily be
-quoted, since it will be expanded otherwise.
-
-   The expansion of `undefine' is void.
-
-     foo
-     =>foo
-     define(`foo', `expansion text')
-     =>
-     foo
-     =>expansion text
-     undefine(`foo')
-     =>
-     foo
-     =>foo
-
-   It is not an error for NAME to have no macro definition.  In that
-case, `undefine' does nothing.
-
-   The macro `undefine' is recognized only with parameters.
-
-
-File: m4.info,  Node: Defn,  Next: Pushdef,  Prev: Undefine,  Up: Definitions
-
-4.5 Renaming macros
-===================
-
-It is possible to rename an already defined macro.  To do this, you need
-the builtin `defn':
-
-     defn(NAME)
-
-which expands to the _quoted definition_ of NAME.  If the argument is
-not a defined macro, the expansion is void.
-
-   If NAME is a user-defined macro, the quoted definition is simply the
-quoted expansion text.  If, instead, NAME is a builtin, the expansion
-is a special token, which points to the builtin's internal definition.
-This token is only meaningful as the second argument to `define' (and
-`pushdef'), and is ignored in any other context.
-
-   Its normal use is best understood through an example, which shows
-how to rename `undefine' to `zap':
-
-     define(`zap', defn(`undefine'))
-     =>
-     zap(`undefine')
-     =>
-     undefine(`zap')
-     =>undefine(zap)
-
-   In this way, `defn' can be used to copy macro definitions, and also
-definitions of builtin macros.  Even if the original macro is removed,
-the other name can still be used to access the definition.
-
-   The macro `defn' is recognized only with parameters.
-
-
-File: m4.info,  Node: Pushdef,  Next: Indir,  Prev: Defn,  Up: Definitions
-
-4.6 Temporarily redefining macros
-=================================
-
-It is possible to redefine a macro temporarily, reverting to the
-previous definition at a later time.  This is done with the builtins
-`pushdef' and `popdef':
-
-     pushdef(NAME [, EXPANSION])
-     popdef(NAME)
-
-which are quite analogous to `define' and `undefine'.
-
-   These macros work in a stack-like fashion.  A macro is temporarily
-redefined with `pushdef', which replaces an existing definition of
-NAME, while saving the previous definition, before the new one is
-installed.  If there is no previous definition, `pushdef' behaves
-exactly like `define'.
-
-   If a macro has several definitions (of which only one is accessible),
-the topmost definition can be removed with `popdef'.  If there is no
-previous definition, `popdef' behaves like `undefine'.
-
-     define(`foo', `Expansion one.')
-     =>
-     foo
-     =>Expansion one.
-     pushdef(`foo', `Expansion two.')
-     =>
-     foo
-     =>Expansion two.
-     popdef(`foo')
-     =>
-     foo
-     =>Expansion one.
-     popdef(`foo')
-     =>
-     foo
-     =>foo
-
-   If a macro with several definitions is redefined with `define', the
-topmost definition is _replaced_ with the new definition.  If it is
-removed with `undefine', _all_ the definitions are removed, and not
-only the topmost one.
-
-     define(`foo', `Expansion one.')
-     =>
-     foo
-     =>Expansion one.
-     pushdef(`foo', `Expansion two.')
-     =>
-     foo
-     =>Expansion two.
-     define(`foo', `Second expansion two.')
-     =>
-     foo
-     =>Second expansion two.
-     undefine(`foo')
-     =>
-     foo
-     =>foo
-
-   It is possible to temporarily redefine a builtin with `pushdef' and
-`defn'.
-
-   The macros `pushdef' and `popdef' are recognized only with
-parameters.
-
-
-File: m4.info,  Node: Indir,  Next: Builtin,  Prev: Pushdef,  Up: Definitions
-
-4.7 Indirect call of macros
-===========================
-
-Any macro can be called indirectly with `indir':
-
-     indir(NAME, ...)
-   which results in a call to the macro NAME, which is passed the rest
-of the arguments.  This can be used to call macros with "illegal" names
-(`define' allows such names to be defined):
-
-     define(`$$internal$macro', `Internal macro (name `$0')')
-     =>
-     $$internal$macro
-     =>$$internal$macro
-     indir(`$$internal$macro')
-     =>Internal macro (name $$internal$macro)
-
-   The point is, here, that larger macro packages can have private
-macros defined, that will not be called by accident.  They can _only_ be
-called through the builtin `indir'.
-
-
-File: m4.info,  Node: Builtin,  Prev: Indir,  Up: Definitions
-
-4.8 Indirect call of builtins
-=============================
-
-Builtin macros can be called indirectly with `builtin':
-
-     builtin(NAME, ...)
-   which results in a call to the builtin NAME, which is passed the
-rest of the arguments.  This can be used, if NAME has been given
-another definition that has covered the original.
-
-   The macro `builtin' is recognized only with parameters.
-
-
-File: m4.info,  Node: Conditionals,  Next: Debugging,  Prev: Definitions,  Up: 
Top
-
-5 Conditionals, loops and recursion
-***********************************
-
-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.  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.
-
-* Menu:
-
-* Ifdef::                       Testing if a macro is defined
-* Ifelse::                      If-else construct, or multibranch
-* Loops::                       Loops and recursion in m4
-
-
-File: m4.info,  Node: Ifdef,  Next: Ifelse,  Prev: Conditionals,  Up: 
Conditionals
-
-5.1 Testing macro definitions
-=============================
-
-There are two different builtin conditionals in `m4'.  The first is
-`ifdef':
-
-     ifdef(NAME, STRING-1, opt STRING-2)
-
-which makes it possible to test whether a macro is defined or not.  If
-NAME is defined as a macro, `ifdef' expands to STRING-1, otherwise to
-STRING-2.  If STRING-2 is omitted, it is taken to be the empty string
-(according to the normal rules).
-
-     ifdef(`foo', ``foo' is defined', ``foo' is not defined')
-     =>foo is not defined
-     define(`foo', `')
-     =>
-     ifdef(`foo', ``foo' is defined', ``foo' is not defined')
-     =>foo is defined
-
-   The macro `ifdef' is recognized only with parameters.
-
-
-File: m4.info,  Node: Ifelse,  Next: Loops,  Prev: Ifdef,  Up: Conditionals
-
-5.2 Comparing strings
-=====================
-
-The other conditional, `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:
-
-     ifelse(COMMENT)
-     ifelse(STRING-1, STRING-2, EQUAL, opt NOT-EQUAL)
-     ifelse(STRING-1, STRING-2, EQUAL, ...)
-
-Used with only one argument, the `ifelse' simply discards it and
-produces no output.  This is a common `m4' idiom for introducing a
-block comment, as an alternative to repeatedly using `dnl'.  This
-special usage is recognized by GNU `m4', so that in this case, the
-warning about missing arguments is never triggered.
-
-   If called with three or four arguments, `ifelse' expands into EQUAL,
-if STRING-1 and STRING-2 are equal (character for character), otherwise
-it expands to NOT-EQUAL.
-
-     ifelse(foo, bar, `true')
-     =>
-     ifelse(foo, foo, `true')
-     =>true
-     ifelse(foo, bar, `true', `false')
-     =>false
-     ifelse(foo, foo, `true', `false')
-     =>true
-
-   However, `ifelse' can take more than four arguments.  If given more
-than four arguments, `ifelse' works like a `case' or `switch' statement
-in traditional programming languages.  If STRING-1 and STRING-2 are
-equal, `ifelse' expands into EQUAL, otherwise the procedure is repeated
-with the first three arguments discarded.  This calls for an example:
-
-     ifelse(foo, bar, `third', gnu, gnats, `sixth', `seventh')
-     =>seventh
-
-   Naturally, the normal case will be slightly more advanced than these
-examples.  A common use of `ifelse' is in macros implementing loops of
-various kinds.
-
-   The macro `ifelse' is recognized only with parameters.
-
-
-File: m4.info,  Node: Loops,  Prev: Ifelse,  Up: Conditionals
-
-5.3 Loops and recursion
-=======================
-
-There is no direct support for loops in `m4', but macros can be
-recursive.  There is no limit on the number of recursion levels, other
-than those enforced by your hardware and operating system.
-
-   Loops can be programmed using recursion and the conditionals
-described previously.
-
-   There is a builtin macro, `shift', which can, among other things, be
-used for iterating through the actual arguments to a macro:
-
-     shift(...)
-
-It takes any number of arguments, and expands to all but the first
-argument, separated by commas, with each argument quoted.
-
-     shift(bar)
-     =>
-     shift(foo, bar, baz)
-     =>bar,baz
-
-   An example of the use of `shift' is this macro, which reverses the
-order of its arguments:
-
-     define(`reverse', `ifelse($#, 0, , $#, 1, ``$1'',
-                         `reverse(shift($@)), `$1'')')
-     =>
-     reverse
-     =>
-     reverse(foo)
-     =>foo
-     reverse(foo, bar, gnats, and gnus)
-     =>and gnus, gnats, bar, foo
-
-   While not a very interesting macro, it does show how simple loops
-can be made with `shift', `ifelse' and recursion.
-
-   Here is an example of a loop macro that implements a simple forloop.
-It can, for example, be used for simple counting:
-
-     forloop(`i', 1, 8, `i ')
-     =>1 2 3 4 5 6 7 8
-
-   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 `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
-
-     forloop(`i', 1, 4, `forloop(`j', 1, 8, `(i, j) ')
-     ')
-     =>(1, 1) (1, 2) (1, 3) (1, 4) (1, 5) (1, 6) (1, 7) (1, 8)
-     =>(2, 1) (2, 2) (2, 3) (2, 4) (2, 5) (2, 6) (2, 7) (2, 8)
-     =>(3, 1) (3, 2) (3, 3) (3, 4) (3, 5) (3, 6) (3, 7) (3, 8)
-     =>(4, 1) (4, 2) (4, 3) (4, 4) (4, 5) (4, 6) (4, 7) (4, 8)
-     =>
-
-   The implementation of the `forloop' macro is fairly straightforward.
-The `forloop' macro itself is simply a wrapper, which saves the
-previous definition of the first argument, calls the internal macro
-`_forloop', and re-establishes the saved definition of the first
-argument.
-
-   The macro `_forloop' expands the fourth argument once, and tests to
-see if it is finished.  If it has not finished, it increments the
-iteration variable (using the predefined macro `incr', *note Incr::),
-and recurses.
-
-   Here is the actual implementation of `forloop':
-
-     define(`forloop',
-            `pushdef(`$1', `$2')_forloop(`$1', `$2', `$3', `$4')popdef(`$1')')
-     define(`_forloop',
-            `$4`'ifelse($1, `$3', ,
-                  `define(`$1', incr($1))_forloop(`$1', `$2', `$3', `$4')')')
-
-   Notice the careful use of quotes.  Only three macro arguments are
-unquoted, each for its own reason.  Try to find out _why_ these three
-arguments are left unquoted, and see what happens if they are quoted.
-
-   Now, even though these two macros are useful, they are still not
-robust enough for general use. They lack even basic error handling of
-cases like start value less than final value, and the first argument
-not being a name.  Correcting these errors are left as an exercise to
-the reader.
-
-
-File: m4.info,  Node: Debugging,  Next: Input Control,  Prev: Conditionals,  
Up: Top
-
-6 How to debug macros and input
-*******************************
-
-When writing macros for `m4', most of the time they woould not work as
-intended (as is the case with most programming languages).  There is a
-little support for macro debugging in `m4'.
-
-* Menu:
-
-* Dumpdef::                     Displaying macro definitions
-* Trace::                       Tracing macro calls
-* Debug Levels::                Controlling debugging output
-* Debug Output::                Saving debugging output
-
-
-File: m4.info,  Node: Dumpdef,  Next: Trace,  Prev: Debugging,  Up: Debugging
-
-6.1 Displaying macro definitions
-================================
-
-If you want to see what a name expands into, you can use the builtin
-`dumpdef':
-
-     dumpdef(...)
-
-which 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 expansion of `dumpdef' is void.
-
-     define(`foo', `Hello world.')
-     =>
-     dumpdef(`foo')
-     error-->foo:      `Hello world.'
-     =>
-     dumpdef(`define')
-     error-->define:   <define>
-     =>
-
-   The last example shows how builtin macros definitions are displayed.
-
-   *Note Debug Levels::, for information on controlling the details of
-the display.
-
-
-File: m4.info,  Node: Trace,  Next: Debug Levels,  Prev: Dumpdef,  Up: 
Debugging
-
-6.2 Tracing macro calls
-=======================
-
-It is possible to trace macro calls and expansions through the builtins
-`traceon' and `traceoff':
-
-     traceon(...)
-     traceoff(...)
-
-When called without any arguments, `traceon' and `traceoff' will turn
-tracing on and off, respectively,  for all defined macros.  When called
-with arguments, only the named macros are affected.
-
-   The expansion of `traceon' and `traceoff' is void.
-
-   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.
-
-     define(`foo', `Hello World.')
-     =>
-     define(`echo', `$@')
-     =>
-     traceon(`foo', `echo')
-     =>
-     foo
-     error-->m4trace: -1- foo -> `Hello World.'
-     =>Hello World.
-     echo(gnus, and gnats)
-     error-->m4trace: -1- echo(`gnus', `and gnats') -> ``gnus',`and gnats''
-     =>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.
-
-   *Note Debug Levels::, for information on controlling the details of
-the display.
-
-
-File: m4.info,  Node: Debug Levels,  Next: Debug Output,  Prev: Trace,  Up: 
Debugging
-
-6.3 Controlling debugging output
-================================
-
-The `-d' option to `m4' controls the amount of details presented, when
-using the macros described in the preceding sections.
-
-   The FLAGS following the option can be one or more of the following:
-
-`t'
-     Trace all macro calls made in this invocation of `m4'.
-
-`a'
-     Show the actual arguments in each macro call.  This applies to all
-     macro calls if the `t' flag is used, otherwise only the macros
-     covered by calls of `traceon'.
-
-`e'
-     Show the expansion of each macro call, if it is not void.  This
-     applies to all macro calls if the `t' flag is used, otherwise only
-     the macros covered by calls of `traceon'.
-
-`q'
-     Quote actual arguments and macro expansions in the display with the
-     current quotes.
-
-`c'
-     Show several trace lines for each macro call.  A line is shown
-     when the macro is seen, but before the arguments are collected; a
-     second line when the arguments have been collected and a third
-     line after the call has completed.
-
-`x'
-     Add a unique `macro call id' to each line of the trace output.
-     This is useful in connection with the `c' flag above.
-
-`f'
-     Show the name of the current input file in each trace output line.
-
-`l'
-     Show the the current input line number in each trace output line.
-
-`p'
-     Print a message when a named file is found through the path search
-     mecanism (*note Search Path::), giving the actual filename used.
-
-`i'
-     Print a message each time the current input file is changed,
-     giving file name and input line number.
-
-`V'
-     A shorthand for all of the above flags.
-
-   If no flags are specified with the `-d' option, the default is
-`aeq'. The examples in the previous two sections assumed the default
-flags.
-
-   There is a builtin macro `debugmode', which allows on-the-fly
-control of the debugging output format:
-
-     debugmode(opt FLAGS)
-   The argument FLAGS should be a subset of the letters listed above.
-As special cases, if the argument starts with a `+', the flags are
-added to the current debug flags, and if it starts with a `-', they are
-removed.  If no argument is present, the debugging flags are set to
-zero (as if no `-d' was given), and with an empty argument the flags
-are reset to the default.
-
-
-File: m4.info,  Node: Debug Output,  Prev: Debug Levels,  Up: Debugging
-
-6.4 Saving debugging output
-===========================
-
-Debug and tracing output can be redirected to files using either the
-`-o' option to `m4', or with the builtin macro `debugfile':
-
-     debugfile(opt FILENAME)
-   will send all further debug and trace output to FILENAME.  If
-FILENAME is empty, debug and trace output are discarded and if
-`debugfile' is called without any arguments, debug and trace output are
-sent to the standard error output.
-
-
-File: m4.info,  Node: Input Control,  Next: File Inclusion,  Prev: Debugging,  
Up: Top
-
-7 Input control
-***************
-
-This chapter describes various builtin macros for controlling the input
-to `m4'.
-
-* Menu:
-
-* Dnl::                         Deleting whitespace in input
-* Changequote::                 Changing the quote characters
-* Changecom::                   Changing the comment delimiters
-* Changeword::                  Changing the lexical structure of words
-* M4wrap::                      Saving input until end of input
-
-
-File: m4.info,  Node: Dnl,  Next: Changequote,  Prev: Input Control,  Up: 
Input Control
-
-7.1 Deleting whitespace in input
-================================
-
-The builtin `dnl' reads and discards all characters, up to and
-including the first newline:
-
-     dnl
-   and it is often used in connection with `define', to remove the
-newline that follow the call to `define'.  Thus
-
-     define(`foo', `Macro `foo'.')dnl A very simple macro, indeed.
-     foo
-     =>Macro foo.
-
-   The input up to and including the next newline is discarded, as
-opposed to the way comments are treated (*note Comments::).
-
-   Usually, `dnl' is immediately followed by an end of line or some
-other whitespace.  GNU `m4' will produce a warning diagnostic if `dnl'
-is followed by an open parenthesis.  In this case, `dnl' will collect
-and process all arguments, looking for a matching close parenthesis.
-All predictable side effects resulting from this collection will take
-place.  `dnl' will return no output.  The input following the matching
-close parenthesis up to and including the next newline, on whatever
-line containing it, will still be discarded.
-
-
-File: m4.info,  Node: Changequote,  Next: Changecom,  Prev: Dnl,  Up: Input 
Control
-
-7.2 Changing the quote characters
-=================================
-
-The default quote delimiters can be changed with the builtin
-`changequote':
-
-     changequote(opt START, opt END)
-   where START is the new start-quote delimiter and END is the new
-end-quote delimiter.  If any of the arguments are missing, the default
-quotes (``' and `'') are used instead of the void arguments.
-
-   The expansion of `changequote' is void.
-
-     changequote([, ])
-     =>
-     define([foo], [Macro [foo].])
-     =>
-     foo
-     =>Macro foo.
-
-   If no single character is appropriate, START and END can be of any
-length.
-
-     changequote([[, ]])
-     =>
-     define([[foo]], [[Macro [[[foo]]].]])
-     =>
-     foo
-     =>Macro [foo].
-
-   Changing the quotes to the empty strings will effectively disable the
-quoting mechanism, leaving no way to quote text.
-
-     define(`foo', `Macro `FOO'.')
-     =>
-     changequote(, )
-     =>
-     foo
-     =>Macro `FOO'.
-     `foo'
-     =>`Macro `FOO'.'
-
-   There is no way in `m4' to quote a string containing an unmatched
-left quote, except using `changequote' to change the current quotes.
-
-   Neither quote string should start with a letter or `_' (underscore),
-as they will be confused with names in the input.  Doing so disables
-the quoting mechanism.
-
-
-File: m4.info,  Node: Changecom,  Next: Changeword,  Prev: Changequote,  Up: 
Input Control
-
-7.3 Changing comment delimiters
-===============================
-
-The default comment delimiters can be changed with the builtin macro
-`changecom':
-
-     changecom(opt START, opt END)
-   where START is the new start-comment delimiter and END is the new
-end-comment delimiter.  If any of the arguments are void, the default
-comment delimiters (`#' and newline) are used instead of the void
-arguments.  The comment delimiters can be of any length.
-
-   The expansion of `changecom' is void.
-
-     define(`comment', `COMMENT')
-     =>
-     # A normal comment
-     =># A normal comment
-     changecom(`/*', `*/')
-     =>
-     # Not a comment anymore
-     =># Not a COMMENT anymore
-     But: /* this is a comment now */ while this is not a comment
-     =>But: /* this is a comment now */ while this is not a COMMENT
-
-   Note how comments are copied to the output, much as if they were
-quoted strings.  If you want the text inside a comment expanded, quote
-the start comment delimiter.
-
-   Calling `changecom' without any arguments disables the commenting
-mechanism completely.
-
-     define(`comment', `COMMENT')
-     =>
-     changecom
-     =>
-     # Not a comment anymore
-     =># Not a COMMENT anymore
-
-
-File: m4.info,  Node: Changeword,  Next: M4wrap,  Prev: Changecom,  Up: Input 
Control
-
-7.4 Changing the lexical structure of words
-===========================================
-
-     The macro `changeword' and all associated functionnality is
-     experimental.  It is only available if the `--enable-changeword'
-     option was given to `configure', at GNU `m4' installation time.
-     The functionnality might change or even go away in the future.
-     _Do not rely on it_.  Please direct your comments about it the
-     same way you would do for bugs.
-
-   A file being processed by `m4' is split into quoted strings, words
-(potential macro names) and simple tokens (any other single character).
-Initially a word is defined by the following regular expression:
-
-     [_a-zA-Z][_a-zA-Z0-9]*
-
-   Using `changeword', you can change this regular expression.  Relaxing
-`m4''s lexical rules might be useful (for example) if you wanted to
-apply translations to a file of numbers:
-
-     changeword(`[_a-zA-Z0-9]+')
-     define(1, 0)
-     =>1
-
-   Tightening the lexical rules is less useful, because it will
-generally make some of the builtins unavailable.  You could use it to
-prevent accidental call of builtins, for example:
-
-     define(`_indir', defn(`indir'))
-     changeword(`_[_a-zA-Z0-9]*')
-     esyscmd(foo)
-     _indir(`esyscmd', `ls')
-
-   Because `m4' constructs its words a character at a time, there is a
-restriction on the regular expressions that may be passed to
-`changeword'.  This is that if your regular expression accepts `foo',
-it must also accept `f' and `fo'.
-
-   `changeword' has another function.  If the regular expression
-supplied contains any bracketed subexpressions, then text outside the
-first of these is discarded before symbol lookup.  So:
-
-     changecom(`/*', `*/')
-     changeword(`#\([_a-zA-Z0-9]*\)')
-     #esyscmd(ls)
-
-   `m4' now requires a `#' mark at the beginning of every macro
-invocation, so one can use `m4' to preprocess shell scripts without
-getting `shift' commands swallowed, and plain text without losing
-various common words.
-
-   `m4''s macro substitution is based on text, while TeX's is based on
-tokens.  `changeword' can throw this difference into relief.  For
-example, here is the same idea represented in TeX and `m4'.  First, the
-TeX version:
-
-     \def\a{\message{Hello}}
-     address@hidden
-     \catcode`\\=12
-     =>@a
-     =>@bye
-
-Then, the `m4' version:
-
-     define(a, `errprint(`Hello')')
-     changeword(address@hidden([_a-zA-Z0-9]*\)')
-     =>@a
-
-   In the TeX example, the first line defines a macro `a' to print the
-message `Hello'.  The second line defines <@> to be usable instead of
-<\> as an escape character.  The third line defines <\> to be a normal
-printing character, not an escape.  The fourth line invokes the macro
-`a'.  So, when TeX is run on this file, it displays the message `Hello'.
-
-   When the `m4' example is passed through `m4', it outputs
-`errprint(Hello)'.  The reason for this is that TeX does lexical
-analysis of macro definition when the macro is _defined_.  `m4' just
-stores the text, postponing the lexical analysis until the macro is
-_used_.
-
-   You should note that using `changeword' will slow `m4' down by a
-factor of about seven.
-
-
-File: m4.info,  Node: M4wrap,  Prev: Changeword,  Up: Input Control
-
-7.5 Saving input
-================
-
-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 `m4' when the normal
-input has been exhausted.  This feature is normally used to initiate
-cleanup actions before normal exit, e.g., deleting temporary files.
-
-   To save input text, use the builtin `m4wrap':
-
-     m4wrap(STRING, ...)
-   which stores STRING and the rest of the arguments in a safe place,
-to be reread when end of input is reached.
-
-     define(`cleanup', `This is the `cleanup' actions.
-     ')
-     =>
-     m4wrap(`cleanup')
-     =>
-     This is the first and last normal input line.
-     =>This is the first and last normal input line.
-     ^D
-     =>This is the cleanup actions.
-
-   The saved input is only reread when the end of normal input is seen,
-and not if `m4exit' is used to exit `m4'.
-
-   It is safe to call `m4wrap' from saved text, but then the order in
-which the saved text is reread is undefined.  If `m4wrap' is not used
-recursively, the saved pieces of text are reread in the opposite order
-in which they were saved (LIFO--last in, first out).
-
-
-File: m4.info,  Node: File Inclusion,  Next: Diversions,  Prev: Input Control, 
 Up: Top
-
-8 File inclusion
-****************
-
-`m4' allows you to include named files at any point in the input.
-
-* Menu:
-
-* Include::                     Including named files
-* Search Path::                 Searching for include files
-
-
-File: m4.info,  Node: Include,  Next: Search Path,  Prev: File Inclusion,  Up: 
File Inclusion
-
-8.1 Including named files
-=========================
-
-There are two builtin macros in `m4' for including files:
-
-     include(FILENAME)
-     sinclude(FILENAME)
-
-both of which cause the file named FILENAME to be read by `m4'.  When
-the end of the file is reached, input is resumed from the previous
-input file.
-
-   The expansion of `include' and `sinclude' is therefore the contents
-of FILENAME.
-
-   It is an error for an `include'd file not to exist.  If you do not
-want error messages about non-existent files, `sinclude' can be used to
-include a file, if it exists, expanding to nothing if it does not.
-
-     include(`no-such-file')
-     =>
-     error-->30.include:2: m4: Cannot open no-such-file: No such file or 
directory
-     sinclude(`no-such-file')
-     =>
-
-   Assume in the following that the file `incl.m4' contains the lines:
-     Include file start
-     foo
-     Include file end
-   Normally file inclusion is used to insert the contents of a file
-into the input stream.  The contents of the file will be read by `m4'
-and macro calls in the file will be expanded:
-
-     define(`foo', `FOO')
-     =>
-     include(`incl.m4')
-     =>Include file start
-     =>FOO
-     =>Include file end
-     =>
-
-   The fact that `include' and `sinclude' expand to the contents of the
-file can be used to define macros that operate on entire files.  Here
-is an example, which defines `bar' to expand to the contents of
-`incl.m4':
-
-     define(`bar', include(`incl.m4'))
-     =>
-     This is `bar':  >>>bar<<<
-     =>This is bar:  >>>Include file start
-     =>foo
-     =>Include file end
-     =><<<
-
-   This use of `include' is not trivial, though, as files can contain
-quotes, commas and parentheses, which can interfere with the way the
-`m4' parser works.
-
-   The builtin macros `include' and `sinclude' are recognized only when
-given arguments.
-
-
-File: m4.info,  Node: Search Path,  Prev: Include,  Up: File Inclusion
-
-8.2 Searching for include files
-===============================
-
-GNU `m4' allows included files to be found in other directories than
-the current working directory.
-
-   If a file is not found in the current working directory, and the file
-name is not absolute, the file will be looked for in a specified search
-path.  First, the directories specified with the `-I' option will be
-searched, in the order found on the command line.  Second, if the
-`M4PATH' environment variable is set, it is expected to contain a
-colon-separated list of directories, which will be searched in order.
-
-   If the automatic search for include-files causes trouble, the `p'
-debug flag (*note Debug Levels::) can help isolate the problem.
-
-
-File: m4.info,  Node: Diversions,  Next: Text handling,  Prev: File Inclusion, 
 Up: Top
-
-9 Diverting and undiverting output
-**********************************
-
-Diversions are a way of temporarily saving output.  The output of `m4'
-can at any time be diverted to a temporary file, and be reinserted into
-the output stream, "undiverted", again at a later time.
-
-   Numbered diversions are counted from 0 upwards, diversion number 0
-being the normal output stream.  The number of simultaneous diversions
-is limited mainly by the memory used to describe them, because GNU `m4'
-tries to keep diversions in memory.  However, there is a limit to the
-overall memory usable by all diversions taken altogether (512K,
-currently).  When this maximum is about to be exceeded, a temporary
-file is opened to receive the contents of the biggest diversion still
-in memory, freeing this memory for other diversions.  So, it is
-theoretically possible that the number of diversions be limited by the
-number of available file descriptors.
-
-* Menu:
-
-* Divert::                      Diverting output
-* Undivert::                    Undiverting output
-* Divnum::                      Diversion numbers
-* Cleardiv::                    Discarding diverted text
-
-
-File: m4.info,  Node: Divert,  Next: Undivert,  Prev: Diversions,  Up: 
Diversions
-
-9.1 Diverting output
-====================
-
-Output is diverted using `divert':
-
-     divert(opt NUMBER)
-
-where NUMBER is the diversion to be used.  If NUMBER is left out, it is
-assumed to be zero.
-
-   The expansion of `divert' is void.
-
-   When all the `m4' input will have been processed, all existing
-diversions are automatically undiverted, in numerical order.
-
-     divert(1)
-     This text is diverted.
-     divert
-     =>
-     This text is not diverted.
-     =>This text is not diverted.
-     ^D
-     =>
-     =>This text is diverted.
-
-   Several calls of `divert' with the same argument do not overwrite
-the previous diverted text, but append to it.
-
-   If output is diverted to a non-existent diversion, it is simply
-discarded.  This can be used to suppress unwanted output.  A common
-example of unwanted output is the trailing newlines after macro
-definitions.  Here is how to avoid them.
-
-     divert(-1)
-     define(`foo', `Macro `foo'.')
-     define(`bar', `Macro `bar'.')
-     divert
-     =>
-
-   This is a common programming idiom in `m4'.
-
-
-File: m4.info,  Node: Undivert,  Next: Divnum,  Prev: Divert,  Up: Diversions
-
-9.2 Undiverting output
-======================
-
-Diverted text can be undiverted explicitly using the builtin `undivert':
-
-     undivert(opt NUMBER, ...)
-
-which undiverts the diversions given by the arguments, in the order
-given.  If no arguments are supplied, all diversions are undiverted, in
-numerical order.
-
-   The expansion of `undivert' is void.
-
-     divert(1)
-     This text is diverted.
-     divert
-     =>
-     This text is not diverted.
-     =>This text is not diverted.
-     undivert(1)
-     =>
-     =>This text is diverted.
-     =>
-
-   Notice the last two blank lines.  One of them comes from the newline
-following `undivert', the other from the newline that followed the
-`divert'!  A diversion often starts with a blank line like this.
-
-   When diverted text is undiverted, it is _not_ reread by `m4', but
-rather copied directly to the current output, and it is therefore not
-an error to undivert into a diversion.
-
-   When a diversion has been undiverted, the diverted text is discarded,
-and it is not possible to bring back diverted text more than once.
-
-     divert(1)
-     This text is diverted first.
-     divert(0)undivert(1)dnl
-     =>
-     =>This text is diverted first.
-     undivert(1)
-     =>
-     divert(1)
-     This text is also diverted but not appended.
-     divert(0)undivert(1)dnl
-     =>
-     =>This text is also diverted but not appended.
-
-   Attempts to undivert the current diversion are silently ignored.
-
-   GNU `m4' allows named files to be undiverted.  Given a non-numeric
-argument, the contents of the file named will be copied, uninterpreted,
-to the current output.  This complements the builtin `include' (*note
-Include::).  To illustrate the difference, assume the file `foo'
-contains the word `bar':
-
-     define(`bar', `BAR')
-     =>
-     undivert(`foo')
-     =>bar
-     =>
-     include(`foo')
-     =>BAR
-     =>
-
-
-File: m4.info,  Node: Divnum,  Next: Cleardiv,  Prev: Undivert,  Up: Diversions
-
-9.3 Diversion numbers
-=====================
-
-The builtin `divnum':
-
-     divnum
-
-expands to the number of the current diversion.
-
-     Initial divnum
-     =>Initial 0
-     divert(1)
-     Diversion one: divnum
-     divert(2)
-     Diversion two: divnum
-     divert
-     =>
-     ^D
-     =>
-     =>Diversion one: 1
-     =>
-     =>Diversion two: 2
-
-   The last call of `divert' without argument is necessary, since the
-undiverted text would otherwise be diverted itself.
-
-
-File: m4.info,  Node: Cleardiv,  Prev: Divnum,  Up: Diversions
-
-9.4 Discarding diverted text
-============================
-
-Often it is not known, when output is diverted, whether the diverted
-text is actually needed.  Since all non-empty diversion are brought back
-on the main output stream when the end of input is seen, a method of
-discarding a diversion is needed.  If all diversions should be
-discarded, the easiest is to end the input to `m4' with `divert(-1)'
-followed by an explicit `undivert':
-
-     divert(1)
-     Diversion one: divnum
-     divert(2)
-     Diversion two: divnum
-     divert(-1)
-     undivert
-     ^D
-
-No output is produced at all.
-
-   Clearing selected diversions can be done with the following macro:
-
-     define(`cleardivert',
-     `pushdef(`_num', divnum)divert(-1)undivert($@)divert(_num)popdef(`_num')')
-     =>
-
-   It is called just like `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.)
-
-
-File: m4.info,  Node: Text handling,  Next: Arithmetic,  Prev: Diversions,  
Up: Top
-
-10 Macros for text handling
-***************************
-
-There are a number of builtins in `m4' for manipulating text in various
-ways, extracting substrings, searching, substituting, and so on.
-
-* Menu:
-
-* Len::                         Calculating length of strings
-* Index macro::                 Searching for substrings
-* Regexp::                      Searching for regular expressions
-* Substr::                      Extracting substrings
-* Translit::                    Translating characters
-* Patsubst::                    Substituting text by regular expression
-* Format::                      Formatting strings (printf-like)
-
-
-File: m4.info,  Node: Len,  Next: Index macro,  Prev: Text handling,  Up: Text 
handling
-
-10.1 Calculating length of strings
-==================================
-
-The length of a string can be calculated by `len':
-
-     len(STRING)
-
-which expands to the length of STRING, as a decimal number.
-
-     len()
-     =>0
-     len(`abcdef')
-     =>6
-
-   The builtin macro `len' is recognized only when given arguments.
-
-
-File: m4.info,  Node: Index macro,  Next: Regexp,  Prev: Len,  Up: Text 
handling
-
-10.2 Searching for substrings
-=============================
-
-Searching for substrings is done with `index':
-
-     index(STRING, SUBSTRING)
-
-which expands to the index of the first occurrence of SUBSTRING in
-STRING.  The first character in STRING has index 0.  If SUBSTRING does
-not occur in STRING, `index' expands to `-1'.
-
-     index(`gnus, gnats, and armadillos', `nat')
-     =>7
-     index(`gnus, gnats, and armadillos', `dag')
-     =>-1
-
-   The builtin macro `index' is recognized only when given arguments.
-
-
-File: m4.info,  Node: Regexp,  Next: Substr,  Prev: Index macro,  Up: Text 
handling
-
-10.3 Searching for regular expressions
-======================================
-
-Searching for regular expressions is done with the builtin `regexp':
-
-     regexp(STRING, REGEXP, opt REPLACEMENT)
-
-which searches for REGEXP in STRING.  The syntax for regular
-expressions is the same as in GNU Emacs.  *Note Syntax of Regular
-Expressions: (emacs)Regexps.
-
-   If REPLACEMENT is omitted, `regexp' expands to the index of the
-first match of REGEXP in STRING.  If REGEXP does not match anywhere in
-STRING, it expands to -1.
-
-     regexp(`GNUs not Unix', `\<[a-z]\w+')
-     =>5
-     regexp(`GNUs not Unix', `\<Q\w*')
-     =>-1
-
-   If REPLACEMENT is supplied, `regexp' changes the expansion to this
-argument, with `\N' substituted by the text matched by the Nth
-parenthesized sub-expression of REGEXP, `\&' being the text the entire
-regular expression matched.
-
-     regexp(`GNUs not Unix', `\w\(\w+\)$', `*** \& *** \1 ***')
-     =>*** Unix *** nix ***
-
-   The builtin macro `regexp' is recognized only when given arguments.
-
-
-File: m4.info,  Node: Substr,  Next: Translit,  Prev: Regexp,  Up: Text 
handling
-
-10.4 Extracting substrings
-==========================
-
-Substrings are extracted with `substr':
-
-     substr(STRING, FROM, opt LENGTH)
-
-which expands to the substring of STRING, which starts at index FROM,
-and extends for LENGTH characters, or to the end of STRING, if LENGTH
-is omitted.  The starting index of a string is always 0.
-
-     substr(`gnus, gnats, and armadillos', 6)
-     =>gnats, and armadillos
-     substr(`gnus, gnats, and armadillos', 6, 5)
-     =>gnats
-
-   The builtin macro `substr' is recognized only when given arguments.
-
-
-File: m4.info,  Node: Translit,  Next: Patsubst,  Prev: Substr,  Up: Text 
handling
-
-10.5 Translating characters
-===========================
-
-Character translation is done with `translit':
-
-     translit(STRING, CHARS, REPLACEMENT)
-
-which expands to STRING, with each character that occurs in CHARS
-translated into the character from REPLACEMENT with the same index.
-
-   If REPLACEMENT is shorter than CHARS, the excess characters are
-deleted from the expansion.  If REPLACEMENT is omitted, all characters
-in STRING, that are present in CHARS are deleted from the expansion.
-
-   Both CHARS and REPLACEMENT can contain character-ranges, e.g., `a-z'
-(meaning all lowercase letters) or `0-9' (meaning all digits).  To
-include a dash `-' in CHARS or REPLACEMENT, place it first or last.
-
-   It is not an error for the last character in the range to be `larger'
-than the first.  In that case, the range runs backwards, i.e., `9-0'
-means the string `9876543210'.
-
-     translit(`GNUs not Unix', `A-Z')
-     =>s not nix
-     translit(`GNUs not Unix', `a-z', `A-Z')
-     =>GNUS NOT UNIX
-     translit(`GNUs not Unix', `A-Z', `z-a')
-     =>tmfs not fnix
-
-   The first example deletes all uppercase letters, the second converts
-lowercase to uppercase, and the third `mirrors' all uppercase letters,
-while converting them to lowercase.  The two first cases are by far the
-most common.
-
-   The builtin macro `translit' is recognized only when given arguments.
-
-
-File: m4.info,  Node: Patsubst,  Next: Format,  Prev: Translit,  Up: Text 
handling
-
-10.6 Substituting text by regular expression
-============================================
-
-Global substitution in a string is done by `patsubst':
-
-     patsubst(STRING, REGEXP, opt REPLACEMENT)
-   which searches STRING for matches of REGEXP, and substitutes
-REPLACEMENT for each match.  The syntax for regular expressions is the
-same as in GNU Emacs.
-
-   The parts of STRING that are not covered by any match of REGEXP are
-copied to the expansion.  Whenever a match is found, the search
-proceeds from the end of the match, so a character from STRING will
-never be substituted twice.  If REGEXP matches a string of zero length,
-the start position for the search is incremented, to avoid infinite
-loops.
-
-   When a replacement is to be made, REPLACEMENT is inserted into the
-expansion, with `\N' substituted by the text matched by the Nth
-parenthesized sub-expression of REGEXP, `\&' being the text the entire
-regular expression matched.
-
-   The REPLACEMENT argument can be omitted, in which case the text
-matched by REGEXP is deleted.
-
-     patsubst(`GNUs not Unix', `^', `OBS: ')
-     =>OBS: GNUs not Unix
-     patsubst(`GNUs not Unix', `\<', `OBS: ')
-     =>OBS: GNUs OBS: not OBS: Unix
-     patsubst(`GNUs not Unix', `\w*', `(\&)')
-     =>(GNUs)() (not)() (Unix)
-     patsubst(`GNUs not Unix', `\w+', `(\&)')
-     =>(GNUs) (not) (Unix)
-     patsubst(`GNUs not Unix', `[A-Z][a-z]+')
-     =>GN not
-
-   Here is a slightly more realistic example, which capitalizes
-individual word or whole sentences, by substituting calls of the macros
-`upcase' and `downcase' into the strings.
-
-     define(`upcase', `translit(`$*', `a-z', `A-Z')')dnl
-     define(`downcase', `translit(`$*', `A-Z', `a-z')')dnl
-     define(`capitalize1',
-          `regexp(`$1', `^\(\w\)\(\w*\)', `upcase(`\1')`'downcase(`\2')')')dnl
-     define(`capitalize',
-          `patsubst(`$1', `\w+', `capitalize1(`\&')')')dnl
-     capitalize(`GNUs not Unix')
-     =>Gnus Not Unix
-
-   The builtin macro `patsubst' is recognized only when given arguments.
-
-
-File: m4.info,  Node: Format,  Prev: Patsubst,  Up: Text handling
-
-10.7 Formatted output
-=====================
-
-Formatted output can be made with `format':
-
-     format(FORMAT-STRING, ...)
-
-which works much like the C function `printf'.  The first argument is a
-format string, which can contain `%' specifications, and the expansion
-of `format' is the formatted string.
-
-   Its use is best described by a few examples:
-
-     define(`foo', `The brown fox jumped over the lazy dog')
-     =>
-     format(`The string "%s" is %d characters long', foo, len(foo))
-     =>The string "The brown fox jumped over the lazy dog" is 38 characters 
long
-
-   Using the `forloop' macro defined in *Note Loops::, this example
-shows how `format' can be used to produce tabular output.
-
-     forloop(`i', 1, 10, `format(`%6d squared is %10d
-     ', i, eval(i**2))')
-     =>     1 squared is           1
-     =>     2 squared is           4
-     =>     3 squared is           9
-     =>     4 squared is          16
-     =>     5 squared is          25
-     =>     6 squared is          36
-     =>     7 squared is          49
-     =>     8 squared is          64
-     =>     9 squared is          81
-     =>    10 squared is         100
-
-   The builtin `format' is modeled after the ANSI C `printf' function,
-and supports the normal `%' specifiers: `c', `s', `d', `o', `x', `X',
-`u', `e', `E' and `f'; it supports field widths and precisions, and the
-modifiers `+', `-', ` ', `0', `#', `h' and `l'.  For more details on
-the functioning of `printf', see the C Library Manual.
-
-
-File: m4.info,  Node: Arithmetic,  Next: UNIX commands,  Prev: Text handling,  
Up: Top
-
-11 Macros for doing arithmetic
-******************************
-
-Integer arithmetic is included in `m4', with a C-like syntax.  As
-convenient shorthands, there are builtins for simple increment and
-decrement operations.
-
-* Menu:
-
-* Incr::                        Decrement and increment operators
-* Eval::                        Evaluating integer expressions
-
-
-File: m4.info,  Node: Incr,  Next: Eval,  Prev: Arithmetic,  Up: Arithmetic
-
-11.1 Decrement and increment operators
-======================================
-
-Increment and decrement of integers are supported using the builtins
-`incr' and `decr':
-
-     incr(NUMBER)
-     decr(NUMBER)
-
-which expand to the numerical value of NUMBER, incremented, or
-decremented, respectively, by one.
-
-     incr(4)
-     =>5
-     decr(7)
-     =>6
-
-   The builtin macros `incr' and `decr' are recognized only when given
-arguments.
-
-
-File: m4.info,  Node: Eval,  Prev: Incr,  Up: Arithmetic
-
-11.2 Evaluating integer expressions
-===================================
-
-Integer expressions are evaluated with `eval':
-
-     eval(EXPRESSION, opt RADIX, opt WIDTH)
-
-which expands to the value of EXPRESSION.
-
-   Expressions can contain the following operators, listed in order of
-decreasing precedence.
-
-`-'
-     Unary minus
-
-`**'
-     Exponentiation
-
-`*  /  %'
-     Multiplication, division and modulo
-
-`+  -'
-     Addition and subtraction
-
-`<<  >>'
-     Shift left or right
-
-`==  !=  >  >=  <  <='
-     Relational operators
-
-`!'
-     Logical negation
-
-`~'
-     Bitwise negation
-
-`&'
-     Bitwise and
-
-`^'
-     Bitwise exclusive-or
-
-`|'
-     Bitwise or
-
-`&&'
-     Logical and
-
-`||'
-     Logical or
-
-   All operators, except exponentiation, are left associative.
-
-   Note that many `m4' implementations use `^' as an alternate operator
-for the exponentiation, while many others use `^' for the bitwise
-exclusive-or.  GNU `m4' changed its behavior: it used to exponentiate
-for `^', it now computes the bitwise exclusive-or.
-
-   Numbers without special prefix are given decimal.  A simple `0'
-prefix introduces an octal number.  `0x' introduces an hexadecimal
-number.  `0b' introduces a binary number.  `0r' introduces a number
-expressed in any radix between 1 and 36: the prefix should be
-immediately followed by the decimal expression of the radix, a colon,
-then the digits making the number.  For any radix, the digits are `0',
-`1', `2', ....  Beyond `9', the digits are `a', `b' ... up to `z'.
-Lower and upper case letters can be used interchangeably in numbers
-prefixes and as number digits.
-
-   Parentheses may be used to group subexpressions whenever needed.
-For the relational operators, a true relation returns `1', and a false
-relation return `0'.
-
-   Here are a few examples of use of `eval'.
-
-     eval(-3 * 5)
-     =>-15
-     eval(index(`Hello world', `llo') >= 0)
-     =>1
-     define(`square', `eval(($1)**2)')
-     =>
-     square(9)
-     =>81
-     square(square(5)+1)
-     =>676
-     define(`foo', `666')
-     =>
-     eval(`foo'/6)
-     error-->51.eval:14: m4: Bad expression in eval: foo/6
-     =>
-     eval(foo/6)
-     =>111
-
-   As the second to last example shows, `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 `eval'.
-
-   If RADIX is specified, it specifies the radix to be used in the
-expansion.  The default radix is 10.  The result of `eval' is always
-taken to be signed.  The WIDTH argument specifies a minimum output
-width.  The result is zero-padded to extend the expansion to the
-requested width.
-
-     eval(666, 10)
-     =>666
-     eval(666, 11)
-     =>556
-     eval(666, 6)
-     =>3030
-     eval(666, 6, 10)
-     =>0000003030
-     eval(-666, 6, 10)
-     =>-000003030
-
-   Take note that RADIX cannot be larger than 36.
-
-   The builtin macro `eval' is recognized only when given arguments.
-
-
-File: m4.info,  Node: UNIX commands,  Next: Miscellaneous,  Prev: Arithmetic,  
Up: Top
-
-12 Running UNIX commands
-************************
-
-There are a few builtin macros in `m4' that allow you to run UNIX
-commands from within `m4'.
-
-* Menu:
-
-* Syscmd::                      Executing simple commands
-* Esyscmd::                     Reading the output of commands
-* Sysval::                      Exit codes
-* Maketemp::                    Making names for temporary files
-
-
-File: m4.info,  Node: Syscmd,  Next: Esyscmd,  Prev: UNIX commands,  Up: UNIX 
commands
-
-12.1 Executing simple commands
-==============================
-
-Any shell command can be executed, using `syscmd':
-
-     syscmd(SHELL-COMMAND)
-
-which executes SHELL-COMMAND as a shell command.
-
-   The expansion of `syscmd' is void, _not_ the output from
-SHELL-COMMAND!  Output or error messages from SHELL-COMMAND are not
-read by `m4'.  *Note Esyscmd::, if you need to process the command
-output.
-
-   Prior to executing the command, `m4' flushes its output buffers.
-The default standard input, output and error of SHELL-COMMAND are the
-same as those of `m4'.
-
-   The builtin macro `syscmd' is recognized only when given arguments.
-
-
-File: m4.info,  Node: Esyscmd,  Next: Sysval,  Prev: Syscmd,  Up: UNIX commands
-
-12.2 Reading the output of commands
-===================================
-
-If you want `m4' to read the output of a UNIX command, use `esyscmd':
-
-     esyscmd(SHELL-COMMAND)
-
-which expands to the standard output of the shell command SHELL-COMMAND.
-
-   Prior to executing the command, `m4' flushes its output buffers.
-The default standard input and error output of SHELL-COMMAND are the
-same as those of `m4'.  The error output of SHELL-COMMAND is not a part
-of the expansion: it will appear along with the error output of `m4'.
-
-   Assume you are positioned into the `checks' directory of GNU `m4'
-distribution, then:
-
-     define(`vice', `esyscmd(grep Vice ../COPYING)')
-     =>
-     vice
-     =>  Ty Coon, President of Vice
-     =>
-
-   Note how the expansion of `esyscmd' has a trailing newline.
-
-   The builtin macro `esyscmd' is recognized only when given arguments.
-
-
-File: m4.info,  Node: Sysval,  Next: Maketemp,  Prev: Esyscmd,  Up: UNIX 
commands
-
-12.3 Exit codes
-===============
-
-To see whether a shell command succeeded, use `sysval':
-
-     sysval
-
-which expands to the exit status of the last shell command run with
-`syscmd' or `esyscmd'.
-
-     syscmd(`false')
-     =>
-     ifelse(sysval, 0, zero, non-zero)
-     =>non-zero
-     syscmd(`true')
-     =>
-     sysval
-     =>0
-
-
-File: m4.info,  Node: Maketemp,  Prev: Sysval,  Up: UNIX commands
-
-12.4 Making names for temporary files
-=====================================
-
-Commands specified to `syscmd' or `esyscmd' might need a temporary
-file, for output or for some other purpose.  There is a builtin macro,
-`maketemp', for making temporary file names:
-
-     maketemp(TEMPLATE)
-
-which expands to a name of a new, empty file, made from the string
-TEMPLATE, which should end with the string `XXXXXX'.  The six `X''s are
-then replaced, usually with something that includes the process id of
-the `m4' process, in order to make the filename unique.
-
-     maketemp(`/tmp/fooXXXXXX')
-     =>/tmp/fooa07346
-
-   The builtin macro `maketemp' is recognized only when given arguments.
-
-
-File: m4.info,  Node: Miscellaneous,  Next: Frozen files,  Prev: UNIX 
commands,  Up: Top
-
-13 Miscellaneous builtin macros
-*******************************
-
-This chapter describes various builtins, that do not really belong in
-any of the previous chapters.
-
-* Menu:
-
-* Errprint::                    Printing error messages
-* M4exit::                      Exiting from m4
-
-
-File: m4.info,  Node: Errprint,  Next: M4exit,  Prev: Miscellaneous,  Up: 
Miscellaneous
-
-13.1 Printing error messages
-============================
-
-You can print error messages using `errprint':
-
-     errprint(MESSAGE, ...)
-   which simply prints MESSAGE and the rest of the arguments on the
-standard error output.
-
-   The expansion of `errprint' is void.
-
-     errprint(`Illegal arguments to forloop
-     ')
-     error-->Illegal arguments to forloop
-     =>
-
-   A trailing newline is _not_ printed automatically, so it must be
-supplied as part of the argument, as in the example.  (BSD flavored
-`m4''s do append a trailing newline on each `errprint' call).
-
-   To make it possible to specify the location of the error, two
-utility builtins exist:
-
-     __file__
-     __line__
-   which expands to the quoted name of the current input file, and the
-current input line number in that file.
-
-     errprint(`m4:'__file__:__line__: `Input error
-     ')
-     error-->m4:56.errprint:2: Input error
-     =>
-
-
-File: m4.info,  Node: M4exit,  Prev: Errprint,  Up: Miscellaneous
-
-13.2 Exiting from `m4'
-======================
-
-If you need to exit from `m4' before the entire input has been read,
-you can use `m4exit':
-
-     m4exit(opt CODE)
-   which causes `m4' to exit, with exit code CODE.  If CODE is left
-out, the exit code is zero.
-
-     define(`fatal_error', `errprint(`m4: '__file__: __line__`: fatal error: $*
-     ')m4exit(1)')
-     =>
-     fatal_error(`This is a BAD one, buster')
-     error-->m4: 57.m4exit: 5: fatal error: This is a BAD one, buster
-
-   After this macro call, `m4' will exit with exit code 1.  This macro
-is only intended for error exits, since the normal exit procedures are
-not followed, e.g., diverted text is not undiverted, and saved text
-(*note M4wrap::) is not reread.
-
-
-File: m4.info,  Node: Frozen files,  Next: Compatibility,  Prev: 
Miscellaneous,  Up: Top
-
-14 Fast loading of frozen states
-********************************
-
-Some bigger `m4' applications may be built over a common base
-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 `m4' invocation prior to the user's
-input file, or else, `include''d from this input file.
-
-   Reading the common base of a big application, over and over again,
-may be time consuming.  GNU `m4' offers some machinery to speed up the
-start of an application using lengthy common bases.  Presume the user
-repeatedly uses:
-
-     m4 base.m4 input.m4
-
-with a varying contents of `input.m4', but a rather fixed contents for
-`base.m4'.  Then, the user might rather execute:
-
-     m4 -F base.m4f base.m4
-
-once, and further execute, as often as needed:
-
-     m4 -R base.m4f input.m4
-
-with the varying input.  The first call, containing the `-F' option,
-only reads and executes file `base.m4', so defining various application
-macros and computing other initializations.  Only once the input file
-`base.m4' has been completely processed, GNU `m4' produces on
-`base.m4f' a "frozen" file, that is, a file which contains a kind of
-snapshot of the `m4' internal state.
-
-   Later calls, containing the `-R' option, are able to reload the
-internal state of `m4''s memory, from `base.m4f', _prior_ to reading
-any other input files.  By this mean, instead of starting with a virgin
-copy of `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 `base.m4' has been read anew.  However, this effect is achieved a
-lot faster.
-
-   Only one frozen file may be created or read in any one `m4'
-invocation.  It is not possible to recover two frozen files at once.
-However, frozen files may be updated incrementally, through using `-R'
-and `-F' options simultaneously.  For example, if some care is taken,
-the command:
-
-     m4 file1.m4 file2.m4 file3.m4 file4.m4
-
-could be broken down in the following sequence, accumulating the same
-output:
-
-     m4 -F file1.m4f file1.m4
-     m4 -R file1.m4f -F file2.m4f file2.m4
-     m4 -R file2.m4f -F file3.m4f file3.m4
-     m4 -R file3.m4f file4.m4
-
-   Some care is necessary because not every effort has been made for
-this to work in all cases.  In particular, the trace attribute of
-macros is not handled, nor the current setting of `changeword'.  Also,
-interactions for some options of `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 `pushdef''ed definitions are handled
-correctly, so are `undefine''d or renamed builtins, changed strings for
-quotes or comments.
-
-   When an `m4' run is to be frozen, the automatic undiversion which
-takes place at end of execution is inhibited.  Instead, all positively
-numbered diversions are saved into the frozen file.  The active
-diversion number is also transmitted.
-
-   A frozen file to be reloaded need not reside in the current
-directory.  It is looked up the same way as an `include' file (*note
-Search Path::).
-
-   Frozen files are sharable across architectures.  It is safe to write
-a frozen file one one machine and read it on another, given that the
-second machine uses the same, or a newer version of GNU `m4'.  These
-are simple (editable) text files, made up of directives, each starting
-with a capital letter and ending with a newline (<NL>).  Wherever a
-directive is expected, the character `#' introduces a comment line,
-empty lines are also ignored.  In the following descriptions, LENGTHs
-always refer to corresponding STRINGs.  Numbers are always expressed in
-decimal.  The directives are:
-
-`V NUMBER <NL>'
-     Confirms the format of the file.  NUMBER should be 1.
-
-`C LENGTH1 , LENGTH2 <NL> STRING1 STRING2 <NL>'
-     Uses STRING1 and STRING2 as the beginning comment and end comment
-     strings.
-
-`Q LENGTH1 , LENGTH2 <NL> STRING1 STRING2 <NL>'
-     Uses STRING1 and STRING2 as the beginning quote and end quote
-     strings.
-
-`F LENGTH1 , LENGTH2 <NL> STRING1 STRING2 <NL>'
-     Defines, through `pushdef', a definition for STRING1 expanding to
-     the function whose builtin name is STRING2.
-
-`T LENGTH1 , LENGTH2 <NL> STRING1 STRING2 <NL>'
-     Defines, though `pushdef', a definition for STRING1 expanding to
-     the text given by STRING2.
-
-`D NUMBER, LENGTH <NL> STRING <NL>'
-     Selects diversion NUMBER, making it current, then copy STRING in
-     the current diversion.  NUMBER may be a negative number for a
-     non-existing diversion.  To merely specify an active selection,
-     use this command with an empty STRING.  With 0 as the diversion
-     NUMBER, STRING will be issued on standard output at reload time,
-     however this may not be produced from within `m4'.
-
-
-
-File: m4.info,  Node: Compatibility,  Next: Concept index,  Prev: Frozen 
files,  Up: Top
-
-15 Compatibility with other versions of `m4'
-********************************************
-
-This chapter describes the differences between this implementation of
-`m4', and the implementation found under UNIX, notably System V,
-Release 3.
-
-   There are also differences in BSD flavors of `m4'.  No attempt is
-made to summarize these here.
-
-* Menu:
-
-* Extensions::                  Extensions in GNU m4
-* Incompatibilities::           Facilities in System V m4 not in GNU m4
-* Other Incompat::              Other incompatibilities
-
-
-File: m4.info,  Node: Extensions,  Next: Incompatibilities,  Prev: 
Compatibility,  Up: Compatibility
-
-15.1 Extensions in GNU `m4'
-===========================
-
-This version of `m4' contains a few facilities, that do not exist in
-System V `m4'.  These extra facilities are all suppressed by using the
-`-G' command line option, unless overridden by other command line
-options.
-
-   * In the `$'N notation for macro arguments, N can contain several
-     digits, while the System V `m4' only accepts one digit.  This
-     allows macros in GNU `m4' to take any number of arguments, and not
-     only nine (*note Arguments::).
-
-   * Files included with `include' and `sinclude' are sought in a user
-     specified search path, if they are not found in the working
-     directory.  The search path is specified by the `-I' option and the
-     `M4PATH' environment variable (*note Search Path::).
-
-   * Arguments to `undivert' can be non-numeric, in which case the named
-     file will be included uninterpreted in the output (*note
-     Undivert::).
-
-   * Formatted output is supported through the `format' builtin, which
-     is modeled after the C library function `printf' (*note Format::).
-
-   * Searches and text substitution through regular expressions are
-     supported by the `regexp' (*note Regexp::) and `patsubst' (*note
-     Patsubst::) builtins.
-
-   * The output of shell commands can be read into `m4' with `esyscmd'
-     (*note Esyscmd::).
-
-   * There is indirect access to any builtin macro with `builtin'
-     (*note Builtin::).
-
-   * Macros can be called indirectly through `indir' (*note Indir::).
-
-   * The name of the current input file and the current input line
-     number are accessible through the builtins `__file__' and
-     `__line__' (*note Errprint::).
-
-   * The format of the output from `dumpdef' and macro tracing can be
-     controlled with `debugmode' (*note Debug Levels::).
-
-   * The destination of trace and debug output can be controlled with
-     `debugfile' (*note Debug Output::).
-
-   In addition to the above extensions, GNU `m4' implements the
-following command line options: `-F', `-G', `-I', `-L', `-R', `-V',
-`-W', `-d', `-l', `-o' and `-t'.  *Note Invoking m4::, for a
-description of these options.
-
-   Also, the debugging and tracing facilities in GNU `m4' are much more
-extensive than in most other versions of `m4'.
-
-
-File: m4.info,  Node: Incompatibilities,  Next: Other Incompat,  Prev: 
Extensions,  Up: Compatibility
-
-15.2 Facilities in System V `m4' not in GNU `m4'
-================================================
-
-The version of `m4' from System V contains a few facilities that have
-not been implemented in GNU `m4' yet.
-
-   * System V `m4' supports multiple arguments to `defn'.  This is not
-     implemented in GNU `m4'.  Its usefulness is unclear to me.
-
-
-File: m4.info,  Node: Other Incompat,  Prev: Incompatibilities,  Up: 
Compatibility
-
-15.3 Other incompatibilities
-============================
-
-There are a few other incompatibilities between this implementation of
-`m4', and the System V version.
-
-   * GNU `m4' implements sync lines differently from System V `m4',
-     when text is being diverted.  GNU `m4' outputs the sync lines when
-     the text is being diverted, and System V `m4' when the diverted
-     text is being brought back.
-
-     The problem is which lines and filenames should be attached to
-     text that is being, or has been, diverted.  System V `m4' regards
-     all the diverted text as being generated by the source line
-     containing the `undivert' call, whereas GNU `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 `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.
-
-   * GNU `m4' makes no attempt at prohiting autoreferential definitions
-     like:
-
-          define(`x', `x')
-          define(`x', `x ')
-
-     There is nothing inherently wrong with defining `x' to return `x'.
-     The wrong thing is to expand `x' unquoted.  In `m4', one might
-     use macros to hold strings, as we do for variables in other
-     programming languages, further checking them with:
-
-          ifelse(defn(`HOLDER'), `VALUE', ...)
-
-     In cases like this one, an interdiction for a macro to hold its own
-     name would be a useless limitation.  Of course, this leave more
-     rope for the GNU `m4' user to hang himself!  Rescanning hangs may
-     be avoided through careful programming, a little like for endless
-     loops in traditional programming languages.
-
-   * GNU `m4' without `-G' option will define the macro `__gnu__' to
-     expand to the empty string.
-
-     On UNIX systems, GNU `m4' without the `-G' option will define the
-     macro `__unix__', otherwise the macro `unix'.  Both will expand to
-     the empty string.
-
-
-File: m4.info,  Node: Concept index,  Next: Macro index,  Prev: Compatibility, 
 Up: Top
-
-Concept index
-*************
-
--* Menu:
-
-* arguments to macros:                   Macro Arguments.     (line   6)
-* Arguments to macros:                   Arguments.           (line   6)
-* arguments to macros, special:          Pseudo Arguments.    (line   6)
-* arguments, quoted macro:               Quoting Arguments.   (line   6)
-* arithmetic:                            Arithmetic.          (line   6)
-* builtins, indirect call of:            Builtin.             (line   6)
-* call of builtins, indirect:            Builtin.             (line   6)
-* call of macros, indirect:              Indir.               (line   6)
-* changing comment delimiters:           Changecom.           (line   6)
-* changing the quote delimiters:         Changequote.         (line   6)
-* characters, translating:               Translit.            (line   6)
-* command line, filenames on the:        Invoking m4.         (line 176)
-* command line, macro definitions on the: Invoking m4.        (line 143)
-* command line, options:                 Invoking m4.         (line  10)
-* commands, exit code from UNIX:         Sysval.              (line   6)
-* commands, running UNIX:                UNIX commands.       (line   6)
-* comment delimiters, changing:          Changecom.           (line   6)
-* comments:                              Comments.            (line   6)
-* comments, copied to output:            Changecom.           (line  28)
-* comparing strings:                     Ifelse.              (line   6)
-* compatibility:                         Compatibility.       (line   6)
-* conditionals:                          Ifdef.               (line   6)
-* controlling debugging output:          Debug Levels.        (line   6)
-* counting loops:                        Loops.               (line  42)
-* debugging output, controlling:         Debug Levels.        (line   6)
-* debugging output, saving:              Debug Output.        (line   6)
-* decrement operator:                    Incr.                (line   6)
-* defining new macros:                   Definitions.         (line   6)
-* definitions, displaying macro:         Dumpdef.             (line   6)
-* deleting macros:                       Undefine.            (line   6)
-* deleting whitespace in input:          Dnl.                 (line   6)
-* discarding diverted text:              Cleardiv.            (line   6)
-* displaying macro definitions:          Dumpdef.             (line   6)
-* diversion numbers:                     Divnum.              (line   6)
-* diverted text, discarding:             Cleardiv.            (line   6)
-* diverting output to files:             Divert.              (line   6)
-* dumping into frozen file:              Frozen files.        (line   6)
-* error messages, printing:              Errprint.            (line   6)
-* evaluation, of integer expressions:    Eval.                (line   6)
-* executing UNIX commands:               UNIX commands.       (line   6)
-* exit code from UNIX commands:          Sysval.              (line   6)
-* exiting from m4:                       M4exit.              (line   6)
-* expansion of macros:                   Macro expansion.     (line   6)
-* expansion, tracing macro:              Trace.               (line   6)
-* expressions, evaluation of integer:    Eval.                (line   6)
-* extracting substrings:                 Substr.              (line   6)
-* fast loading of frozen files:          Frozen files.        (line   6)
-* file inclusion <1>:                    Undivert.            (line  53)
-* file inclusion:                        File Inclusion.      (line   6)
-* filenames, on the command line:        Invoking m4.         (line 176)
-* files, diverting output to:            Divert.              (line   6)
-* files, names of temporary:             Maketemp.            (line   6)
-* forloops:                              Loops.               (line  42)
-* formatted output:                      Format.              (line   6)
-* frozen files for fast loading:         Frozen files.        (line   6)
-* GNU extensions <1>:                    Undivert.            (line  53)
-* GNU extensions <2>:                    Patsubst.            (line   6)
-* GNU extensions <3>:                    Extensions.          (line   6)
-* GNU extensions <4>:                    Search Path.         (line   6)
-* GNU extensions <5>:                    Frozen files.        (line   6)
-* GNU extensions <6>:                    Indir.               (line   6)
-* GNU extensions <7>:                    Regexp.              (line   6)
-* GNU extensions <8>:                    Debug Output.        (line   6)
-* GNU extensions <9>:                    Debug Levels.        (line  59)
-* GNU extensions <10>:                   Builtin.             (line   6)
-* GNU extensions <11>:                   Format.              (line   6)
-* GNU extensions <12>:                   Esyscmd.             (line   6)
-* GNU extensions:                        Arguments.           (line  28)
-* included files, search path for:       Search Path.         (line   6)
-* inclusion, of files <1>:               File Inclusion.      (line   6)
-* inclusion, of files:                   Undivert.            (line  53)
-* increment operator:                    Incr.                (line   6)
-* indirect call of builtins:             Builtin.             (line   6)
-* indirect call of macros:               Indir.               (line   6)
-* initialization, frozen states:         Frozen files.        (line   6)
-* input tokens:                          Syntax.              (line   6)
-* input, saving:                         M4wrap.              (line   6)
-* integer arithmetic:                    Arithmetic.          (line   6)
-* integer expression evaluation:         Eval.                (line   6)
-* length of strings:                     Len.                 (line   6)
-* lexical structure of words:            Changeword.          (line   6)
-* loops:                                 Loops.               (line  10)
-* loops, counting:                       Loops.               (line  42)
-* macro definitions, on the command line: Invoking m4.        (line 143)
-* macro expansion, tracing:              Trace.               (line   6)
-* macro invocation:                      Invocation.          (line   6)
-* macros, arguments to <1>:              Arguments.           (line   6)
-* macros, arguments to:                  Macro Arguments.     (line   6)
-* macros, displaying definitions:        Dumpdef.             (line   6)
-* macros, expansion of:                  Macro expansion.     (line   6)
-* macros, how to define new:             Definitions.         (line   6)
-* macros, how to delete:                 Undefine.            (line   6)
-* macros, how to rename:                 Defn.                (line   6)
-* macros, indirect call of:              Indir.               (line   6)
-* macros, quoted arguments to:           Quoting Arguments.   (line   6)
-* macros, recursive:                     Loops.               (line   6)
-* macros, special arguments to:          Pseudo Arguments.    (line   6)
-* macros, temporary redefinition of:     Pushdef.             (line   6)
-* messages, printing error:              Errprint.            (line   6)
-* multibranches:                         Ifelse.              (line  33)
-* names:                                 Names.               (line   6)
-* options, command line:                 Invoking m4.         (line  10)
-* output, diverting to files:            Divert.              (line   6)
-* output, formatted:                     Format.              (line   6)
-* output, saving debugging:              Debug Output.        (line   6)
-* pattern substitution:                  Patsubst.            (line   6)
-* printing error messages:               Errprint.            (line   6)
-* quote delimiters, changing the:        Changequote.         (line   6)
-* quoted macro arguments:                Quoting Arguments.   (line   6)
-* quoted string:                         Quoted strings.      (line   6)
-* recursive macros:                      Loops.               (line   6)
-* redefinition of macros, temporary:     Pushdef.             (line   6)
-* regular expressions <1>:               Patsubst.            (line   6)
-* regular expressions:                   Regexp.              (line   6)
-* reloading a frozen file:               Frozen files.        (line   6)
-* renaming macros:                       Defn.                (line   6)
-* running UNIX commands:                 UNIX commands.       (line   6)
-* saving debugging output:               Debug Output.        (line   6)
-* saving input:                          M4wrap.              (line   6)
-* search path for included files:        Search Path.         (line   6)
-* special arguments to macros:           Pseudo Arguments.    (line   6)
-* strings, length of:                    Len.                 (line   6)
-* substitution by regular expression:    Patsubst.            (line   6)
-* substrings, extracting:                Substr.              (line   6)
-* temporary filenames:                   Maketemp.            (line   6)
-* temporary redefinition of macros:      Pushdef.             (line   6)
-* tokens:                                Syntax.              (line   6)
-* tracing macro expansion:               Trace.               (line   6)
-* translating characters:                Translit.            (line   6)
-* undefining macros:                     Undefine.            (line   6)
-* UNIX commands, exit code from:         Sysval.              (line   6)
-* UNIX commands, running:                UNIX commands.       (line   6)
-* words, lexical structure of:           Changeword.          (line   6)
-
-
-File: m4.info,  Node: Macro index,  Prev: Concept index,  Up: Top
-
-Macro index
-***********
-
-References are exclusively to the places where a builtin is introduced
-the first time.  Names starting and ending with `__' have these
-characters removed in the index.
-
--* Menu:
-
-* builtin:                               Builtin.              (line  6)
-* changecom:                             Changecom.            (line  6)
-* changequote:                           Changequote.          (line  6)
-* changeword:                            Changeword.           (line  6)
-* debugfile:                             Debug Output.         (line  6)
-* debugmode:                             Debug Levels.         (line 59)
-* decr:                                  Incr.                 (line  6)
-* define:                                Define.               (line  6)
-* defn:                                  Defn.                 (line  6)
-* divert:                                Divert.               (line  6)
-* divnum:                                Divnum.               (line  6)
-* dnl:                                   Dnl.                  (line  6)
-* dumpdef:                               Dumpdef.              (line  6)
-* errprint:                              Errprint.             (line  6)
-* esyscmd:                               Esyscmd.              (line  6)
-* eval:                                  Eval.                 (line  6)
-* file:                                  Errprint.             (line 26)
-* format:                                Format.               (line  6)
-* gnu:                                   Other Incompat.       (line 44)
-* ifdef:                                 Ifdef.                (line  6)
-* ifelse:                                Ifelse.               (line  6)
-* include:                               Include.              (line  6)
-* incr:                                  Incr.                 (line  6)
-* index:                                 Index macro.          (line  6)
-* indir:                                 Indir.                (line  6)
-* len:                                   Len.                  (line  6)
-* line:                                  Errprint.             (line 26)
-* m4exit:                                M4exit.               (line  6)
-* m4wrap:                                M4wrap.               (line  6)
-* maketemp:                              Maketemp.             (line  6)
-* patsubst:                              Patsubst.             (line  6)
-* popdef:                                Pushdef.              (line  7)
-* pushdef:                               Pushdef.              (line  7)
-* regexp:                                Regexp.               (line  6)
-* shift:                                 Loops.                (line 13)
-* sinclude:                              Include.              (line  6)
-* substr:                                Substr.               (line  6)
-* syscmd:                                Syscmd.               (line  6)
-* sysval:                                Sysval.               (line  6)
-* traceoff:                              Trace.                (line  6)
-* traceon:                               Trace.                (line  6)
-* translit:                              Translit.             (line  6)
-* undefine:                              Undefine.             (line  6)
-* undivert:                              Undivert.             (line  6)
-* unix:                                  Other Incompat.       (line 47)
-
-
-
-Tag Table:
-Node: Top985
-Node: Preliminaries6984
-Node: Intro7710
-Node: History9324
-Node: Invoking m410250
-Node: Bugs17051
-Node: Manual18324
-Node: Syntax19695
-Node: Names20283
-Node: Quoted strings20661
-Node: Other tokens21251
-Node: Comments21473
-Node: Macros22141
-Node: Invocation22635
-Node: Inhibiting Invocation23451
-Node: Macro Arguments26602
-Node: Quoting Arguments27871
-Node: Macro expansion28681
-Node: Definitions29349
-Node: Define30126
-Node: Arguments30942
-Node: Pseudo Arguments32427
-Node: Undefine34283
-Node: Defn34950
-Node: Pushdef36112
-Node: Indir37953
-Node: Builtin38722
-Node: Conditionals39173
-Node: Ifdef39881
-Node: Ifelse40655
-Node: Loops42426
-Node: Debugging45703
-Node: Dumpdef46283
-Node: Trace47137
-Node: Debug Levels48522
-Node: Debug Output50912
-Node: Input Control51439
-Node: Dnl51977
-Node: Changequote53109
-Node: Changecom54480
-Node: Changeword55771
-Node: M4wrap58988
-Node: File Inclusion60197
-Node: Include60514
-Node: Search Path62449
-Node: Diversions63240
-Node: Divert64478
-Node: Undivert65615
-Node: Divnum67554
-Node: Cleardiv68104
-Node: Text handling69145
-Node: Len69868
-Node: Index macro70279
-Node: Regexp70877
-Node: Substr71981
-Node: Translit72608
-Node: Patsubst74058
-Node: Format76158
-Node: Arithmetic77654
-Node: Incr78102
-Node: Eval78613
-Node: UNIX commands81619
-Node: Syscmd82093
-Node: Esyscmd82814
-Node: Sysval83767
-Node: Maketemp84181
-Node: Miscellaneous84931
-Node: Errprint85303
-Node: M4exit86305
-Node: Frozen files87099
-Node: Compatibility92022
-Node: Extensions92643
-Node: Incompatibilities95006
-Node: Other Incompat95455
-Node: Concept index97625
-Node: Macro index107476
-
-End Tag Table




reply via email to

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