This is m4.info, produced by makeinfo version 5.1 from m4.texi.

This manual (22 September 2013) is for GNU M4 (version 1.4.17), a
package containing an implementation of the m4 macro language.

   Copyright (C) 1989-1994, 2004-2013 Free Software Foundation, Inc.

     Permission is granted to copy, distribute and/or modify this
     document under the terms of the GNU Free Documentation License,
     Version 1.3 or any later version published by the Free Software
     Foundation; with no Invariant Sections, no Front-Cover Texts, and
     no Back-Cover Texts.  A copy of the license is included in the
     section entitled "GNU Free Documentation License."
INFO-DIR-SECTION Text creation and manipulation
START-INFO-DIR-ENTRY
* M4: (m4).                     A powerful macro processor.
END-INFO-DIR-ENTRY


File: m4.info,  Node: Top,  Next: Preliminaries,  Up: (dir)

GNU M4
******

This manual (22 September 2013) is for GNU M4 (version 1.4.17), a
package containing an implementation of the m4 macro language.

   Copyright (C) 1989-1994, 2004-2013 Free Software Foundation, Inc.

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

   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 files 'm4-1.4.17/AUTHORS'
and 'm4-1.4.17/THANKS' from the GNU M4 distribution.

   This is release 1.4.17.  It is now considered stable: future releases
in the 1.4.x series 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.  In the future, 'm4'
2.0 will come with a different set of new features that provide similar
capabilities, but without the inefficiencies, so changeword will go away
and _you should not count on it_.

* Menu:

* Preliminaries::               Introduction and preliminaries
* Invoking m4::                 Invoking 'm4'
* Syntax::                      Lexical and syntactic conventions

* Macros::                      How to invoke macros
* Definitions::                 How to define new macros
* Conditionals::                Conditionals, loops, and recursion

* 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
* Shell commands::              Macros for running shell commands
* Miscellaneous::               Miscellaneous builtin macros
* Frozen files::                Fast loading of frozen state

* Compatibility::               Compatibility with other versions of 'm4'
* Answers::                     Correct version of some examples

* Copying This Package::        How to make copies of the overall M4 package
* Copying This Manual::         How to make copies of this manual
* Indices::                     Indices of concepts and macros

 -- The Detailed Node Listing --

Introduction and preliminaries

* Intro::                       Introduction to 'm4'
* History::                     Historical references
* Bugs::                        Problems and bugs
* Manual::                      Using this manual

Invoking 'm4'

* Operation modes::             Command line options for operation modes
* Preprocessor features::       Command line options for preprocessor features
* Limits control::              Command line options for limits control
* Frozen state::                Command line options for frozen state
* Debugging options::           Command line options for debugging
* Command line files::          Specifying input files on the command line

Lexical and syntactic conventions

* Names::                       Macro names
* Quoted strings::              Quoting input to 'm4'
* Comments::                    Comments in 'm4' input
* Other tokens::                Other kinds of input tokens
* Input processing::            How 'm4' copies input to output

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::            Special 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
* Shift::                       Recursion in 'm4'
* Forloop::                     Iteration by counting
* Foreach::                     Iteration by list contents
* Stacks::                      Working with definition stacks
* Composition::                 Building macros with macros

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 text 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
* Cleardivert::                 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

Macros for running shell commands

* Platform macros::             Determining the platform
* Syscmd::                      Executing simple commands
* Esyscmd::                     Reading the output of commands
* Sysval::                      Exit status
* Mkstemp::                     Making temporary files

Miscellaneous builtin macros

* Errprint::                    Printing error messages
* Location::                    Printing current location
* M4exit::                      Exiting from 'm4'

Fast loading of frozen state

* Using frozen files::          Using frozen files
* Frozen file format::          Frozen file format

Compatibility with other versions of 'm4'

* Extensions::                  Extensions in GNU M4
* Incompatibilities::           Facilities in System V m4 not in GNU M4
* Other Incompatibilities::     Other incompatibilities

Correct version of some examples

* Improved exch::               Solution for 'exch'
* Improved forloop::            Solution for 'forloop'
* Improved foreach::            Solution for 'foreach'
* Improved copy::               Solution for 'copy'
* Improved m4wrap::             Solution for 'm4wrap'
* Improved cleardivert::        Solution for 'cleardivert'
* Improved capitalize::         Solution for 'capitalize'
* Improved fatal_error::        Solution for 'fatal_error'

How to make copies of the overall M4 package

* GNU General Public License::  License for copying the M4 package

How to make copies of this manual

* GNU Free Documentation License::  License for copying this manual

Indices of concepts and macros

* Macro index::                 Index for all 'm4' macros
* Concept index::               Index for many concepts



File: m4.info,  Node: Preliminaries,  Next: Invoking m4,  Prev: Top,  Up: Top

1 Introduction and preliminaries
********************************

This first chapter explains what GNU 'm4' is, 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
* Bugs::                        Problems and bugs
* Manual::                      Using this manual


File: m4.info,  Node: Intro,  Next: History,  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 shell commands, doing integer arithmetic, manipulating text in
various ways, performing 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, and has
been standardized by POSIX. Usually, only a small percentage of users
are aware of its existence.  However, those who find it often become
committed users.  The popularity of GNU Autoconf, which requires GNU
'm4' for _generating_ '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 4 version, except
for some minor differences.  *Note Compatibility::, for more details.

   Some people find 'm4' to be fairly addictive.  They first use 'm4'
for simple problems, then take bigger and bigger challenges, learning
how to write complex sets of 'm4' 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: Bugs,  Prev: Intro,  Up: Preliminaries

1.2 Historical references
=========================

Macro languages were invented early in the history of computing.  In the
1950s Alan Perlis suggested that the macro language be independent of
the language being processed.  Techniques such as conditional and
recursive macros, and using macros to define other macros, were
described by Doug McIlroy of Bell Labs in "Macro Instruction Extensions
of Compiler Languages", _Communications of the ACM_ 3, 4 (1960), 214-20,
<http://dx.doi.org/10.1145/367177.367223>.

   An important precursor of 'm4' was GPM; see C. Strachey, "A general
purpose macrogenerator", _Computer Journal_ 8, 3 (1965), 225-41,
<http://dx.doi.org/10.1093/comjnl/8.3.225>.  GPM is also succinctly
described in David Gries's book _Compiler Construction for Digital
Computers_, Wiley (1971).  Strachey was a brilliant programmer: GPM fit
into 250 machine instructions!

   Inspired by GPM while visiting Strachey's Lab in 1968, McIlroy wrote
a model preprocessor in that fit into a page of Snobol 3 code, and
McIlroy and Robert Morris developed a series of further models at Bell
Labs.  Andrew D. Hall followed up with M6, a general purpose macro
processor used to port the Fortran source code of the Altran computer
algebra system; see Hall's "The M6 Macro Processor", Computing Science
Technical Report #2, Bell Labs (1972),
<http://cm.bell-labs.com/cm/cs/cstr/2.pdf>.  M6's source code consisted
of about 600 Fortran statements.  Its name was the first of the 'm4'
line.

   The Brian Kernighan and P.J. Plauger book _Software Tools_,
Addison-Wesley (1976), describes and implements a Unix macro-processor
language, which inspired Dennis Ritchie to write 'm3', a macro processor
for the AP-3 minicomputer.

   Kernighan and Ritchie then joined forces to develop the original
'm4', described in "The M4 Macro Processor", Bell Laboratories (1977),
<http://wolfram.schneider.org/bsd/7thEdManVol2/m4/m4.pdf>.  It had only
21 builtin macros.

   While 'GPM' was more _pure_, 'm4' is meant to deal with the true
intricacies of real life: macros can be recognized without being
pre-announced, skipping whitespace or end-of-lines is easier, more
constructs are builtin instead of derived, etc.

   Originally, the Kernighan and Plauger macro-processor, and then 'm3',
formed the engine for the Rational FORTRAN preprocessor, that is, the
'Ratfor' equivalent of 'cpp'.  Later, 'm4' was used as a front-end for
'Ratfor', 'C' and 'Cobol'.

   Rene' Seindal released his implementation of 'm4', GNU 'm4', in 1990,
with the aim of removing the artificial limitations in many of the
traditional 'm4' implementations, such as maximum line length, macro
size, or number of macros.

   The late Professor A. Dain Samples described and implemented a
further evolution in the form of 'M5': "User's Guide to the M5 Macro
Language: 2nd edition", Electronic Announcement on comp.compilers
newsgroup (1992).

   Franc,ois Pinard took over maintenance of GNU 'm4' in 1992, until
1994 when he released GNU 'm4' 1.4, which was the stable release for 10
years.  It was at this time that GNU Autoconf decided to require GNU
'm4' as its underlying engine, since all other implementations of 'm4'
had too many limitations.

   More recently, in 2004, Paul Eggert released 1.4.1 and 1.4.2 which
addressed some long standing bugs in the venerable 1.4 release.  Then in
2005, Gary V. Vaughan collected together the many patches to GNU 'm4'
1.4 that were floating around the net and released 1.4.3 and 1.4.4.  And
in 2006, Eric Blake joined the team and prepared patches for the release
of 1.4.5, 1.4.6, 1.4.7, and 1.4.8.  More bug fixes were incorporated in
2007, with releases 1.4.9 and 1.4.10.  Eric continued with some
portability fixes for 1.4.11 and 1.4.12 in 2008, 1.4.13 in 2009, 1.4.14
and 1.4.15 in 2010, and 1.4.16 in 2011.

   Meanwhile, development has continued on new features for 'm4', such
as dynamic module loading and additional builtins.  When complete, GNU
'm4' 2.0 will start a new series of releases.


File: m4.info,  Node: Bugs,  Next: Manual,  Prev: History,  Up: Preliminaries

1.3 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 <bug-m4@gnu.org>.
Please include the version number of 'm4' you are using.  You can get
this information with the command 'm4 --version'.  Also provide details
about the platform you are executing on.

   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.4 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->'.  When
showing how command line options affect matters, the command line is
shown with a prompt '$ 'like this'', otherwise, you can assume that a
simple 'm4' invocation will work.  Thus:

     $ command line to invoke m4
     Example of input line
     =>Output line from m4
     error->and an error message

   The sequence '^D' in an example indicates the end of the input file.
The sequence '<NL>' refers to the newline character.  The majority of
these examples are self-contained, and you can run them with similar
results by invoking 'm4 -d'.  In fact, the testsuite that is bundled in
the GNU M4 package consists of the examples in this document!  Some of
the examples assume that your current directory is located where you
unpacked the installation, so if you plan on following along, you may
find it helpful to do this now:

     $ cd m4-1.4.17

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

 -- Composite: example (STRING, [COUNT = '1']
     [ARGUMENT]This is a sample prototype.  There is not really a macro
     named 'example', but this documents that if there were, it would be
     a Composite macro, rather than a Builtin.  It requires at least one
     argument, STRING.  Remember that in 'm4', there must not be a space
     between the macro name and the opening parenthesis, unless it was
     intended to call the macro without any arguments.  The brackets
     around COUNT and ARGUMENT show that these arguments are optional.
     If COUNT is omitted, the macro behaves as if count were '1',
     whereas if ARGUMENT is omitted, the macro behaves as if it were the
     empty string.  A blank argument is not the same as an omitted
     argument.  For example, 'example(`a')', 'example(`a',`1')', and
     'example(`a',`1',)' would behave identically with COUNT set to '1';
     while 'example(`a',)' and 'example(`a',`')' would explicitly pass
     the empty string for COUNT.  The ellipses ('...') show that the
     macro processes additional arguments after ARGUMENT, rather than
     ignoring them.

   All macro arguments in 'm4' are strings, but some are given special
interpretation, e.g., as numbers, file names, regular expressions, etc.
The documentation for each macro will state how the parameters are
interpreted, and what happens if the argument cannot be parsed according
to the desired interpretation.  Unless specified otherwise, a parameter
specified to be a number is parsed as a decimal, even if the argument
has leading zeros; and parsing the empty string as a number results in 0
rather than an error, although a warning will be issued.

   This document consistently writes and uses "builtin", without a
hyphen, as if it were an English word.  This is how the 'builtin'
primitive is spelled within 'm4'.


File: m4.info,  Node: Invoking m4,  Next: Syntax,  Prev: Preliminaries,  Up: Top

2 Invoking 'm4'
***************

The format of the 'm4' command is:

     m4 [OPTION...] [FILE...]

   All options begin with '-', or if long option names are used, with
'--'.  A long option name need not be written completely, any
unambiguous prefix is sufficient.  POSIX requires 'm4' to recognize
arguments intermixed with files, even when 'POSIXLY_CORRECT' is set in
the environment.  Most options take effect at startup regardless of
their position, but some are documented below as taking effect after any
files that occurred earlier in the command line.  The argument '--' is a
marker to denote the end of options.

   With short options, options that do not take arguments may be
combined into a single command line argument with subsequent options,
options with mandatory arguments may be provided either as a single
command line argument or as two arguments, and options with optional
arguments must be provided as a single argument.  In other words, 'm4
-QPDfoo -d a -df' is equivalent to 'm4 -Q -P -D foo -d -df -- ./a',
although the latter form is considered canonical.

   With long options, options with mandatory arguments may be provided
with an equal sign ('=') in a single argument, or as two arguments, and
options with optional arguments must be provided as a single argument.
In other words, 'm4 --def foo --debug a' is equivalent to 'm4
--define=foo --debug= -- ./a', although the latter form is considered
canonical (not to mention more robust, in case a future version of 'm4'
introduces an option named '--default').

   'm4' understands the following options, grouped by functionality.

* Menu:

* Operation modes::             Command line options for operation modes
* Preprocessor features::       Command line options for preprocessor features
* Limits control::              Command line options for limits control
* Frozen state::                Command line options for frozen state
* Debugging options::           Command line options for debugging
* Command line files::          Specifying input files on the command line


File: m4.info,  Node: Operation modes,  Next: Preprocessor features,  Up: Invoking m4

2.1 Command line options for operation modes
============================================

Several options control the overall operation of 'm4':

'--help'
     Print a help summary on standard output, then immediately exit 'm4'
     without reading any input files or performing any other actions.

'--version'
     Print the version number of the program on standard output, then
     immediately exit 'm4' without reading any input files or performing
     any other actions.

'-E'
'--fatal-warnings'
     Controls the effect of warnings.  If unspecified, then execution
     continues and exit status is unaffected when a warning is printed.
     If specified exactly once, warnings become fatal; when one is
     issued, execution continues, but the exit status will be non-zero.
     If specified multiple times, then execution halts with non-zero
     status the first time a warning is issued.  The introduction of
     behavior levels is new to M4 1.4.9; for behavior consistent with
     earlier versions, you should specify '-E' twice.

'-i'
'--interactive'
'-e'
     Makes this invocation of 'm4' interactive.  This means that all
     output will be unbuffered, and interrupts will be ignored.  The
     spelling '-e' exists for compatibility with other 'm4'
     implementations, and issues a warning because it may be withdrawn
     in a future version of GNU M4.

'-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__'.  This option has no effect if '-R' is also specified.

'-Q'
'--quiet'
'--silent'
     Suppress warnings, such as missing or superfluous arguments in
     macro calls, or treating the empty string as zero.

'--warn-macro-sequence[=REGEXP]'
     Issue a warning if the regular expression REGEXP has a non-empty
     match in any macro definition (either by 'define' or 'pushdef').
     Empty matches are ignored; therefore, supplying the empty string as
     REGEXP disables any warning.  If the optional REGEXP is not
     supplied, then the default regular expression is
     '\$\({[^}]*}\|[0-9][0-9]+\)' (a literal '$' followed by multiple
     digits or by an open brace), since these sequences will change
     semantics in the default operation of GNU M4 2.0 (due to a change
     in how more than 9 arguments in a macro definition will be handled,
     *note Arguments::).  Providing an alternate regular expression can
     provide a useful reverse lookup feature of finding where a macro is
     defined to have a given definition.

'-W REGEXP'
'--word-regexp=REGEXP'
     Use REGEXP as an alternative syntax for macro names.  This
     experimental option will not be present in all GNU 'm4'
     implementations (*note Changeword::).


File: m4.info,  Node: Preprocessor features,  Next: Limits control,  Prev: Operation modes,  Up: Invoking m4

2.2 Command line options for preprocessor features
==================================================

Several options allow 'm4' to behave more like a preprocessor.  Macro
definitions and deletions can be made on the command line, the search
path can be altered, and the output file can track where the input came
from.  These features occur with the following options:

'-D NAME[=VALUE]'
'--define=NAME[=VALUE]'
     This enters NAME into the symbol table.  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.  This option may be given
     more than once; order with respect to file names is significant,
     and redefining the same NAME loses the previous value.

'-I DIRECTORY'
'--include=DIRECTORY'
     Make 'm4' search DIRECTORY for included files that are not found in
     the current working directory.  *Note Search Path::, for more
     details.  This option may be given more than once.

'-s'
'--synclines'
     Generate synchronization lines, for use by the C preprocessor or
     other similar tools.  Order is significant with respect to file
     names.  This option 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
     "FILE"', which are inserted as needed into the middle of the
     output.  Such directives mean that the following line originated or
     was expanded from the contents of input file FILE at line LINENUM.
     The '"FILE"' part is often omitted when the file name did not
     change from the previous directive.

     Synchronization directives are always given on complete lines by
     themselves.  When a synchronization discrepancy occurs in the
     middle of an output line, the associated synchronization directive
     is delayed until the next newline that does not occur in the middle
     of a quoted string or comment.

          define(`twoline', `1
          2')
          =>#line 2 "stdin"
          =>
          changecom(`/*', `*/')
          =>
          define(`comment', `/*1
          2*/')
          =>#line 5
          =>
          dnl no line
          hello
          =>#line 7
          =>hello
          twoline
          =>1
          =>#line 8
          =>2
          comment
          =>/*1
          =>2*/
          one comment `two
          three'
          =>#line 10
          =>one /*1
          =>2*/ two
          =>three
          goodbye
          =>#line 12
          =>goodbye

'-U NAME'
'--undefine=NAME'
     This deletes any predefined meaning NAME might have.  Obviously,
     only predefined macros can be deleted in this way.  This option may
     be given more than once; undefining a NAME that does not have a
     definition is silently ignored.  Order is significant with respect
     to file names.


File: m4.info,  Node: Limits control,  Next: Frozen state,  Prev: Preprocessor features,  Up: Invoking m4

2.3 Command line options for limits control
===========================================

There are some limits within 'm4' that can be tuned.  For compatibility,
'm4' also accepts some options that control limits in other
implementations, but which are automatically unbounded (limited only by
your hardware and operating system constraints) in GNU 'm4'.

'-g'
'--gnu'
     Enable all the extensions in this implementation.  In this release
     of M4, this option is always on by default; it is currently only
     useful when overriding a prior use of '--traditional'.  However,
     having GNU behavior as default makes it impossible to write a
     strictly POSIX-compliant client that avoids all incompatible GNU M4
     extensions, since such a client would have to use the non-POSIX
     command-line option to force full POSIX behavior.  Thus, a future
     version of M4 will be changed to implicitly use the option
     '--traditional' if the environment variable 'POSIXLY_CORRECT' is
     set.  Projects that intentionally use GNU extensions should
     consider using '--gnu' to state their intentions, so that the
     project will not mysteriously break if the user upgrades to a newer
     M4 and has 'POSIXLY_CORRECT' set in their environment.

'-G'
'--traditional'
     Suppress all the extensions made in this implementation, compared
     to the System V version.  *Note Compatibility::, for a list of
     these.

'-H NUM'
'--hashsize=NUM'
     Make the internal hash table for symbol lookup be NUM entries big.
     For better performance, the number should be prime, but this is not
     checked.  The default is 509 entries.  It should not be necessary
     to increase this value, unless you define an excessive number of
     macros.

'-L NUM'
'--nesting-limit=NUM'
     Artificially limit the nesting of macro calls to NUM levels,
     stopping program execution if this limit is ever exceeded.  When
     not specified, nesting defaults to unlimited on platforms that can
     detect stack overflow, and to 1024 levels otherwise.  A value of
     zero means unlimited; but then heavily nested code could
     potentially cause a stack overflow.

     The precise effect of this option is more correctly associated with
     textual nesting than dynamic recursion.  It has been useful when
     some complex 'm4' input was generated by mechanical means, and also
     in diagnosing recursive algorithms that do not scale well.  Most
     users never need to change this option from its default.

     This option does _not_ have the ability to break endless rescanning
     loops, since these do not necessarily consume much memory or stack
     space.  Through clever usage of rescanning loops, one can request
     complex, time-consuming computations from '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!

'-B NUM'
'-S NUM'
'-T NUM'
     These options are present for compatibility with System V 'm4', but
     do nothing in this implementation.  They may disappear in future
     releases, and issue a warning to that effect.

'-N NUM'
'--diversions=NUM'
     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.  They may disappear in
     future releases, and issue a warning to that effect.


File: m4.info,  Node: Frozen state,  Next: Debugging options,  Prev: Limits control,  Up: Invoking m4

2.4 Command line options for frozen state
=========================================

GNU 'm4' comes with a feature of freezing internal state (*note Frozen
files::).  This can be used to speed up 'm4' execution when reusing a
common initialization script.

'-F FILE'
'--freeze-state=FILE'
     Once execution is finished, write out the frozen state on the
     specified FILE.  It is conventional, but not required, for FILE to
     end in '.m4f'.

'-R FILE'
'--reload-state=FILE'
     Before execution starts, recover the internal state from the
     specified frozen FILE.  The options '-D', '-U', and '-t' take
     effect after state is reloaded, but before the input files are
     read.


File: m4.info,  Node: Debugging options,  Next: Command line files,  Prev: Frozen state,  Up: Invoking m4

2.5 Command line options for debugging
======================================

Finally, there are several options for aiding in debugging 'm4' scripts.

'-d[FLAGS]'
'--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.  If omitted, FLAGS defaults to 'aeq'.

'--debugfile[=FILE]'
'-o FILE'
'--error-output=FILE'
     Redirect 'dumpdef' output, debug messages, and trace output to the
     named FILE.  Warnings, error messages, and 'errprint' output are
     still printed to standard error.  If these options are not used, or
     if FILE is unspecified (only possible for '--debugfile'), debug
     output goes to standard error; if FILE is the empty string, debug
     output is discarded.  *Note Debug Output::, for more details.  The
     option '--debugfile' may be given more than once, and order is
     significant with respect to file names.  The spellings '-o' and
     '--error-output' are misleading and inconsistent with other GNU
     tools; for now they are silently accepted as synonyms of
     '--debugfile' and only recognized once, but in a future version of
     M4, using them will cause a warning to be issued.

'-l NUM'
'--arglength=NUM'
     Restrict the size of the output generated by macro tracing to NUM
     characters per trace line.  If unspecified or zero, output is
     unlimited.  *Note Debug Levels::, for more details.

'-t NAME'
'--trace=NAME'
     This enables tracing for the macro NAME, at any point where it is
     defined.  NAME need not be defined when this option is given.  This
     option may be given more than once, and order is significant with
     respect to file names.  *Note Trace::, for more details.


File: m4.info,  Node: Command line files,  Prev: Debugging options,  Up: Invoking m4

2.6 Specifying input files on the command line
==============================================

The remaining arguments on the command line are taken to be input file
names.  If no names are present, standard input is read.  A file name of
'-' is taken to mean standard input.  It is conventional, but not
required, for input files to end in '.m4'.

   The input files are read in the sequence given.  Standard input can
be read more than once, so the file name '-' may appear multiple times
on the command line; this makes a difference when input is from a
terminal or other special file type.  It is an error if an input file
ends in the middle of argument collection, a comment, or a quoted
string.

   The options '--define' ('-D'), '--undefine' ('-U'), '--synclines'
('-s'), and '--trace' ('-t') only take effect after processing input
from any file names that occur earlier on the command line.  For
example, assume the file 'foo' contains:

     $ cat foo
     bar

   The text 'bar' can then be redefined over multiple uses of 'foo':

     $ m4 -Dbar=hello foo -Dbar=world foo
     =>hello
     =>world

   If none of the input files invoked 'm4exit' (*note M4exit::), the
exit status of 'm4' will be 0 for success, 1 for general failure (such
as problems with reading an input file), and 63 for version mismatch
(*note Using frozen files::).

   If you need to read a file whose name starts with a '-', you can
specify it as './-file', or use '--' to mark the end of options.


File: m4.info,  Node: Syntax,  Next: Macros,  Prev: Invoking m4,  Up: Top

3 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.  GNU 'm4' does not yet understand multibyte locales; all
operations are byte-oriented rather than character-oriented (although if
your locale uses a single byte encoding, such as ISO-8859-1, you will
not notice a difference).  However, 'm4' is eight-bit clean, so you can
use non-ASCII characters in quoted strings (*note Changequote::),
comments (*note Changecom::), and macro names (*note Indir::), with the
exception of the NUL character (the zero byte ''\0'').

* Menu:

* Names::                       Macro names
* Quoted strings::              Quoting input to 'm4'
* Comments::                    Comments in 'm4' input
* Other tokens::                Other kinds of input tokens
* Input processing::            How 'm4' copies input to output


File: m4.info,  Node: Names,  Next: Quoted strings,  Up: Syntax

3.1 Macro names
===============

A name is any sequence of letters, digits, and the character '_'
(underscore), where the first character is not a digit.  'm4' will use
the longest such sequence found in the input.  If a name has a macro
definition, it will be subject to macro expansion (*note Macros::).
Names are case-sensitive.

   Examples of legal names are: 'foo', '_tmp', and 'name01'.


File: m4.info,  Node: Quoted strings,  Next: Comments,  Prev: Names,  Up: Syntax

3.2 Quoting input to 'm4'
=========================

A quoted string is a sequence of characters surrounded by quote strings,
defaulting to '`' and ''', where the nested begin and end quotes within
the string are balanced.  The value of a string token is the text, with
one level of quotes stripped off.  Thus

     `'
     =>

is the empty string, and double-quoting turns into single-quoting.

     ``quoted''
     =>`quoted'

   The quote characters can be changed at any time, using the builtin
macro 'changequote'.  *Note Changequote::, for more information.


File: m4.info,  Node: Comments,  Next: Other tokens,  Prev: Quoted strings,  Up: Syntax

3.3 Comments in 'm4' input
==========================

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 string can be
inhibited by quoting it.

     $ m4
     `quoted text' # `commented text'
     =>quoted text # `commented text'
     `quoting inhibits' `#' `comments'
     =>quoting inhibits # comments

   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: Other tokens,  Next: Input processing,  Prev: Comments,  Up: Syntax

3.4 Other kinds of input tokens
===============================

Any character, that is neither a part of a name, nor of a quoted string,
nor a comment, is a token by itself.  When not in the context of macro
expansion, all of these tokens are just copied to output.  However,
during macro expansion, whitespace characters (space, tab, newline,
formfeed, carriage return, vertical tab), parentheses ('(' and ')'),
comma (','), and dollar ('$') have additional roles, explained later.


File: m4.info,  Node: Input processing,  Prev: Other tokens,  Up: Syntax

3.5 How 'm4' copies input to output
===================================

As 'm4' reads the input token by token, it will copy each token directly
to the output immediately.

   The exception is when it finds a word with a macro definition.  In
that case 'm4' will calculate the macro's expansion, possibly reading
more input to get the arguments.  It then inserts the expansion in front
of the remaining input.  In other words, the resulting text from a macro
call will be read and parsed into tokens again.

   'm4' expands a macro as soon as possible.  If it finds a macro call
when collecting the arguments to another, it will expand the second call
first.  This process continues until there are no more macro calls to
expand and all the input has been consumed.

   For a running example, examine how 'm4' handles this input:

     format(`Result is %d', eval(`2**15'))

First, 'm4' sees that the token 'format' is a macro name, so it collects
the tokens '(', '`Result is %d'', ',', and ' ', before encountering
another potential macro.  Sure enough, 'eval' is a macro name, so the
nested argument collection picks up '(', '`2**15'', and ')', invoking
the eval macro with the lone argument of '2**15'.  The expansion of
'eval(2**15)' is '32768', which is then rescanned as the five tokens
'3', '2', '7', '6', and '8'; and combined with the next ')', the format
macro now has all its arguments, as if the user had typed:

     format(`Result is %d', 32768)

The format macro expands to 'Result is 32768', and we have another round
of scanning for the tokens 'Result', ' ', 'is', ' ', '3', '2', '7', '6',
and '8'.  None of these are macros, so the final output is

     =>Result is 32768

   As a more complicated example, we will contrast an actual code
example from the Gnulib project(1), showing both a buggy approach and
the desired results.  The user desires to output a shell assignment
statement that takes its argument and turns it into a shell variable by
converting it to uppercase and prepending a prefix.  The original
attempt looks like this:

     changequote([,])dnl
     define([gl_STRING_MODULE_INDICATOR],
       [
         dnl comment
         GNULIB_]translit([$1],[a-z],[A-Z])[=1
       ])dnl
       gl_STRING_MODULE_INDICATOR([strcase])
     =>  
     =>        GNULIB_strcase=1
     =>  

   Oops - the argument did not get capitalized.  And although the manual
is not able to easily show it, both lines that appear empty actually
contain two trailing spaces.  By stepping through the parse, it is easy
to see what happened.  First, 'm4' sees the token 'changequote', which
it recognizes as a macro, followed by '(', '[', ',', ']', and ')' to
form the argument list.  The macro expands to the empty string, but
changes the quoting characters to something more useful for generating
shell code (unbalanced '`' and ''' appear all the time in shell scripts,
but unbalanced '[]' tend to be rare).  Also in the first line, 'm4' sees
the token 'dnl', which it recognizes as a builtin macro that consumes
the rest of the line, resulting in no output for that line.

   The second line starts a macro definition.  'm4' sees the token
'define', which it recognizes as a macro, followed by a '(',
'[gl_STRING_MODULE_INDICATOR]', and ','.  Because an unquoted comma was
encountered, the first argument is known to be the expansion of the
single-quoted string token, or 'gl_STRING_MODULE_INDICATOR'.  Next, 'm4'
sees '<NL>', ' ', and ' ', but this whitespace is discarded as part of
argument collection.  Then comes a rather lengthy single-quoted string
token, '[<NL>    dnl comment<NL>    GNULIB_]'.  This is followed by the
token 'translit', which 'm4' recognizes as a macro name, so a nested
macro expansion has started.

   The arguments to the 'translit' are found by the tokens '(', '[$1]',
',', '[a-z]', ',', '[A-Z]', and finally ')'.  All three string arguments
are expanded (or in other words, the quotes are stripped), and since
neither '$' nor '1' need capitalization, the result of the macro is
'$1'.  This expansion is rescanned, resulting in the two literal
characters '$' and '1'.

   Scanning of the outer macro resumes, and picks up with '[=1<NL>  ]',
and finally ')'.  The collected pieces of expanded text are
concatenated, with the end result that the macro
'gl_STRING_MODULE_INDICATOR' is now defined to be the sequence
'<NL>    dnl comment<NL>    GNULIB_$1=1<NL>  '.  Once again, 'dnl' is
recognized and avoids a newline in the output.

   The final line is then parsed, beginning with ' ' and ' ' that are
output literally.  Then 'gl_STRING_MODULE_INDICATOR' is recognized as a
macro name, with an argument list of '(', '[strcase]', and ')'.  Since
the definition of the macro contains the sequence '$1', that sequence is
replaced with the argument 'strcase' prior to starting the rescan.  The
rescan sees '<NL>' and four spaces, which are output literally, then
'dnl', which discards the text ' comment<NL>'.  Next comes four more
spaces, also output literally, and the token 'GNULIB_strcase', which
resulted from the earlier parameter substitution.  Since that is not a
macro name, it is output literally, followed by the literal tokens '=',
'1', '<NL>', and two more spaces.  Finally, the original '<NL>' seen
after the macro invocation is scanned and output literally.

   Now for a corrected approach.  This rearranges the use of newlines
and whitespace so that less whitespace is output (which, although
harmless to shell scripts, can be visually unappealing), and fixes the
quoting issues so that the capitalization occurs when the macro
'gl_STRING_MODULE_INDICATOR' is invoked, rather then when it is defined.
It also adds another layer of quoting to the first argument of
'translit', to ensure that the output will be rescanned as a string
rather than a potential uppercase macro name needing further expansion.

     changequote([,])dnl
     define([gl_STRING_MODULE_INDICATOR],
       [dnl comment
       GNULIB_[]translit([[$1]], [a-z], [A-Z])=1dnl
     ])dnl
       gl_STRING_MODULE_INDICATOR([strcase])
     =>    GNULIB_STRCASE=1

   The parsing of the first line is unchanged.  The second line sees the
name of the macro to define, then sees the discarded '<NL>' and two
spaces, as before.  But this time, the next token is '[dnl
comment<NL>  GNULIB_[]translit([[$1]], [a-z], [A-Z])=1dnl<NL>]', which
includes nested quotes, followed by ')' to end the macro definition and
'dnl' to skip the newline.  No early expansion of 'translit' occurs, so
the entire string becomes the definition of the macro.

   The final line is then parsed, beginning with two spaces that are
output literally, and an invocation of 'gl_STRING_MODULE_INDICATOR' with
the argument 'strcase'.  Again, the '$1' in the macro definition is
substituted prior to rescanning.  Rescanning first encounters 'dnl', and
discards ' comment<NL>'.  Then two spaces are output literally.  Next
comes the token 'GNULIB_', but that is not a macro, so it is output
literally.  The token '[]' is an empty string, so it does not affect
output.  Then the token 'translit' is encountered.

   This time, the arguments to 'translit' are parsed as '(',
'[[strcase]]', ',', ' ', '[a-z]', ',', ' ', '[A-Z]', and ')'.  The two
spaces are discarded, and the translit results in the desired result
'[STRCASE]'.  This is rescanned, but since it is a string, the quotes
are stripped and the only output is a literal 'STRCASE'.  Then the
scanner sees '=' and '1', which are output literally, followed by 'dnl'
which discards the rest of the definition of
'gl_STRING_MODULE_INDICATOR'.  The newline at the end of output is the
literal '<NL>' that appeared after the invocation of the macro.

   The order in which 'm4' expands the macros can be further explored
using the trace facilities of GNU 'm4' (*note Trace::).

   ---------- Footnotes ----------

   (1) Derived from a patch in
<http://lists.gnu.org/archive/html/bug-gnulib/2007-01/msg00389.html>,
and a followup patch in
<http://lists.gnu.org/archive/html/bug-gnulib/2007-02/msg00000.html>


File: m4.info,  Node: Macros,  Next: Definitions,  Prev: Syntax,  Up: Top

4 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,  Up: Macros

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

4.2 Preventing macro invocation
===============================

An innovation of the 'm4' language, compared to some of its predecessors
(like Strachey'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.  As a GNU extension, 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 with parameters" refers to this
specific provision of GNU M4, also known as a blind builtin macro.  For
the builtins defined by POSIX that bear this disclaimer, POSIX
specifically states that invoking those builtins without arguments is
unspecified, because many other implementations simply invoke the
builtin as though it were given one empty argument instead.

     $ m4
     eval
     =>eval
     eval(`1')
     =>1

   There is also a command line option ('--prefix-builtins', or '-P',
*note Invoking m4: Operation modes.) that renames all builtin macros
with a prefix of 'm4_' at startup.  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'.  It also has no effect on whether a macro
requires parameters.

     $ m4 -P
     eval
     =>eval
     eval(`1')
     =>eval(1)
     m4_eval
     =>m4_eval
     m4_eval(`1')
     =>1

   Another alternative is to redefine problematic macros to a name less
likely to cause conflicts, using *note Definitions::.

   If your version of GNU 'm4' has the 'changeword' feature compiled in,
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 from being interpreted
as a call to an existing macro is to quote it.  The remainder of this
section studies a little more deeply how quoting affects macro
invocation, and how quoting can be used to inhibit macro invocation.

   Even if quoting is usually done over the whole macro name, it can
also be done over only a few characters of this name (provided, of
course, that the unquoted portions are not also a macro).  It is also
possible to quote the empty string, but this works only _inside_ the
name.  For example:

     `divert'
     =>divert
     `d'ivert
     =>divert
     di`ver't
     =>divert
     div`'ert
     =>divert

all yield the string 'divert'.  While in both:

     `'divert
     =>
     divert`'
     =>

the 'divert' builtin macro will be called, which expands to the empty
string.

   The output of macro evaluations is always rescanned.  In the
following example, the input 'x`'y' yields the string 'bCD', exactly as
if 'm4' has been given 'substr(ab`'cde, `1', `3')' as input:

     define(`cde', `CDE')
     =>
     define(`x', `substr(ab')
     =>
     define(`y', `cde, `1', `3')')
     =>
     x`'y
     =>bCD

   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 second 'macro' to be recognized as such:

     define(`macro', `m')
     =>
     macro(`m')macro
     =>mmacro
     macro(`m')`'macro
     =>mm

   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'
     =>divert
     macro(`v')ert
     =>

the input will produce the string 'divert'.  When the quotes were
removed, the 'divert' builtin was called instead.


File: m4.info,  Node: Macro Arguments,  Next: Quoting Arguments,  Prev: Inhibiting Invocation,  Up: Macros

4.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.
However, some builtins are documented to behave differently for a
missing optional argument than for an explicit empty string.  If there
are too many arguments, the excess arguments are ignored.  Unquoted
leading whitespace is stripped off all arguments, but whitespace
generated by a macro expansion or occurring after a macro that expanded
to an empty string remains intact.  Whitespace includes space, tab,
newline, carriage return, vertical tab, and formfeed.

     define(`macro', `$1')
     =>
     macro( unquoted leading space lost)
     =>unquoted leading space lost
     macro(` quoted leading space kept')
     => quoted leading space kept
     macro(
      divert `unquoted space kept after expansion')
     => unquoted space kept after expansion
     macro(macro(`
     ')`whitespace from expansion kept')
     =>
     =>whitespace from expansion kept
     macro(`unquoted trailing whitespace kept'
     )
     =>unquoted trailing whitespace kept
     =>

   Normally 'm4' will issue warnings if a builtin macro is called with
an inappropriate number of arguments, but it can be suppressed with the
'--quiet' command line option (or '--silent', or '-Q', *note Invoking
m4: Operation modes.).  For user defined macros, there is no check of
the number of arguments given.

     $ m4
     index(`abc')
     error->m4:stdin:1: Warning: too few arguments to builtin `index'
     =>0
     index(`abc',)
     =>0
     index(`abc', `b', `ignored')
     error->m4:stdin:3: Warning: excess arguments to builtin `index' ignored
     =>1

     $ m4 -Q
     index(`abc')
     =>0
     index(`abc',)
     =>0
     index(`abc', `b', `ignored')
     =>1

   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
unquoted leading whitespace is never part of an argument, but trailing
whitespace always is.

   It is possible for a macro's definition to change during argument
collection, in which case the expansion uses the definition that was in
effect at the time the opening '(' was seen.

     define(`f', `1')
     =>
     f(define(`f', `2'))
     =>1
     f
     =>2

   It is an error if the end of file occurs while collecting arguments.

     hello world
     =>hello world
     define(
     ^D
     error->m4:stdin:2: ERROR: end of file in argument list


File: m4.info,  Node: Quoting Arguments,  Next: Macro expansion,  Prev: Macro Arguments,  Up: Macros

4.4 On Quoting Arguments to macros
==================================

Each argument has unquoted leading 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 '() (() ('.  Commas
separate arguments, except when they occur inside quotes, comments, or
unquoted parentheses.  *Note Pseudo Arguments::, for examples.

   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 (because nested expansion
must occur to create the arguments for the outer macro) or convenient
(because it uses fewer characters) 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 to follow a consistent quoting style.
For consistency, this manual follows the rule of thumb that each layer
of parentheses introduces another layer of single quoting, except when
showing the consequences of quoting rules.  This is done even when the
quoted string cannot be a macro, such as with integers when you have not
changed the syntax via 'changeword' (*note Changeword::).

   The quoting rule of thumb of one level of quoting per parentheses has
a nice property: when a macro name appears inside parentheses, you can
determine when it will be expanded.  If it is not quoted, it will be
expanded prior to the outer macro, so that its expansion becomes the
argument.  If it is single-quoted, it will be expanded after the outer
macro.  And if it is double-quoted, it will be used as literal text
instead of a macro name.

     define(`active', `ACT, IVE')
     =>
     define(`show', `$1 $1')
     =>
     show(active)
     =>ACT ACT
     show(`active')
     =>ACT, IVE ACT, IVE
     show(``active'')
     =>active active


File: m4.info,  Node: Macro expansion,  Prev: Quoting Arguments,  Up: Macros

4.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', the input

     $ m4 -Dbar=Hello -Dfoo=bar
     foo
     =>Hello

will expand first to 'bar', and when this is reread and expanded, into
'Hello'.


File: m4.info,  Node: Definitions,  Next: Conditionals,  Prev: Macros,  Up: Top

5 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, and bring back the original value at a later time.

* Menu:

* Define::                      Defining a new macro
* Arguments::                   Arguments to macros
* Pseudo Arguments::            Special 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,  Up: Definitions

5.1 Defining a macro
====================

The normal way to define or redefine macros is to use the builtin
'define':

 -- Builtin: define (NAME, [EXPANSION]
     Defines NAME to expand to EXPANSION.  If EXPANSION is not given, it
     is taken to be empty.

     The expansion of 'define' is void.  The macro 'define' is
     recognized only with parameters.

   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 first argument to 'define' should be quoted; otherwise, if the
macro is already defined, you will be defining a different macro.  This
example shows the problems with underquoting, since we did not want to
redefine 'one':

     define(foo, one)
     =>
     define(foo, two)
     =>
     one
     =>two

   GNU 'm4' normally replaces only the _topmost_ definition of a macro
if it has several definitions from 'pushdef' (*note Pushdef::).  Some
other implementations of 'm4' replace all definitions of a macro with
'define'.  *Note Incompatibilities::, for more details.

   As a GNU extension, the first argument to 'define' does not have to
be a simple word.  It can be any text string, even the empty string.  A
macro with a non-standard name cannot be invoked in the normal way, as
the name is not recognized.  It can only be referenced by the builtins
'indir' (*note Indir::) and 'defn' (*note Defn::).

   Arrays and associative arrays can be simulated by using non-standard
macro names.

 -- Composite: array (INDEX)
 -- Composite: array_set (INDEX, [VALUE]
     Provide access to entries within an array.  'array' reads the entry
     at location INDEX, and 'array_set' assigns VALUE to location INDEX.

     define(`array', `defn(format(``array[%d]'', `$1'))')
     =>
     define(`array_set', `define(format(``array[%d]'', `$1'), `$2')')
     =>
     array_set(`4', `array element no. 4')
     =>
     array_set(`17', `array element no. 17')
     =>
     array(`4')
     =>array element no. 4
     array(eval(`10 + 7'))
     =>array element no. 17

   Change the '%d' to '%s' and it is an associative array.


File: m4.info,  Node: Arguments,  Next: Pseudo Arguments,  Prev: Define,  Up: Definitions

5.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.  Replacement of arguments happens before rescanning,
regardless of how many nesting levels of quoting appear in the
expansion.  Here is an example of a macro with two arguments.

 -- Composite: exch (ARG1, ARG2)
     Expands to ARG2 followed by ARG1, effectively exchanging their
     order.

     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.
(You should try and improve this example so that clients of 'exch' do
not have to double quote; or *note Answers: Improved exch.).

   As a special case, the zeroth 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.

   GNU 'm4' allows the number following the '$' to consist of one or
more digits, allowing macros to have any number of arguments.  The
extension of accepting multiple digits is incompatible with POSIX, and
is different than traditional implementations of 'm4', which only
recognize one digit.  Therefore, future versions of GNU M4 will phase
out this feature.  To portably access beyond the ninth argument, you can
use the 'argn' macro documented later (*note Shift::).

   POSIX also states that '$' followed immediately by '{' in a macro
definition is implementation-defined.  This version of M4 passes the
literal characters '${' through unchanged, but M4 2.0 will implement an
optional feature similar to 'sh', where '${11}' expands to the eleventh
argument, to replace the current recognition of '$11'.  Meanwhile, if
you want to guarantee that you will get a literal '${' in output when
expanding a macro, even when you upgrade to M4 2.0, you can use nested
quoting to your advantage:

     define(`foo', `single quoted $`'{1} output')
     =>
     define(`bar', ``double quoted $'`{2} output'')
     =>
     foo(`a', `b')
     =>single quoted ${1} output
     bar(`a', `b')
     =>double quoted ${2} output

   To help you detect places in your M4 input files that might change in
behavior due to the changed behavior of M4 2.0, you can use the
'--warn-macro-sequence' command-line option (*note Invoking m4:
Operation modes.) with the default regular expression.  This will add a
warning any time a macro definition includes '$' followed by multiple
digits, or by '{'.  The warning is not enabled by default, because it
triggers a number of warnings in Autoconf 2.61 (and Autoconf uses '-E'
to treat warnings as errors), and because it will still be possible to
restore older behavior in M4 2.0.

     $ m4 --warn-macro-sequence
     define(`foo', `$001 ${1} $1')
     error->m4:stdin:1: Warning: definition of `foo' contains sequence `$001'
     error->m4:stdin:1: Warning: definition of `foo' contains sequence `${1}'
     =>
     foo(`bar')
     =>bar ${1} bar


File: m4.info,  Node: Pseudo Arguments,  Next: Undefine,  Prev: Arguments,  Up: Definitions

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

 -- Composite: nargs (...)
     Expands to a count of the number of arguments supplied.

     define(`nargs', `$#')
     =>
     nargs
     =>0
     nargs()
     =>1
     nargs(`arg1', `arg2', `arg3')
     =>3
     nargs(`commas can be quoted, like this')
     =>1
     nargs(arg1#inside comments, commas do not separate arguments
     still arg1)
     =>1
     nargs((unquoted parentheses, like this, group arguments))
     =>1

   Remember that '#' defaults to the comment character; if you forget
quotes to inhibit the comment behavior, your macro definition may not
end where you expected.

     dnl Attempt to define a macro to just `$#'
     define(underquoted, $#)
     oops)
     =>
     underquoted
     =>0)
     =>oops

   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..
     echo1(`foo')
     =>This is macro foo.
     echo2(foo)
     =>This is macro foo.
     echo2(`foo')
     =>foo

*Note Trace::, if you do not understand this.  As another example of the
difference, remember that comments encountered in arguments are passed
untouched to the macro, and that quoting disables comments.

     define(`echo1', `$*')
     =>
     define(`echo2', `$@')
     =>
     define(`foo', `bar')
     =>
     echo1(#foo'foo
     foo)
     =>#foo'foo
     =>bar
     echo2(#foo'foo
     foo)
     =>#foobar
     =>bar'

   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', the judicious
use of nested quoting can put a safe character between the '$' and the
next character, relying on the rescanning to remove the nested quote.
This will prevent 'm4' from interpreting the '$' sign as a reference to
an argument.

     define(`foo', `no nested quote: $1')
     =>
     foo(`arg')
     =>no nested quote: arg
     define(`foo', `nested quote around $: `$'1')
     =>
     foo(`arg')
     =>nested quote around $: $1
     define(`foo', `nested empty quote after $: $`'1')
     =>
     foo(`arg')
     =>nested empty quote after $: $1
     define(`foo', `nested quote around next character: $`1'')
     =>
     foo(`arg')
     =>nested quote around next character: $1
     define(`foo', `nested quote around both: `$1'')
     =>
     foo(`arg')
     =>nested quote around both: arg


File: m4.info,  Node: Undefine,  Next: Defn,  Prev: Pseudo Arguments,  Up: Definitions

5.4 Deleting a macro
====================

A macro definition can be removed with 'undefine':

 -- Builtin: undefine (NAME...)
     For each argument, remove the macro NAME.  The macro names must
     necessarily be quoted, since they will be expanded otherwise.

     The expansion of 'undefine' is void.  The macro 'undefine' is
     recognized only with parameters.

     foo bar blah
     =>foo bar blah
     define(`foo', `some')define(`bar', `other')define(`blah', `text')
     =>
     foo bar blah
     =>some other text
     undefine(`foo')
     =>
     foo bar blah
     =>foo other text
     undefine(`bar', `blah')
     =>
     foo bar blah
     =>foo bar blah

   Undefining a macro inside that macro's expansion is safe; the macro
still expands to the definition that was in effect at the '('.

     define(`f', ``$0':$1')
     =>
     f(f(f(undefine(`f')`hello world')))
     =>f:f:f:hello world
     f(`bye')
     =>f(bye)

   It is not an error for NAME to have no macro definition.  In that
case, 'undefine' does nothing.


File: m4.info,  Node: Defn,  Next: Pushdef,  Prev: Undefine,  Up: Definitions

5.5 Renaming macros
===================

It is possible to rename an already defined macro.  To do this, you need
the builtin 'defn':

 -- Builtin: defn (NAME...)
     Expands to the _quoted definition_ of each NAME.  If an argument is
     not a defined macro, the expansion for that argument is empty.

     If NAME is a user-defined macro, the quoted definition is simply
     the quoted expansion text.  If, instead, there is only one NAME and
     it 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 silently
     converted to an empty string in most other contexts.  Combining a
     builtin with anything else is not supported; a warning is issued
     and the builtin is omitted from the final expansion.

     The macro 'defn' is recognized only with parameters.

   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 fact that macro definitions can be transferred also explains why
you should use '$0', rather than retyping a macro's name in its
definition:

     define(`foo', `This is `$0'')
     =>
     define(`bar', defn(`foo'))
     =>
     bar
     =>This is bar

   Macros used as string variables should be referred through 'defn', to
avoid unwanted expansion of the text:

     define(`string', `The macro dnl is very useful
     ')
     =>
     string
     =>The macro 
     defn(`string')
     =>The macro dnl is very useful
     =>

   However, it is important to remember that 'm4' rescanning is purely
textual.  If an unbalanced end-quote string occurs in a macro
definition, the rescan will see that embedded quote as the termination
of the quoted string, and the remainder of the macro's definition will
be rescanned unquoted.  Thus it is a good idea to avoid unbalanced
end-quotes in macro definitions or arguments to macros.

     define(`foo', a'a)
     =>
     define(`a', `A')
     =>
     define(`echo', `$@')
     =>
     foo
     =>A'A
     defn(`foo')
     =>aA'
     echo(foo)
     =>AA'

   On the other hand, it is possible to exploit the fact that 'defn' can
concatenate multiple macros prior to the rescanning phase, in order to
join the definitions of macros that, in isolation, have unbalanced
quotes.  This is particularly useful when one has used several macros to
accumulate text that M4 should rescan as a whole.  In the example below,
note how the use of 'defn' on 'l' in isolation opens a string, which is
not closed until the next line; but used on 'l' and 'r' together results
in nested quoting.

     define(`l', `<[>')define(`r', `<]>')
     =>
     changequote(`[', `]')
     =>
     defn([l])defn([r])
     ])
     =><[>]defn([r])
     =>)
     defn([l], [r])
     =><[>][<]>

   Using 'defn' to generate special tokens for builtin macros outside of
expected contexts can sometimes trigger warnings.  But most of the time,
such tokens are silently converted to the empty string.

     $ m4 -d
     defn(`defn')
     =>
     define(defn(`divnum'), `cannot redefine a builtin token')
     error->m4:stdin:2: Warning: define: invalid macro name ignored
     =>
     divnum
     =>0
     len(defn(`divnum'))
     =>0

   Also note that 'defn' with multiple arguments can only join text
macros, not builtins, although a future version of GNU M4 may lift this
restriction.

     $ m4 -d
     define(`a', `A')define(`AA', `b')
     =>
     traceon(`defn', `define')
     =>
     defn(`a', `divnum', `a')
     error->m4:stdin:3: Warning: cannot concatenate builtin `divnum'
     error->m4trace: -1- defn(`a', `divnum', `a') -> ``A'`A''
     =>AA
     define(`mydivnum', defn(`divnum', `divnum'))mydivnum
     error->m4:stdin:4: Warning: cannot concatenate builtin `divnum'
     error->m4:stdin:4: Warning: cannot concatenate builtin `divnum'
     error->m4trace: -2- defn(`divnum', `divnum')
     error->m4trace: -1- define(`mydivnum', `')
     =>
     traceoff(`defn', `define')
     =>


File: m4.info,  Node: Pushdef,  Next: Indir,  Prev: Defn,  Up: Definitions

5.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':

 -- Builtin: pushdef (NAME, [EXPANSION]
 -- Builtin: popdef (NAME...)
     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'.

     The expansion of both 'pushdef' and 'popdef' is void.  The macros
     'pushdef' and 'popdef' are recognized only with parameters.

     define(`foo', `Expansion one.')
     =>
     foo
     =>Expansion one.
     pushdef(`foo', `Expansion two.')
     =>
     foo
     =>Expansion two.
     pushdef(`foo', `Expansion three.')
     =>
     pushdef(`foo', `Expansion four.')
     =>
     popdef(`foo')
     =>
     foo
     =>Expansion three.
     popdef(`foo', `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.  However, POSIX allows other implementations that treat
'define' as replacing an entire stack of definitions with a single new
definition, so to be portable to other implementations, it may be worth
explicitly using 'popdef' and 'pushdef' rather than relying on the GNU
behavior of 'define'.

     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

   Local variables within macros are made with 'pushdef' and 'popdef'.
At the start of the macro a new definition is pushed, within the macro
it is manipulated and at the end it is popped, revealing the former
definition.

   It is possible to temporarily redefine a builtin with 'pushdef' and
'defn'.


File: m4.info,  Node: Indir,  Next: Builtin,  Prev: Pushdef,  Up: Definitions

5.7 Indirect call of macros
===========================

Any macro can be called indirectly with 'indir':

 -- Builtin: indir (NAME, [ARGS...]
     Results in a call to the macro NAME, which is passed the rest of
     the arguments ARGS.  If NAME is not defined, an error message is
     printed, and the expansion is void.

     The macro 'indir' is recognized only with parameters.

   This can be used to call macros with computed or "invalid" 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'.

   One other point to observe is that argument collection occurs before
'indir' invokes NAME, so if argument collection changes the value of
NAME, that will be reflected in the final expansion.  This is different
than the behavior when invoking macros directly, where the definition
that was in effect before argument collection is used.

     $ m4 -d
     define(`f', `1')
     =>
     f(define(`f', `2'))
     =>1
     indir(`f', define(`f', `3'))
     =>3
     indir(`f', undefine(`f'))
     error->m4:stdin:4: undefined macro `f'
     =>

   When handed the result of 'defn' (*note Defn::) as one of its
arguments, 'indir' defers to the invoked NAME for whether a token
representing a builtin is recognized or flattened to the empty string.

     $ m4 -d
     indir(defn(`defn'), `divnum')
     error->m4:stdin:1: Warning: indir: invalid macro name ignored
     =>
     indir(`define', defn(`defn'), `divnum')
     error->m4:stdin:2: Warning: define: invalid macro name ignored
     =>
     indir(`define', `foo', defn(`divnum'))
     =>
     foo
     =>0
     indir(`divert', defn(`foo'))
     error->m4:stdin:5: empty string treated as 0 in builtin `divert'
     =>


File: m4.info,  Node: Builtin,  Prev: Indir,  Up: Definitions

5.8 Indirect call of builtins
=============================

Builtin macros can be called indirectly with 'builtin':

 -- Builtin: builtin (NAME, [ARGS...]
     Results in a call to the builtin NAME, which is passed the rest of
     the arguments ARGS.  If NAME does not name a builtin, an error
     message is printed, and the expansion is void.

     The macro 'builtin' is recognized only with parameters.

   This can be used even if NAME has been given another definition that
has covered the original, or been undefined so that no macro maps to the
builtin.

     pushdef(`define', `hidden')
     =>
     undefine(`undefine')
     =>
     define(`foo', `bar')
     =>hidden
     foo
     =>foo
     builtin(`define', `foo', defn(`divnum'))
     =>
     foo
     =>0
     builtin(`define', `foo', `BAR')
     =>
     foo
     =>BAR
     undefine(`foo')
     =>undefine(foo)
     foo
     =>BAR
     builtin(`undefine', `foo')
     =>
     foo
     =>foo

   The NAME argument only matches the original name of the builtin, even
when the '--prefix-builtins' option (or '-P', *note Invoking m4:
Operation modes.) is in effect.  This is different from 'indir', which
only tracks current macro names.

     $ m4 -P
     m4_builtin(`divnum')
     =>0
     m4_builtin(`m4_divnum')
     error->m4:stdin:2: undefined builtin `m4_divnum'
     =>
     m4_indir(`divnum')
     error->m4:stdin:3: undefined macro `divnum'
     =>
     m4_indir(`m4_divnum')
     =>0

   Note that 'indir' and 'builtin' can be used to invoke builtins
without arguments, even when they normally require parameters to be
recognized; but it will provoke a warning, and result in a void
expansion.

     builtin
     =>builtin
     builtin()
     error->m4:stdin:2: undefined builtin `'
     =>
     builtin(`builtin')
     error->m4:stdin:3: Warning: too few arguments to builtin `builtin'
     =>
     builtin(`builtin',)
     error->m4:stdin:4: undefined builtin `'
     =>
     builtin(`builtin', ``'
     ')
     error->m4:stdin:5: undefined builtin ``'
     error->'
     =>
     indir(`index')
     error->m4:stdin:7: Warning: too few arguments to builtin `index'
     =>


File: m4.info,  Node: Conditionals,  Next: Debugging,  Prev: Definitions,  Up: Top

6 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.  For that, we need some kind of
conditionals.  Also, we would like to have some kind of loop construct,
so we could do something a number of times, or while some condition is
true.

* Menu:

* Ifdef::                       Testing if a macro is defined
* Ifelse::                      If-else construct, or multibranch
* Shift::                       Recursion in 'm4'
* Forloop::                     Iteration by counting
* Foreach::                     Iteration by list contents
* Stacks::                      Working with definition stacks
* Composition::                 Building macros with macros


File: m4.info,  Node: Ifdef,  Next: Ifelse,  Up: Conditionals

6.1 Testing if a macro is defined
=================================

There are two different builtin conditionals in 'm4'.  The first is
'ifdef':

 -- Builtin: ifdef (NAME, STRING-1, [STRING-2]
     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).

     The macro 'ifdef' is recognized only with parameters.

     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
     ifdef(`no_such_macro', `yes', `no', `extra argument')
     error->m4:stdin:4: Warning: excess arguments to builtin `ifdef' ignored
     =>no


File: m4.info,  Node: Ifelse,  Next: Shift,  Prev: Ifdef,  Up: Conditionals

6.2 If-else construct, or multibranch
=====================================

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:

 -- Builtin: ifelse (COMMENT)
 -- Builtin: ifelse (STRING-1, STRING-2, EQUAL, [NOT-EQUAL]
 -- Builtin: ifelse (STRING-1, STRING-2, EQUAL-1, STRING-3, STRING-4,
          EQUAL-2, ..., [NOT-EQUAL]
     Used with only one argument, the 'ifelse' simply discards it and
     produces no output.

     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.  A final fifth
     argument is ignored, after triggering a warning.

     If called with six or more arguments, and STRING-1 and STRING-2 are
     equal, 'ifelse' expands into EQUAL-1, otherwise the first three
     arguments are discarded and the processing starts again.

     The macro 'ifelse' is recognized only with parameters.

   Using only one argument 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.

     ifelse(`some comments')
     =>
     ifelse(`foo', `bar')
     error->m4:stdin:2: Warning: too few arguments to builtin `ifelse'
     =>

   Using three or four arguments provides decision points.

     ifelse(`foo', `bar', `true')
     =>
     ifelse(`foo', `foo', `true')
     =>true
     define(`foo', `bar')
     =>
     ifelse(foo, `bar', `true', `false')
     =>true
     ifelse(foo, `foo', `true', `false')
     =>false

   Notice how the first argument was used unquoted; it is common to
compare the expansion of a macro with a string.  With this macro, you
can now reproduce the behavior of blind builtins, where the macro is
recognized only with arguments.

     define(`foo', `ifelse(`$#', `0', ``$0'', `arguments:$#')')
     =>
     foo
     =>foo
     foo()
     =>arguments:1
     foo(`a', `b', `c')
     =>arguments:3

   For an example of a way to make defining blind macros easier, see
*note Composition::.

   The macro '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-1, otherwise the procedure is
repeated with the first three arguments discarded.  This calls for an
example:

     ifelse(`foo', `bar', `third', `gnu', `gnats')
     error->m4:stdin:1: Warning: excess arguments to builtin `ifelse' ignored
     =>gnu
     ifelse(`foo', `bar', `third', `gnu', `gnats', `sixth')
     =>
     ifelse(`foo', `bar', `third', `gnu', `gnats', `sixth', `seventh')
     =>seventh
     ifelse(`foo', `bar', `3', `gnu', `gnats', `6', `7', `8')
     error->m4:stdin:4: Warning: excess arguments to builtin `ifelse' ignored
     =>7

   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.


File: m4.info,  Node: Shift,  Next: Forloop,  Prev: Ifelse,  Up: Conditionals

6.3 Recursion in 'm4'
=====================

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:

 -- Builtin: shift (ARG1, ...)
     Takes any number of arguments, and expands to all its arguments
     except ARG1, separated by commas, with each argument quoted.

     The macro 'shift' is recognized only with parameters.

     shift
     =>shift
     shift(`bar')
     =>
     shift(`foo', `bar', `baz')
     =>bar,baz

   An example of the use of 'shift' is this macro:

 -- Composite: reverse (...)
     Takes any number of arguments, and reverses their order.

   It is implemented as:

     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.  It also shows that
'shift' is usually used with '$@'.  Another example of this is an
implementation of a short-circuiting conditional operator.

 -- Composite: cond (TEST-1, STRING-1, EQUAL-1, [TEST-2]
     Similar to 'ifelse', where an equal comparison between the first
     two strings results in the third, otherwise the first three
     arguments are discarded and the process repeats.  The difference is
     that each TEST-<N> is expanded only when it is encountered.  This
     means that every third argument to 'cond' is normally given one
     more level of quoting than the corresponding argument to 'ifelse'.

   Here is the implementation of 'cond', along with a demonstration of
how it can short-circuit the side effects in 'side'.  Notice how all the
unquoted side effects happen regardless of how many comparisons are made
with 'ifelse', compared with only the relevant effects with 'cond'.

     define(`cond',
     `ifelse(`$#', `1', `$1',
             `ifelse($1, `$2', `$3',
                     `$0(shift(shift(shift($@))))')')')dnl
     define(`side', `define(`counter', incr(counter))$1')dnl
     define(`example1',
     `define(`counter', `0')dnl
     ifelse(side(`$1'), `yes', `one comparison: ',
            side(`$1'), `no', `two comparisons: ',
            side(`$1'), `maybe', `three comparisons: ',
            `side(`default answer: ')')counter')dnl
     define(`example2',
     `define(`counter', `0')dnl
     cond(`side(`$1')', `yes', `one comparison: ',
          `side(`$1')', `no', `two comparisons: ',
          `side(`$1')', `maybe', `three comparisons: ',
          `side(`default answer: ')')counter')dnl
     example1(`yes')
     =>one comparison: 3
     example1(`no')
     =>two comparisons: 3
     example1(`maybe')
     =>three comparisons: 3
     example1(`feeling rather indecisive today')
     =>default answer: 4
     example2(`yes')
     =>one comparison: 1
     example2(`no')
     =>two comparisons: 2
     example2(`maybe')
     =>three comparisons: 3
     example2(`feeling rather indecisive today')
     =>default answer: 4

   Another common task that requires iteration is joining a list of
arguments into a single string.

 -- Composite: join ([SEPARATOR]
 -- Composite: joinall ([SEPARATOR]
     Generate a single-quoted string, consisting of each ARG separated
     by SEPARATOR.  While 'joinall' always outputs a SEPARATOR between
     arguments, 'join' avoids the SEPARATOR for an empty ARG.

   Here are some examples of its usage, based on the implementation
'm4-1.4.17/examples/join.m4' distributed in this package:

     $ m4 -I examples
     include(`join.m4')
     =>
     join,join(`-'),join(`-', `'),join(`-', `', `')
     =>,,,
     joinall,joinall(`-'),joinall(`-', `'),joinall(`-', `', `')
     =>,,,-
     join(`-', `1')
     =>1
     join(`-', `1', `2', `3')
     =>1-2-3
     join(`', `1', `2', `3')
     =>123
     join(`-', `', `1', `', `', `2', `')
     =>1-2
     joinall(`-', `', `1', `', `', `2', `')
     =>-1---2-
     join(`,', `1', `2', `3')
     =>1,2,3
     define(`nargs', `$#')dnl
     nargs(join(`,', `1', `2', `3'))
     =>1

   Examining the implementation shows some interesting points about
several m4 programming idioms.

     $ m4 -I examples
     undivert(`join.m4')dnl
     =>divert(`-1')
     =># join(sep, args) - join each non-empty ARG into a single
     =># string, with each element separated by SEP
     =>define(`join',
     =>`ifelse(`$#', `2', ``$2'',
     =>  `ifelse(`$2', `', `', ``$2'_')$0(`$1', shift(shift($@)))')')
     =>define(`_join',
     =>`ifelse(`$#$2', `2', `',
     =>  `ifelse(`$2', `', `', ``$1$2'')$0(`$1', shift(shift($@)))')')
     =># joinall(sep, args) - join each ARG, including empty ones,
     =># into a single string, with each element separated by SEP
     =>define(`joinall', ``$2'_$0(`$1', shift($@))')
     =>define(`_joinall',
     =>`ifelse(`$#', `2', `', ``$1$3'$0(`$1', shift(shift($@)))')')
     =>divert`'dnl

   First, notice that this implementation creates helper macros '_join'
and '_joinall'.  This division of labor makes it easier to output the
correct number of SEPARATOR instances: 'join' and 'joinall' are
responsible for the first argument, without a separator, while '_join'
and '_joinall' are responsible for all remaining arguments, always
outputting a separator when outputting an argument.

   Next, observe how 'join' decides to iterate to itself, because the
first ARG was empty, or to output the argument and swap over to '_join'.
If the argument is non-empty, then the nested 'ifelse' results in an
unquoted '_', which is concatenated with the '$0' to form the next macro
name to invoke.  The 'joinall' implementation is simpler since it does
not have to suppress empty ARG; it always executes once then defers to
'_joinall'.

   Another important idiom is the idea that SEPARATOR is reused for each
iteration.  Each iteration has one less argument, but rather than
discarding '$1' by iterating with '$0(shift($@))', the macro discards
'$2' by using '$0(`$1', shift(shift($@)))'.

   Next, notice that it is possible to compare more than one condition
in a single 'ifelse' test.  The test of '$#$2' against '2' allows
'_join' to iterate for two separate reasons--either there are still more
than two arguments, or there are exactly two arguments but the last
argument is not empty.

   Finally, notice that these macros require exactly two arguments to
terminate recursion, but that they still correctly result in empty
output when given no ARGS (i.e., zero or one macro argument).  On the
first pass when there are too few arguments, the 'shift' results in no
output, but leaves an empty string to serve as the required second
argument for the second pass.  Put another way, '`$1', shift($@)' is not
the same as '$@', since only the former guarantees at least two
arguments.

   Sometimes, a recursive algorithm requires adding quotes to each
element, or treating multiple arguments as a single element:

 -- Composite: quote (...)
 -- Composite: dquote (...)
 -- Composite: dquote_elt (...)
     Takes any number of arguments, and adds quoting.  With 'quote',
     only one level of quoting is added, effectively removing whitespace
     after commas and turning multiple arguments into a single string.
     With 'dquote', two levels of quoting are added, one around each
     element, and one around the list.  And with 'dquote_elt', two
     levels of quoting are added around each element.

   An actual implementation of these three macros is distributed as
'm4-1.4.17/examples/quote.m4' in this package.  First, let's examine
their usage:

     $ m4 -I examples
     include(`quote.m4')
     =>
     -quote-dquote-dquote_elt-
     =>----
     -quote()-dquote()-dquote_elt()-
     =>--`'-`'-
     -quote(`1')-dquote(`1')-dquote_elt(`1')-
     =>-1-`1'-`1'-
     -quote(`1', `2')-dquote(`1', `2')-dquote_elt(`1', `2')-
     =>-1,2-`1',`2'-`1',`2'-
     define(`n', `$#')dnl
     -n(quote(`1', `2'))-n(dquote(`1', `2'))-n(dquote_elt(`1', `2'))-
     =>-1-1-2-
     dquote(dquote_elt(`1', `2'))
     =>``1'',``2''
     dquote_elt(dquote(`1', `2'))
     =>``1',`2''

   The last two lines show that when given two arguments, 'dquote'
results in one string, while 'dquote_elt' results in two.  Now, examine
the implementation.  Note that 'quote' and 'dquote_elt' make decisions
based on their number of arguments, so that when called without
arguments, they result in nothing instead of a quoted empty string; this
is so that it is possible to distinguish between no arguments and an
empty first argument.  'dquote', on the other hand, results in a string
no matter what, since it is still possible to tell whether it was
invoked without arguments based on the resulting string.

     $ m4 -I examples
     undivert(`quote.m4')dnl
     =>divert(`-1')
     =># quote(args) - convert args to single-quoted string
     =>define(`quote', `ifelse(`$#', `0', `', ``$*'')')
     =># dquote(args) - convert args to quoted list of quoted strings
     =>define(`dquote', ``$@'')
     =># dquote_elt(args) - convert args to list of double-quoted strings
     =>define(`dquote_elt', `ifelse(`$#', `0', `', `$#', `1', ```$1''',
     =>                             ```$1'',$0(shift($@))')')
     =>divert`'dnl

   It is worth pointing out that 'quote(ARGS)' is more efficient than
'joinall(`,', ARGS)' for producing the same output.

   One more useful macro based on 'shift' allows portably selecting an
arbitrary argument (usually greater than the ninth argument), without
relying on the GNU extension of multi-digit arguments (*note
Arguments::).

 -- Composite: argn (N, ...)
     Expands to argument N out of the remaining arguments.  N must be a
     positive number.  Usually invoked as 'argn(`N',$@)'.

   It is implemented as:

     define(`argn', `ifelse(`$1', 1, ``$2'',
       `argn(decr(`$1'), shift(shift($@)))')')
     =>
     argn(`1', `a')
     =>a
     define(`foo', `argn(`11', $@)')
     =>
     foo(`a', `b', `c', `d', `e', `f', `g', `h', `i', `j', `k', `l')
     =>k


File: m4.info,  Node: Forloop,  Next: Foreach,  Prev: Shift,  Up: Conditionals

6.4 Iteration by counting
=========================

Here is an example of a loop macro that implements a simple for loop.

 -- Composite: forloop (ITERATOR, START, END, TEXT)
     Takes the name in ITERATOR, which must be a valid macro name, and
     successively assign it each integer value from START to END,
     inclusive.  For each assignment to ITERATOR, append TEXT to the
     expansion of the 'forloop'.  TEXT may refer to ITERATOR.  Any
     definition of ITERATOR prior to this invocation is restored.

   It can, for example, be used for simple counting:

     $ m4 -I examples
     include(`forloop.m4')
     =>
     forloop(`i', `1', `8', `i ')
     =>1 2 3 4 5 6 7 8 

   For-loops can be nested, like:

     $ m4 -I examples
     include(`forloop.m4')
     =>
     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 the iterator has reached the final value.  If it has not
finished, it increments the iterator (using the predefined macro 'incr',
*note Incr::), and recurses.

   Here is an actual implementation of 'forloop', distributed as
'm4-1.4.17/examples/forloop.m4' in this package:

     $ m4 -I examples
     undivert(`forloop.m4')dnl
     =>divert(`-1')
     =># forloop(var, from, to, stmt) - simple version
     =>define(`forloop', `pushdef(`$1', `$2')_forloop($@)popdef(`$1')')
     =>define(`_forloop',
     =>       `$4`'ifelse($1, `$3', `', `define(`$1', incr($1))$0($@)')')
     =>divert`'dnl

   Notice the careful use of quotes.  Certain macro arguments are left
unquoted, each for its own reason.  Try to find out _why_ these
arguments are left unquoted, and see what happens if they are quoted.
(As presented, these two macros are useful but not very robust for
general use.  They lack even basic error handling for cases like START
less than END, END not numeric, or ITERATOR not being a macro name.  See
if you can improve these macros; or *note Answers: Improved forloop.).


File: m4.info,  Node: Foreach,  Next: Stacks,  Prev: Forloop,  Up: Conditionals

6.5 Iteration by list contents
==============================

Here is an example of a loop macro that implements list iteration.

 -- Composite: foreach (ITERATOR, PAREN-LIST, TEXT)
 -- Composite: foreachq (ITERATOR, QUOTE-LIST, TEXT)
     Takes the name in ITERATOR, which must be a valid macro name, and
     successively assign it each value from PAREN-LIST or QUOTE-LIST.
     In 'foreach', PAREN-LIST is a comma-separated list of elements
     contained in parentheses.  In 'foreachq', QUOTE-LIST is a
     comma-separated list of elements contained in a quoted string.  For
     each assignment to ITERATOR, append TEXT to the overall expansion.
     TEXT may refer to ITERATOR.  Any definition of ITERATOR prior to
     this invocation is restored.

   As an example, this displays each word in a list inside of a
sentence, using an implementation of 'foreach' distributed as
'm4-1.4.17/examples/foreach.m4', and 'foreachq' in
'm4-1.4.17/examples/foreachq.m4'.

     $ m4 -I examples
     include(`foreach.m4')
     =>
     foreach(`x', (foo, bar, foobar), `Word was: x
     ')dnl
     =>Word was: foo
     =>Word was: bar
     =>Word was: foobar
     include(`foreachq.m4')
     =>
     foreachq(`x', `foo, bar, foobar', `Word was: x
     ')dnl
     =>Word was: foo
     =>Word was: bar
     =>Word was: foobar

   It is possible to be more complex; each element of the PAREN-LIST or
QUOTE-LIST can itself be a list, to pass as further arguments to a
helper macro.  This example generates a shell case statement:

     $ m4 -I examples
     include(`foreach.m4')
     =>
     define(`_case', `  $1)
         $2=" $1";;
     ')dnl
     define(`_cat', `$1$2')dnl
     case $`'1 in
     =>case $1 in
     foreach(`x', `(`(`a', `vara')', `(`b', `varb')', `(`c', `varc')')',
             `_cat(`_case', x)')dnl
     =>  a)
     =>    vara=" a";;
     =>  b)
     =>    varb=" b";;
     =>  c)
     =>    varc=" c";;
     esac
     =>esac

   The implementation of the 'foreach' macro is a bit more involved; it
is a wrapper around two helper macros.  First, '_arg1' is needed to grab
the first element of a list.  Second, '_foreach' implements the
recursion, successively walking through the original list.  Here is a
simple implementation of 'foreach':

     $ m4 -I examples
     undivert(`foreach.m4')dnl
     =>divert(`-1')
     =># foreach(x, (item_1, item_2, ..., item_n), stmt)
     =>#   parenthesized list, simple version
     =>define(`foreach', `pushdef(`$1')_foreach($@)popdef(`$1')')
     =>define(`_arg1', `$1')
     =>define(`_foreach', `ifelse(`$2', `()', `',
     =>  `define(`$1', _arg1$2)$3`'$0(`$1', (shift$2), `$3')')')
     =>divert`'dnl

   Unfortunately, that implementation is not robust to macro names as
list elements.  Each iteration of '_foreach' is stripping another layer
of quotes, leading to erratic results if list elements are not already
fully expanded.  The first cut at implementing 'foreachq' takes this
into account.  Also, when using quoted elements in a PAREN-LIST, the
overall list must be quoted.  A QUOTE-LIST has the nice property of
requiring fewer characters to create a list containing the same quoted
elements.  To see the difference between the two macros, we attempt to
pass double-quoted macro names in a list, expecting the macro name on
output after one layer of quotes is removed during list iteration and
the final layer removed during the final rescan:

     $ m4 -I examples
     define(`a', `1')define(`b', `2')define(`c', `3')
     =>
     include(`foreach.m4')
     =>
     include(`foreachq.m4')
     =>
     foreach(`x', `(``a'', ``(b'', ``c)'')', `x
     ')
     =>1
     =>(2)1
     =>
     =>, x
     =>)
     foreachq(`x', ```a'', ``(b'', ``c)''', `x
     ')dnl
     =>a
     =>(b
     =>c)

   Obviously, 'foreachq' did a better job; here is its implementation:

     $ m4 -I examples
     undivert(`foreachq.m4')dnl
     =>include(`quote.m4')dnl
     =>divert(`-1')
     =># foreachq(x, `item_1, item_2, ..., item_n', stmt)
     =>#   quoted list, simple version
     =>define(`foreachq', `pushdef(`$1')_foreachq($@)popdef(`$1')')
     =>define(`_arg1', `$1')
     =>define(`_foreachq', `ifelse(quote($2), `', `',
     =>  `define(`$1', `_arg1($2)')$3`'$0(`$1', `shift($2)', `$3')')')
     =>divert`'dnl

   Notice that '_foreachq' had to use the helper macro 'quote' defined
earlier (*note Shift::), to ensure that the embedded 'ifelse' call does
not go haywire if a list element contains a comma.  Unfortunately, this
implementation of 'foreachq' has its own severe flaw.  Whereas the
'foreach' implementation was linear, this macro is quadratic in the
number of list elements, and is much more likely to trip up the limit
set by the command line option '--nesting-limit' (or '-L', *note
Invoking m4: Limits control.).  Additionally, this implementation does
not expand 'defn(`ITERATOR')' very well, when compared with 'foreach'.

     $ m4 -I examples
     include(`foreach.m4')include(`foreachq.m4')
     =>
     foreach(`name', `(`a', `b')', ` defn(`name')')
     => a b
     foreachq(`name', ``a', `b'', ` defn(`name')')
     => _arg1(`a', `b') _arg1(shift(`a', `b'))

   It is possible to have robust iteration with linear behavior and sane
ITERATOR contents for either list style.  See if you can learn from the
best elements of both of these implementations to create robust macros
(or *note Answers: Improved foreach.).


File: m4.info,  Node: Stacks,  Next: Composition,  Prev: Foreach,  Up: Conditionals

6.6 Working with definition stacks
==================================

Thanks to 'pushdef', manipulation of a stack is an intrinsic operation
in 'm4'.  Normally, only the topmost definition in a stack is important,
but sometimes, it is desirable to manipulate the entire definition
stack.

 -- Composite: stack_foreach (MACRO, ACTION)
 -- Composite: stack_foreach_lifo (MACRO, ACTION)
     For each of the 'pushdef' definitions associated with MACRO, invoke
     the macro ACTION with a single argument of that definition.
     'stack_foreach' visits the oldest definition first, while
     'stack_foreach_lifo' visits the current definition first.  ACTION
     should not modify or dereference MACRO.  There are a few special
     macros, such as 'defn', which cannot be used as the MACRO
     parameter.

   A sample implementation of these macros is distributed in the file
'm4-1.4.17/examples/stack.m4'.

     $ m4 -I examples
     include(`stack.m4')
     =>
     pushdef(`a', `1')pushdef(`a', `2')pushdef(`a', `3')
     =>
     define(`show', ``$1'
     ')
     =>
     stack_foreach(`a', `show')dnl
     =>1
     =>2
     =>3
     stack_foreach_lifo(`a', `show')dnl
     =>3
     =>2
     =>1

   Now for the implementation.  Note the definition of a helper macro,
'_stack_reverse', which destructively swaps the contents of one stack of
definitions into the reverse order in the temporary macro 'tmp-$1'.  By
calling the helper twice, the original order is restored back into the
macro '$1'; since the operation is destructive, this explains why '$1'
must not be modified or dereferenced during the traversal.  The caller
can then inject additional code to pass the definition currently being
visited to '$2'.  The choice of helper names is intentional; since '-'
is not valid as part of a macro name, there is no risk of conflict with
a valid macro name, and the code is guaranteed to use 'defn' where
necessary.  Finally, note that any macro used in the traversal of a
'pushdef' stack, such as 'pushdef' or 'defn', cannot be handled by
'stack_foreach', since the macro would temporarily be undefined during
the algorithm.

     $ m4 -I examples
     undivert(`stack.m4')dnl
     =>divert(`-1')
     =># stack_foreach(macro, action)
     =># Invoke ACTION with a single argument of each definition
     =># from the definition stack of MACRO, starting with the oldest.
     =>define(`stack_foreach',
     =>`_stack_reverse(`$1', `tmp-$1')'dnl
     =>`_stack_reverse(`tmp-$1', `$1', `$2(defn(`$1'))')')
     =># stack_foreach_lifo(macro, action)
     =># Invoke ACTION with a single argument of each definition
     =># from the definition stack of MACRO, starting with the newest.
     =>define(`stack_foreach_lifo',
     =>`_stack_reverse(`$1', `tmp-$1', `$2(defn(`$1'))')'dnl
     =>`_stack_reverse(`tmp-$1', `$1')')
     =>define(`_stack_reverse',
     =>`ifdef(`$1', `pushdef(`$2', defn(`$1'))$3`'popdef(`$1')$0($@)')')
     =>divert`'dnl


File: m4.info,  Node: Composition,  Prev: Stacks,  Up: Conditionals

6.7 Building macros with macros
===============================

Since m4 is a macro language, it is possible to write macros that can
build other macros.  First on the list is a way to automate the creation
of blind macros.

 -- Composite: define_blind (NAME, [VALUE]
     Defines NAME as a blind macro, such that NAME will expand to VALUE
     only when given explicit arguments.  VALUE should not be the result
     of 'defn' (*note Defn::).  This macro is only recognized with
     parameters, and results in an empty string.

   Defining a macro to define another macro can be a bit tricky.  We
want to use a literal '$#' in the argument to the nested 'define'.
However, if '$' and '#' are adjacent in the definition of
'define_blind', then it would be expanded as the number of arguments to
'define_blind' rather than the intended number of arguments to NAME.
The solution is to pass the difficult characters through extra arguments
to a helper macro '_define_blind'.  When composing macros, it is a
common idiom to need a helper macro to concatenate text that forms
parameters in the composed macro, rather than interpreting the text as a
parameter of the composing macro.

   As for the limitation against using 'defn', there are two reasons.
If a macro was previously defined with 'define_blind', then it can
safely be renamed to a new blind macro using plain 'define'; using
'define_blind' to rename it just adds another layer of 'ifelse',
occupying memory and slowing down execution.  And if a macro is a
builtin, then it would result in an attempt to define a macro consisting
of both text and a builtin token; this is not supported, and the builtin
token is flattened to an empty string.

   With that explanation, here's the definition, and some sample usage.
Notice that 'define_blind' is itself a blind macro.

     $ m4 -d
     define(`define_blind', `ifelse(`$#', `0', ``$0'',
     `_$0(`$1', `$2', `$'`#', `$'`0')')')
     =>
     define(`_define_blind', `define(`$1',
     `ifelse(`$3', `0', ``$4'', `$2')')')
     =>
     define_blind
     =>define_blind
     define_blind(`foo', `arguments were $*')
     =>
     foo
     =>foo
     foo(`bar')
     =>arguments were bar
     define(`blah', defn(`foo'))
     =>
     blah
     =>blah
     blah(`a', `b')
     =>arguments were a,b
     defn(`blah')
     =>ifelse(`$#', `0', ``$0'', `arguments were $*')

   Another interesting composition tactic is argument "currying", or
factoring a macro that takes multiple arguments for use in a context
that provides exactly one argument.

 -- Composite: curry (MACRO, ...)
     Expand to a macro call that takes exactly one argument, then
     appends that argument to the original arguments and invokes MACRO
     with the resulting list of arguments.

   A demonstration of currying makes the intent of this macro a little
more obvious.  The macro 'stack_foreach' mentioned earlier is an example
of a context that provides exactly one argument to a macro name.  But
coupled with currying, we can invoke 'reverse' with two arguments for
each definition of a macro stack.  This example uses the file
'm4-1.4.17/examples/curry.m4' included in the distribution.

     $ m4 -I examples
     include(`curry.m4')include(`stack.m4')
     =>
     define(`reverse', `ifelse(`$#', `0', , `$#', `1', ``$1'',
                               `reverse(shift($@)), `$1'')')
     =>
     pushdef(`a', `1')pushdef(`a', `2')pushdef(`a', `3')
     =>
     stack_foreach(`a', `:curry(`reverse', `4')')
     =>:1, 4:2, 4:3, 4
     curry(`curry', `reverse', `1')(`2')(`3')
     =>3, 2, 1

   Now for the implementation.  Notice how 'curry' leaves off with a
macro name but no open parenthesis, while still in the middle of
collecting arguments for '$1'.  The macro '_curry' is the helper macro
that takes one argument, then adds it to the list and finally supplies
the closing parenthesis.  The use of a comma inside the 'shift' call
allows currying to also work for a macro that takes one argument,
although it often makes more sense to invoke that macro directly rather
than going through 'curry'.

     $ m4 -I examples
     undivert(`curry.m4')dnl
     =>divert(`-1')
     =># curry(macro, args)
     =># Expand to a macro call that takes one argument, then invoke
     =># macro(args, extra).
     =>define(`curry', `$1(shift($@,)_$0')
     =>define(`_curry', ``$1')')
     =>divert`'dnl

   Unfortunately, with M4 1.4.x, 'curry' is unable to handle builtin
tokens, which are silently flattened to the empty string when passed
through another text macro.  This limitation will be lifted in a future
release of M4.

   Putting the last few concepts together, it is possible to copy or
rename an entire stack of macro definitions.

 -- Composite: copy (SOURCE, DEST)
 -- Composite: rename (SOURCE, DEST)
     Ensure that DEST is undefined, then define it to the same stack of
     definitions currently in SOURCE.  'copy' leaves SOURCE unchanged,
     while 'rename' undefines SOURCE.  There are only a few macros, such
     as 'copy' or 'defn', which cannot be copied via this macro.

   The implementation is relatively straightforward (although since it
uses 'curry', it is unable to copy builtin macros, such as the second
definition of 'a' as a synonym for 'divnum'.  See if you can design a
version that works around this limitation, or *note Answers: Improved
copy.).

     $ m4 -I examples
     include(`curry.m4')include(`stack.m4')
     =>
     define(`rename', `copy($@)undefine(`$1')')dnl
     define(`copy', `ifdef(`$2', `errprint(`$2 already defined
     ')m4exit(`1')',
        `stack_foreach(`$1', `curry(`pushdef', `$2')')')')dnl
     pushdef(`a', `1')pushdef(`a', defn(`divnum'))pushdef(`a', `2')
     =>
     copy(`a', `b')
     =>
     rename(`b', `c')
     =>
     a b c
     =>2 b 2
     popdef(`a', `c')c a
     => 0
     popdef(`a', `c')a c
     =>1 1


File: m4.info,  Node: Debugging,  Next: Input Control,  Prev: Conditionals,  Up: Top

7 How to debug macros and input
*******************************

When writing macros for 'm4', they often do not work as intended on the
first try (as is the case with most programming languages).
Fortunately, there is 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,  Up: Debugging

7.1 Displaying macro definitions
================================

If you want to see what a name expands into, you can use the builtin
'dumpdef':

 -- Builtin: dumpdef ([NAMES...]
     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
     to the current debug file (usually standard error), and is sorted
     by name.  If an unknown name is encountered, a warning is printed.

     The expansion of 'dumpdef' is void.

     $ m4 -d
     define(`foo', `Hello world.')
     =>
     dumpdef(`foo')
     error->foo: =>
     dumpdef(`define')
     error->define: =>

   The last example shows how builtin macros definitions are displayed.
The definition that is dumped corresponds to what would occur if the
macro were to be called at that point, even if other definitions are
still live due to redefining a macro during argument collection.

     $ m4 -d
     pushdef(`f', ``$0'1')pushdef(`f', ``$0'2')
     =>
     f(popdef(`f')dumpdef(`f'))
     error->f: =>f2
     f(popdef(`f')dumpdef(`f'))
     error->m4:stdin:3: undefined macro `f'
     =>f1

   *Note Debug Levels::, for information on controlling the details of
the display.


File: m4.info,  Node: Trace,  Next: Debug Levels,  Prev: Dumpdef,  Up: Debugging

7.2 Tracing macro calls
=======================

It is possible to trace macro calls and expansions through the builtins
'traceon' and 'traceoff':

 -- Builtin: traceon ([NAMES...]
 -- Builtin: traceoff ([NAMES...]
     When called without any arguments, 'traceon' and 'traceoff' will
     turn tracing on and off, respectively, for all currently defined
     macros.

     When called with arguments, only the macros listed in NAMES are
     affected, whether or not they are currently defined.

     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 to the current debug file (defaulting to standard error, *note
Debug Output::).

     $ m4 -d
     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.  The
maximum number that will appear between dashes is controlled by the
option '--nesting-limit' (or '-L', *note Invoking m4: Limits control.).
Additionally, the option '--trace' (or '-t') can be used to invoke
'traceon(NAME)' before parsing input.

     $ m4 -L 3 -t ifelse
     ifelse(`one level')
     error->m4trace: -1- ifelse
     =>
     ifelse(ifelse(ifelse(`three levels')))
     error->m4trace: -3- ifelse
     error->m4trace: -2- ifelse
     error->m4trace: -1- ifelse
     =>
     ifelse(ifelse(ifelse(ifelse(`four levels'))))
     error->m4:stdin:3: recursion limit of 3 exceeded, use -L<N> to change it

   Tracing by name is an attribute that is preserved whether the macro
is defined or not.  This allows the selection of macros to trace before
those macros are defined.

     $ m4 -d
     traceoff(`foo')
     =>
     traceon(`foo')
     =>
     foo
     =>foo
     defn(`foo')
     =>
     define(`foo', `bar')
     =>
     foo
     error->m4trace: -1- foo -> `bar'
     =>bar
     undefine(`foo')
     =>
     ifdef(`foo', `yes', `no')
     =>no
     indir(`foo')
     error->m4:stdin:9: undefined macro `foo'
     =>
     define(`foo', `blah')
     =>
     foo
     error->m4trace: -1- foo -> `blah'
     =>blah
     traceoff
     =>
     foo
     =>blah

   Tracing even works on builtins.  However, 'defn' (*note Defn::) does
not transfer tracing status.

     $ m4 -d
     traceon(`traceon')
     =>
     traceon(`traceoff')
     error->m4trace: -1- traceon(`traceoff')
     =>
     traceoff(`traceoff')
     error->m4trace: -1- traceoff(`traceoff')
     =>
     traceoff(`traceon')
     =>
     traceon(`eval', `m4_divnum')
     =>
     define(`m4_eval', defn(`eval'))
     =>
     define(`m4_divnum', defn(`divnum'))
     =>
     eval(divnum)
     error->m4trace: -1- eval(`0') -> `0'
     =>0
     m4_eval(m4_divnum)
     error->m4trace: -2- m4_divnum -> `0'
     =>0

   *Note Debug Levels::, for information on controlling the details of
the display.  The format of the trace output is not specified by POSIX,
and varies between implementations of 'm4'.


File: m4.info,  Node: Debug Levels,  Next: Debug Output,  Prev: Trace,  Up: Debugging

7.3 Controlling debugging output
================================

The '-d' option to 'm4' (or '--debug', *note Invoking m4: Debugging
options.) controls the amount of details presented in three categories
of output.  Trace output is requested by 'traceon' (*note Trace::), and
each line is prefixed by 'm4trace:' in relation to a macro invocation.
Debug output tracks useful events not associated with a macro
invocation, and each line is prefixed by 'm4debug:'.  Finally, 'dumpdef'
(*note Dumpdef::) output is affected, with no prefix added to the output
lines.

   The FLAGS following the option can be one or more of the following:

'a'
     In trace output, show the actual arguments that were collected
     before invoking the macro.  This applies to all macro calls if the
     't' flag is used, otherwise only the macros covered by calls of
     'traceon'.  Arguments are subject to length truncation specified by
     the command line option '--arglength' (or '-l').

'c'
     In trace output, 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.

'e'
     In trace output, 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'.  The
     expansion is subject to length truncation specified by the command
     line option '--arglength' (or '-l').

'f'
     In debug and trace output, include the name of the current input
     file in the output line.

'i'
     In debug output, print a message each time the current input file
     is changed.

'l'
     In debug and trace output, include the current input line number in
     the output line.

'p'
     In debug output, print a message when a named file is found through
     the path search mechanism (*note Search Path::), giving the actual
     file name used.

'q'
     In trace and dumpdef output, quote actual arguments and macro
     expansions in the display with the current quotes.  This is useful
     in connection with the 'a' and 'e' flags above.

't'
     In trace output, trace all macro calls made in this invocation of
     'm4', regardless of the settings of 'traceon'.

'x'
     In trace output, add a unique 'macro call id' to each line of the
     trace output.  This is useful in connection with the 'c' flag
     above.

'V'
     A shorthand for all of the above flags.

   If no flags are specified with the '-d' option, the default is 'aeq'.
The examples throughout this manual assume the default flags.

   There is a builtin macro 'debugmode', which allows on-the-fly control
of the debugging output format:

 -- Builtin: debugmode ([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, all debugging flags are
     cleared (as if no '-d' was given), and with an empty argument the
     flags are reset to the default of 'aeq'.

     The expansion of 'debugmode' is void.

     $ m4
     define(`foo', `FOO')
     =>
     traceon(`foo')
     =>
     debugmode()
     =>
     foo
     error->m4trace: -1- foo -> `FOO'
     =>FOO
     debugmode
     =>
     foo
     error->m4trace: -1- foo
     =>FOO
     debugmode(`+l')
     =>
     foo
     error->m4trace:8: -1- foo
     =>FOO

   The following example demonstrates the behavior of length truncation,
when specified on the command line.  Note that each argument and the
final result are individually truncated.  Also, the special tokens for
builtin functions are not truncated.

     $ m4 -d -l 6
     define(`echo', `$@')debugmode(`+t')
     =>
     echo(`1', `long string')
     error->m4trace: -1- echo(`1', `long s...') -> ``1',`l...'
     =>1,long string
     indir(`echo', defn(`changequote'))
     error->m4trace: -2- defn(`change...')
     error->m4trace: -1- indir(`echo', <changequote>) -> ``''
     =>

   This example shows the effects of the debug flags that are not
related to macro tracing.

     $ m4 -dip -I examples
     error->m4debug: input read from stdin
     include(`foo')dnl
     error->m4debug: path search for `foo' found `examples/foo'
     error->m4debug: input read from examples/foo
     =>bar
     error->m4debug: input reverted to stdin, line 1
     ^D
     error->m4debug: input exhausted


File: m4.info,  Node: Debug Output,  Prev: Debug Levels,  Up: Debugging

7.4 Saving debugging output
===========================

Debug and tracing output can be redirected to files using either the
'--debugfile' option to 'm4' (*note Invoking m4: Debugging options.), or
with the builtin macro 'debugfile':

 -- Builtin: debugfile ([FILE]
     Sends all further debug and trace output to FILE, opened in append
     mode.  If FILE is the empty string, debug and trace output are
     discarded.  If 'debugfile' is called without any arguments, debug
     and trace output are sent to standard error.  This does not affect
     warnings, error messages, or 'errprint' output, which are always
     sent to standard error.  If FILE cannot be opened, the current
     debug file is unchanged, and an error is issued.

     The expansion of 'debugfile' is void.

     $ m4 -d
     traceon(`divnum')
     =>
     divnum(`extra')
     error->m4:stdin:2: Warning: excess arguments to builtin `divnum' ignored
     error->m4trace: -1- divnum(`extra') -> `0'
     =>0
     debugfile()
     =>
     divnum(`extra')
     error->m4:stdin:4: Warning: excess arguments to builtin `divnum' ignored
     =>0
     debugfile
     =>
     divnum
     error->m4trace: -1- divnum -> `0'
     =>0


File: m4.info,  Node: Input Control,  Next: File Inclusion,  Prev: Debugging,  Up: Top

8 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 text until end of input


File: m4.info,  Node: Dnl,  Next: Changequote,  Up: Input Control

8.1 Deleting whitespace in input
================================

The builtin 'dnl' stands for "Discard to Next Line":

 -- Builtin: dnl
     All characters, up to and including the next newline, are discarded
     without performing any macro expansion.  A warning is issued if the
     end of the file is encountered without a newline.

     The expansion of 'dnl' is void.

   It is often used in connection with 'define', to remove the newline
that follows 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.

     dnl(`args are ignored, but side effects occur',
     define(`foo', `like this')) while this text is ignored: undefine(`foo')
     error->m4:stdin:1: Warning: excess arguments to builtin `dnl' ignored
     See how `foo' was defined, foo?
     =>See how foo was defined, like this?

   If the end of file is encountered without a newline character, a
warning is issued and dnl stops consuming input.

     m4wrap(`m4wrap(`2 hi
     ')0 hi dnl 1 hi')
     =>
     define(`hi', `HI')
     =>
     ^D
     error->m4:stdin:1: Warning: end of file treated as newline
     =>0 HI 2 HI


File: m4.info,  Node: Changequote,  Next: Changecom,  Prev: Dnl,  Up: Input Control

8.2 Changing the quote characters
=================================

The default quote delimiters can be changed with the builtin
'changequote':

 -- Builtin: changequote ([START = '`']
     This sets START as the new begin-quote delimiter and END as the new
     end-quote delimiter.  If both arguments are missing, the default
     quotes ('`' and ''') are used.  If START is void, then quoting is
     disabled.  Otherwise, if END is missing or void, the default
     end-quote delimiter (''') is used.  The quote delimiters can be of
     any length.

     The expansion of 'changequote' is void.

     changequote(`[', `]')
     =>
     define([foo], [Macro [foo].])
     =>
     foo
     =>Macro foo.

   The quotation strings can safely contain eight-bit characters.  If no
single character is appropriate, START and END can be of any length.
Other implementations cap the delimiter length to five characters, but
GNU has no inherent limit.

     changequote(`[[[', `]]]')
     =>
     define([[[foo]]], [[[Macro [[[[[foo]]]]].]]])
     =>
     foo
     =>Macro [[foo]].

   Calling 'changequote' with START as the empty string will effectively
disable the quoting mechanism, leaving no way to quote text.  However,
using an empty string is not portable, as some other implementations of
'm4' revert to the default quoting, while others preserve the prior
non-empty delimiter.  If START is not empty, then an empty END will use
the default end-quote delimiter of ''', as otherwise, it would be
impossible to end a quoted string.  Again, this is not portable, as some
other 'm4' implementations reuse START as the end-quote delimiter, while
others preserve the previous non-empty value.  Omitting both arguments
restores the default begin-quote and end-quote delimiters; fortunately
this behavior is portable to all implementations of 'm4'.

     define(`foo', `Macro `FOO'.')
     =>
     changequote(`', `')
     =>
     foo
     =>Macro `FOO'.
     `foo'
     =>`Macro `FOO'.'
     changequote(`,)
     =>
     foo
     =>Macro FOO.

   There is no way in 'm4' to quote a string containing an unmatched
begin-quote, except using 'changequote' to change the current quotes.

   If the quotes should be changed from, say, '[' to '[[', temporary
quote characters have to be defined.  To achieve this, two calls of
'changequote' must be made, one for the temporary quotes and one for the
new quotes.

   Macros are recognized in preference to the begin-quote string, so if
a prefix of START can be recognized as part of a potential macro name,
the quoting mechanism is effectively disabled.  Unless you use
'changeword' (*note Changeword::), this means that START should not
begin with a letter, digit, or '_' (underscore).  However, even though
quoted strings are not recognized, the quote characters can still be
discerned in macro expansion and in trace output.

     define(`echo', `$@')
     =>
     define(`hi', `HI')
     =>
     changequote(`q', `Q')
     =>
     q hi Q hi
     =>q HI Q HI
     echo(hi)
     =>qHIQ
     changequote
     =>
     changequote(`-', `EOF')
     =>
     - hi EOF hi
     => hi  HI
     changequote
     =>
     changequote(`1', `2')
     =>
     hi1hi2
     =>hi1hi2
     hi 1hi2
     =>HI hi

   Quotes are recognized in preference to argument collection.  In
particular, if START is a single '(', then argument collection is
effectively disabled.  For portability with other implementations, it is
a good idea to avoid '(', ',', and ')' as the first character in START.

     define(`echo', `$#:$@:')
     =>
     define(`hi', `HI')
     =>
     changequote(`(',`)')
     =>
     echo(hi)
     =>0::hi
     changequote
     =>
     changequote(`((', `))')
     =>
     echo(hi)
     =>1:HI:
     echo((hi))
     =>0::hi
     changequote
     =>
     changequote(`,', `)')
     =>
     echo(hi,hi)bye)
     =>1:HIhibye:

   However, if you are not worried about portability, using '(' and ')'
as quoting characters has an interesting property--you can use it to
compute a quoted string containing the expansion of any quoted text, as
long as the expansion results in both balanced quotes and balanced
parentheses.  The trick is realizing 'expand' uses '$1' unquoted, to
trigger its expansion using the normal quoting characters, but uses
extra parentheses to group unquoted commas that occur in the expansion
without consuming whitespace following those commas.  Then '_expand'
uses 'changequote' to convert the extra parentheses back into quoting
characters.  Note that it takes two more 'changequote' invocations to
restore the original quotes.  Contrast the behavior on whitespace when
using '$*', via 'quote', to attempt the same task.

     changequote(`[', `]')dnl
     define([a], [1, (b)])dnl
     define([b], [2])dnl
     define([quote], [[$*]])dnl
     define([expand], [_$0(($1))])dnl
     define([_expand],
       [changequote([(], [)])$1changequote`'changequote(`[', `]')])dnl
     expand([a, a, [a, a], [[a, a]]])
     =>1, (2), 1, (2), a, a, [a, a]
     quote(a, a, [a, a], [[a, a]])
     =>1,(2),1,(2),a, a,[a, a]

   If END is a prefix of START, the end-quote will be recognized in
preference to a nested begin-quote.  In particular, changing the quotes
to have the same string for START and END disables nesting of quotes.
When quote nesting is disabled, it is impossible to double-quote strings
across macro expansions, so using the same string is not done very
often.

     define(`hi', `HI')
     =>
     changequote(`""', `"')
     =>
     ""hi"""hi"
     =>hihi
     ""hi" ""hi"
     =>hi hi
     ""hi"" "hi"
     =>hi" "HI"
     changequote
     =>
     `hi`hi'hi'
     =>hi`hi'hi
     changequote(`"', `"')
     =>
     "hi"hi"hi"
     =>hiHIhi

   It is an error if the end of file occurs within a quoted string.

     `hello world'
     =>hello world
     `dangling quote
     ^D
     error->m4:stdin:2: ERROR: end of file in string

     ifelse(`dangling quote
     ^D
     error->m4:stdin:1: ERROR: end of file in string


File: m4.info,  Node: Changecom,  Next: Changeword,  Prev: Changequote,  Up: Input Control

8.3 Changing the comment delimiters
===================================

The default comment delimiters can be changed with the builtin macro
'changecom':

 -- Builtin: changecom ([START]
     This sets START as the new begin-comment delimiter and END as the
     new end-comment delimiter.  If both arguments are missing, or START
     is void, then comments are disabled.  Otherwise, if END is missing
     or void, the default end-comment delimiter of newline is used.  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 begin-comment delimiter.

   Calling 'changecom' without any arguments, or with START as the empty
string, will effectively disable the commenting mechanism.  To restore
the original comment start of '#', you must explicitly ask for it.  If
START is not empty, then an empty END will use the default end-comment
delimiter of newline, as otherwise, it would be impossible to end a
comment.  However, this is not portable, as some other 'm4'
implementations preserve the previous non-empty delimiters instead.

     define(`comment', `COMMENT')
     =>
     changecom
     =>
     # Not a comment anymore
     =># Not a COMMENT anymore
     changecom(`#', `')
     =>
     # comment again
     =># comment again

   The comment strings can safely contain eight-bit characters.  If no
single character is appropriate, START and END can be of any length.
Other implementations cap the delimiter length to five characters, but
GNU has no inherent limit.

   Comments are recognized in preference to macros.  However, this is
not compatible with other implementations, where macros and even quoting
takes precedence over comments, so it may change in a future release.
For portability, this means that START should not begin with a letter,
digit, or '_' (underscore), and that neither the start-quote nor the
start-comment string should be a prefix of the other.

     define(`hi', `HI')
     =>
     define(`hi1hi2', `hello')
     =>
     changecom(`q', `Q')
     =>
     q hi Q hi
     =>q hi Q HI
     changecom(`1', `2')
     =>
     hi1hi2
     =>hello
     hi 1hi2
     =>HI 1hi2

   Comments are recognized in preference to argument collection.  In
particular, if START is a single '(', then argument collection is
effectively disabled.  For portability with other implementations, it is
a good idea to avoid '(', ',', and ')' as the first character in START.

     define(`echo', `$#:$*:$@:')
     =>
     define(`hi', `HI')
     =>
     changecom(`(',`)')
     =>
     echo(hi)
     =>0:::(hi)
     changecom
     =>
     changecom(`((', `))')
     =>
     echo(hi)
     =>1:HI:HI:
     echo((hi))
     =>0:::((hi))
     changecom(`,', `)')
     =>
     echo(hi,hi)bye)
     =>1:HI,hi)bye:HI,hi)bye:
     changecom
     =>
     echo(hi,`,`'hi',hi)
     =>3:HI,,HI,HI:HI,,`'hi,HI:
     echo(hi,`,`'hi',hi`'changecom(`,,', `hi'))
     =>3:HI,,`'hi,HI:HI,,`'hi,HI:

   It is an error if the end of file occurs within a comment.

     changecom(`/*', `*/')
     =>
     /*dangling comment
     ^D
     error->m4:stdin:2: ERROR: end of file in comment


File: m4.info,  Node: Changeword,  Next: M4wrap,  Prev: Changecom,  Up: Input Control

8.4 Changing the lexical structure of words
===========================================

     The macro 'changeword' and all associated functionality is
     experimental.  It is only available if the '--enable-changeword'
     option was given to 'configure', at GNU 'm4' installation time.
     The functionality will go away in the future, to be replaced by
     other new features that are more efficient at providing the same
     capabilities.  _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:

 -- Optional builtin: changeword (REGEX)
     Changes the regular expression for recognizing macro names to be
     REGEX.  If REGEX is empty, use '[_a-zA-Z][_a-zA-Z0-9]*'.  REGEX
     must obey the constraint that every prefix of the desired final
     pattern is also accepted by the regular expression.  If REGEX
     contains grouping parentheses, the macro invoked is the portion
     that matched the first group, rather than the entire matching
     string.

     The expansion of 'changeword' is void.  The macro 'changeword' is
     recognized only with parameters.

   Relaxing the lexical rules of 'm4' might be useful (for example) if
you wanted to apply translations to a file of numbers:

     ifdef(`changeword', `', `errprint(` skipping: no changeword support
     ')m4exit(`77')')dnl
     changeword(`[_a-zA-Z0-9]+')
     =>
     define(`1', `0')1
     =>0

   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:

     ifdef(`changeword', `', `errprint(` skipping: no changeword support
     ')m4exit(`77')')dnl
     define(`_indir', defn(`indir'))
     =>
     changeword(`_[_a-zA-Z0-9]*')
     =>
     esyscmd(`foo')
     =>esyscmd(foo)
     _indir(`esyscmd', `echo hi')
     =>hi
     =>

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

     ifdef(`changeword', `', `errprint(` skipping: no changeword support
     ')m4exit(`77')')dnl
     define(`foo
     ', `bar
     ')
     =>
     dnl This example wants to recognize changeword, dnl, and `foo\n'.
     dnl First, we check that our regexp will match.
     regexp(`changeword', `[cd][a-z]*\|foo[
     ]')
     =>0
     regexp(`foo
     ', `[cd][a-z]*\|foo[
     ]')
     =>0
     regexp(`f', `[cd][a-z]*\|foo[
     ]')
     =>-1
     foo
     =>foo
     changeword(`[cd][a-z]*\|foo[
     ]')
     =>
     dnl Even though `foo\n' matches, we forgot to allow `f'.
     foo
     =>foo
     changeword(`[cd][a-z]*\|fo*[
     ]?')
     =>
     dnl Now we can call `foo\n'.
     foo
     =>bar

   'changeword' has another function.  If the regular expression
supplied contains any grouped subexpressions, then text outside the
first of these is discarded before symbol lookup.  So:

     ifdef(`changeword', `', `errprint(` skipping: no changeword support
     ')m4exit(`77')')dnl
     ifdef(`__unix__', ,
           `errprint(` skipping: syscmd does not have unix semantics
     ')m4exit(`77')')dnl
     changecom(`/*', `*/')dnl
     define(`foo', `bar')dnl
     changeword(`#\([_a-zA-Z0-9]*\)')
     =>
     #esyscmd(`echo foo \#foo')
     =>foo bar
     =>

   'm4' now requires a '#' mark at the beginning of every macro
invocation, so one can use 'm4' to preprocess plain text without losing
various words like 'divert'.

   In 'm4', macro substitution is based on text, while in TeX, it 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}}
     \catcode`\@=0
     \catcode`\\=12
     @a
     @bye
     =>Hello

Then, the 'm4' version:

     ifdef(`changeword', `', `errprint(` skipping: no changeword support
     ')m4exit(`77')')dnl
     define(`a', `errprint(`Hello')')dnl
     changeword(`@\([_a-zA-Z0-9]*\)')
     =>
     @a
     =>errprint(Hello)

   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, once it is changed to something other than the
default regular expression.  You can invoke 'changeword' with the empty
string to restore the default word definition, and regain the parsing
speed.


File: m4.info,  Node: M4wrap,  Prev: Changeword,  Up: Input Control

8.5 Saving text until end of 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':

 -- Builtin: m4wrap (STRING, ...)
     Stores STRING in a safe place, to be reread when end of input is
     reached.  As a GNU extension, additional arguments are concatenated
     with a space to the STRING.

     The expansion of 'm4wrap' is void.  The macro 'm4wrap' is
     recognized only with parameters.

     define(`cleanup', `This is the `cleanup' action.
     ')
     =>
     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 action.

   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).  However, this
behavior is likely to change in a future release, to match POSIX, so you
should not depend on this order.

   It is possible to emulate POSIX behavior even with older versions of
GNU M4 by including the file 'm4-1.4.17/examples/wrapfifo.m4' from the
distribution:

     $ m4 -I examples
     undivert(`wrapfifo.m4')dnl
     =>dnl Redefine m4wrap to have FIFO semantics.
     =>define(`_m4wrap_level', `0')dnl
     =>define(`m4wrap',
     =>`ifdef(`m4wrap'_m4wrap_level,
     =>       `define(`m4wrap'_m4wrap_level,
     =>               defn(`m4wrap'_m4wrap_level)`$1')',
     =>       `builtin(`m4wrap', `define(`_m4wrap_level',
     =>                                  incr(_m4wrap_level))dnl
     =>m4wrap'_m4wrap_level)dnl
     =>define(`m4wrap'_m4wrap_level, `$1')')')dnl
     include(`wrapfifo.m4')
     =>
     m4wrap(`a`'m4wrap(`c
     ', `d')')m4wrap(`b')
     =>
     ^D
     =>abc

   It is likewise possible to emulate LIFO behavior without resorting to
the GNU M4 extension of 'builtin', by including the file
'm4-1.4.17/examples/wraplifo.m4' from the distribution.  (Unfortunately,
both examples shown here share some subtle bugs.  See if you can find
and correct them; or *note Answers: Improved m4wrap.).

     $ m4 -I examples
     undivert(`wraplifo.m4')dnl
     =>dnl Redefine m4wrap to have LIFO semantics.
     =>define(`_m4wrap_level', `0')dnl
     =>define(`_m4wrap', defn(`m4wrap'))dnl
     =>define(`m4wrap',
     =>`ifdef(`m4wrap'_m4wrap_level,
     =>       `define(`m4wrap'_m4wrap_level,
     =>               `$1'defn(`m4wrap'_m4wrap_level))',
     =>       `_m4wrap(`define(`_m4wrap_level', incr(_m4wrap_level))dnl
     =>m4wrap'_m4wrap_level)dnl
     =>define(`m4wrap'_m4wrap_level, `$1')')')dnl
     include(`wraplifo.m4')
     =>
     m4wrap(`a`'m4wrap(`c
     ', `d')')m4wrap(`b')
     =>
     ^D
     =>bac

   Here is an example of implementing a factorial function using
'm4wrap':

     define(`f', `ifelse(`$1', `0', `Answer: 0!=1
     ', eval(`$1>1'), `0', `Answer: $2$1=eval(`$2$1')
     ', `m4wrap(`f(decr(`$1'), `$2$1*')')')')
     =>
     f(`10')
     =>
     ^D
     =>Answer: 10*9*8*7*6*5*4*3*2*1=3628800

   Invocations of 'm4wrap' at the same recursion level are concatenated
and rescanned as usual:

     define(`aa', `AA
     ')
     =>
     m4wrap(`a')m4wrap(`a')
     =>
     ^D
     =>AA

however, the transition between recursion levels behaves like an end of
file condition between two input files.

     m4wrap(`m4wrap(`)')len(abc')
     =>
     ^D
     error->m4:stdin:1: ERROR: end of file in argument list


File: m4.info,  Node: File Inclusion,  Next: Diversions,  Prev: Input Control,  Up: Top

9 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,  Up: File Inclusion

9.1 Including named files
=========================

There are two builtin macros in 'm4' for including files:

 -- Builtin: include (FILE)
 -- Builtin: sinclude (FILE)
     Both macros cause the file named FILE 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 FILE.

     If FILE does not exist, is a directory, or cannot otherwise be
     read, the expansion is void, and 'include' will fail with an error
     while 'sinclude' is silent.  The empty string counts as a file that
     does not exist.

     The macros 'include' and 'sinclude' are recognized only with
     parameters.

     include(`none')
     error->m4:stdin:1: cannot open `none': No such file or directory
     =>
     include()
     error->m4:stdin:2: cannot open `': No such file or directory
     =>
     sinclude(`none')
     =>
     sinclude()
     =>

   The rest of this section assumes that 'm4' is invoked with the '-I'
option (*note Invoking m4: Preprocessor features.) pointing to the
'm4-1.4.17/examples' directory shipped as part of the GNU 'm4' package.
The file 'm4-1.4.17/examples/incl.m4' in the distribution contains the
lines:

     $ cat examples/incl.m4
     =>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:

     $ m4 -I examples
     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':

     $ m4 -I examples
     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.  GNU 'm4' seamlessly concatenates the file contents
with the next character, even if the included file ended in the middle
of a comment, string, or macro call.  These conditions are only treated
as end of file errors if specified as input files on the command line.

   In GNU 'm4', an alternative method of reading files is using
'undivert' (*note Undivert::) on a named file.


File: m4.info,  Node: Search Path,  Prev: Include,  Up: File Inclusion

9.2 Searching for include files
===============================

GNU 'm4' allows included files to be found in other directories than the
current working directory.

   If the '--prepend-include' or '-B' command-line option was provided
(*note Invoking m4: Preprocessor features.), those directories are
searched first, in reverse order that those options were listed on the
command line.  Then 'm4' looks in the current working directory.  Next
comes the directories specified with the '--include' or '-I' option, in
the order found on the command line.  Finally, 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

10 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.  GNU 'm4' tries to keep diversions in
memory.  However, there is a limit to the overall memory usable by all
diversions taken together (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.  When creating the temporary file, 'm4' honors the value of
the environment variable 'TMPDIR', and falls back to '/tmp'.  Thus, the
amount of available disk space provides the only real limit on the
number and aggregate size of diversions.

   Diversions make it possible to generate output in a different order
than the input was read.  It is possible to implement topological
sorting dependencies.  For example, GNU Autoconf makes use of diversions
under the hood to ensure that the expansion of a prerequisite macro
appears in the output prior to the expansion of a dependent macro,
regardless of which order the two macros were invoked in the user's
input file.

* Menu:

* Divert::                      Diverting output
* Undivert::                    Undiverting output
* Divnum::                      Diversion numbers
* Cleardivert::                 Discarding diverted text


File: m4.info,  Node: Divert,  Next: Undivert,  Up: Diversions

10.1 Diverting output
=====================

Output is diverted using 'divert':

 -- Builtin: divert ([NUMBER = '0']
     The current diversion is changed to NUMBER.  If NUMBER is left out
     or empty, it is assumed to be zero.  If NUMBER cannot be parsed,
     the diversion is unchanged.

     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.  Diversions are printed after
any wrapped text is expanded.

     define(`text', `TEXT')
     =>
     divert(`1')`diverted text.'
     divert
     =>
     m4wrap(`Wrapped text precedes ')
     =>
     ^D
     =>Wrapped TEXT precedes diverted text.

   If output is diverted to a negative 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 a common programming idiom in 'm4' for avoiding
them.

     divert(`-1')
     define(`foo', `Macro `foo'.')
     define(`bar', `Macro `bar'.')
     divert
     =>

   Traditional implementations only supported ten diversions.  But as a
GNU extension, diversion numbers can be as large as positive integers
will allow, rather than treating a multi-digit diversion number as a
request to discard text.

     divert(eval(`1<<28'))world
     divert(`2')hello
     ^D
     =>hello
     =>world

   Note that 'divert' is an English word, but also an active macro
without arguments.  When processing plain text, the word might appear in
normal text and be unintentionally swallowed as a macro invocation.  One
way to avoid this is to use the '-P' option to rename all builtins
(*note Invoking m4: Operation modes.).  Another is to write a wrapper
that requires a parameter to be recognized.

     We decided to divert the stream for irrigation.
     =>We decided to  the stream for irrigation.
     define(`divert', `ifelse(`$#', `0', ``$0'', `builtin(`$0', $@)')')
     =>
     divert(`-1')
     Ignored text.
     divert(`0')
     =>
     We decided to divert the stream for irrigation.
     =>We decided to divert the stream for irrigation.


File: m4.info,  Node: Undivert,  Next: Divnum,  Prev: Divert,  Up: Diversions

10.2 Undiverting output
=======================

Diverted text can be undiverted explicitly using the builtin 'undivert':

 -- Builtin: undivert ([DIVERSIONS...]
     Undiverts the numeric DIVERSIONS given by the arguments, in the
     order given.  If no arguments are supplied, all diversions are
     undiverted, in numerical order.

     As a GNU extension, DIVERSIONS may contain non-numeric strings,
     which are treated as the names of files to copy into the output
     without expansion.  A warning is issued if a file could not be
     opened.

     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.  Undiverting the empty string is the
same as specifying diversion 0; in either case nothing happens since the
output has already been flushed.

     divert(`1')diverted text
     divert
     =>
     undivert()
     =>
     undivert(`0')
     =>
     undivert
     =>diverted text
     =>
     divert(`1')more
     divert(`2')undivert(`1')diverted text`'divert
     =>
     undivert(`1')
     =>
     undivert(`2')
     =>more
     =>diverted text

   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.
Thus, when the current diversion is not 0, the current diversion does
not get rearranged among the other diversions.

     divert(`1')one
     divert(`2')two
     divert(`3')three
     divert(`2')undivert`'dnl
     divert`'undivert`'dnl
     =>two
     =>one
     =>three

   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:

     $ cat foo
     bar

then

     define(`bar', `BAR')
     =>
     undivert(`foo')
     =>bar
     =>
     include(`foo')
     =>BAR
     =>

   If the file is not found (or cannot be read), an error message is
issued, and the expansion is void.  It is possible to intermix files and
diversion numbers.

     divert(`1')diversion one
     divert(`2')undivert(`foo')dnl
     divert(`3')diversion three
     divert`'dnl
     undivert(`1', `2', `foo', `3')dnl
     =>diversion one
     =>bar
     =>bar
     =>diversion three


File: m4.info,  Node: Divnum,  Next: Cleardivert,  Prev: Undivert,  Up: Diversions

10.3 Diversion numbers
======================

The current diversion is tracked by the builtin 'divnum':

 -- Builtin: divnum
     Expands to the number of the current diversion.

     Initial divnum
     =>Initial 0
     divert(`1')
     Diversion one: divnum
     divert(`2')
     Diversion two: divnum
     ^D
     =>
     =>Diversion one: 1
     =>
     =>Diversion two: 2


File: m4.info,  Node: Cleardivert,  Prev: Divnum,  Up: Diversions

10.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:

 -- Composite: cleardivert ([DIVERSIONS...]
     Discard the contents of each of the listed numeric DIVERSIONS.

     define(`cleardivert',
     `pushdef(`_n', divnum)divert(`-1')undivert($@)divert(_n)popdef(`_n')')
     =>

   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; or *note Answers:
Improved cleardivert.).


File: m4.info,  Node: Text handling,  Next: Arithmetic,  Prev: Diversions,  Up: Top

11 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,  Up: Text handling

11.1 Calculating length of strings
==================================

The length of a string can be calculated by 'len':

 -- Builtin: len (STRING)
     Expands to the length of STRING, as a decimal number.

     The macro 'len' is recognized only with parameters.

     len()
     =>0
     len(`abcdef')
     =>6


File: m4.info,  Node: Index macro,  Next: Regexp,  Prev: Len,  Up: Text handling

11.2 Searching for substrings
=============================

Searching for substrings is done with 'index':

 -- Builtin: index (STRING, SUBSTRING)
     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'.

     The macro 'index' is recognized only with parameters.

     index(`gnus, gnats, and armadillos', `nat')
     =>7
     index(`gnus, gnats, and armadillos', `dag')
     =>-1

   Omitting SUBSTRING evokes a warning, but still produces output;
contrast this with an empty SUBSTRING.

     index(`abc')
     error->m4:stdin:1: Warning: too few arguments to builtin `index'
     =>0
     index(`abc', `')
     =>0
     index(`abc', `b')
     =>1


File: m4.info,  Node: Regexp,  Next: Substr,  Prev: Index macro,  Up: Text handling

11.3 Searching for regular expressions
======================================

Searching for regular expressions is done with the builtin 'regexp':

 -- Builtin: regexp (STRING, REGEXP, [REPLACEMENT]
     Searches for REGEXP in STRING.  The syntax for regular expressions
     is the same as in GNU Emacs, which is similar to BRE, Basic Regular
     Expressions in POSIX. *Note Syntax of Regular Expressions:
     (emacs)Regexps.  Support for ERE, Extended Regular Expressions is
     not available, but will be added in GNU M4 2.0.

     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.

     If REPLACEMENT is supplied, and there was a match, 'regexp' changes
     the expansion to this argument, with '\N' substituted by the text
     matched by the Nth parenthesized sub-expression of REGEXP, up to
     nine sub-expressions.  The escape '\&' is replaced by the text of
     the entire regular expression matched.  For all other characters,
     '\' treats the next character literally.  A warning is issued if
     there were fewer sub-expressions than the '\N' requested, or if
     there is a trailing '\'.  If there was no match, 'regexp' expands
     to the empty string.

     The macro 'regexp' is recognized only with parameters.

     regexp(`GNUs not Unix', `\<[a-z]\w+')
     =>5
     regexp(`GNUs not Unix', `\<Q\w*')
     =>-1
     regexp(`GNUs not Unix', `\w\(\w+\)$', `*** \& *** \1 ***')
     =>*** Unix *** nix ***
     regexp(`GNUs not Unix', `\<Q\w*', `*** \& *** \1 ***')
     =>

   Here are some more examples on the handling of backslash:

     regexp(`abc', `\(b\)', `\\\10\a')
     =>\b0a
     regexp(`abc', `b', `\1\')
     error->m4:stdin:2: Warning: sub-expression 1 not present
     error->m4:stdin:2: Warning: trailing \ ignored in replacement
     =>
     regexp(`abc', `\(\(d\)?\)\(c\)', `\1\2\3\4\5\6')
     error->m4:stdin:3: Warning: sub-expression 4 not present
     error->m4:stdin:3: Warning: sub-expression 5 not present
     error->m4:stdin:3: Warning: sub-expression 6 not present
     =>c

   Omitting REGEXP evokes a warning, but still produces output; contrast
this with an empty REGEXP argument.

     regexp(`abc')
     error->m4:stdin:1: Warning: too few arguments to builtin `regexp'
     =>0
     regexp(`abc', `')
     =>0
     regexp(`abc', `', `\\def')
     =>\def


File: m4.info,  Node: Substr,  Next: Translit,  Prev: Regexp,  Up: Text handling

11.4 Extracting substrings
==========================

Substrings are extracted with 'substr':

 -- Builtin: substr (STRING, FROM, [LENGTH]
     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.  The
     expansion is empty if there is an error parsing FROM or LENGTH, if
     FROM is beyond the end of STRING, or if LENGTH is negative.

     The macro 'substr' is recognized only with parameters.

     substr(`gnus, gnats, and armadillos', `6')
     =>gnats, and armadillos
     substr(`gnus, gnats, and armadillos', `6', `5')
     =>gnats

   Omitting FROM evokes a warning, but still produces output.

     substr(`abc')
     error->m4:stdin:1: Warning: too few arguments to builtin `substr'
     =>abc
     substr(`abc',)
     error->m4:stdin:2: empty string treated as 0 in builtin `substr'
     =>abc


File: m4.info,  Node: Translit,  Next: Patsubst,  Prev: Substr,  Up: Text handling

11.5 Translating characters
===========================

Character translation is done with 'translit':

 -- Builtin: translit (STRING, CHARS, [REPLACEMENT]
     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 of
     CHARS are deleted from the expansion; if CHARS is shorter, the
     excess characters in REPLACEMENT are silently ignored.  If
     REPLACEMENT is omitted, all characters in STRING that are present
     in CHARS are deleted from the expansion.  If a character appears
     more than once in CHARS, only the first instance is used in making
     the translation.  Only a single translation pass is made, even if
     characters in REPLACEMENT also appear in CHARS.

     As a GNU extension, 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 in the entire string, or as the
     last character of a range.  Back-to-back ranges can share a common
     endpoint.  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'.  The
     expansion of a range is dependent on the underlying encoding of
     characters, so using ranges is not always portable between
     machines.

     The macro 'translit' is recognized only with parameters.

     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
     translit(`+,-12345', `+--1-5', `<;>a-c-a')
     =><;>abcba
     translit(`abcdef', `aabdef', `bcged')
     =>bgced

   In the ASCII encoding, 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, even though they are not
portable to EBCDIC or other encodings.  The fourth example shows a range
ending in '-', as well as back-to-back ranges.  The final example shows
that 'a' is mapped to 'b', not 'c'; the resulting 'b' is not further
remapped to 'g'; the 'd' and 'e' are swapped, and the 'f' is discarded.

   Omitting CHARS evokes a warning, but still produces output.

     translit(`abc')
     error->m4:stdin:1: Warning: too few arguments to builtin `translit'
     =>abc


File: m4.info,  Node: Patsubst,  Next: Format,  Prev: Translit,  Up: Text handling

11.6 Substituting text by regular expression
============================================

Global substitution in a string is done by 'patsubst':

 -- Builtin: patsubst (STRING, REGEXP, [REPLACEMENT]
     Searches STRING for matches of REGEXP, and substitutes REPLACEMENT
     for each match.  The syntax for regular expressions is the same as
     in GNU Emacs (*note Regexp::).

     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 PATSUBST, for up to nine
     sub-expressions.  The escape '\&' is replaced by the text of the
     entire regular expression matched.  For all other characters, '\'
     treats the next character literally.  A warning is issued if there
     were fewer sub-expressions than the '\N' requested, or if there is
     a trailing '\'.

     The REPLACEMENT argument can be omitted, in which case the text
     matched by REGEXP is deleted.

     The macro 'patsubst' is recognized only with parameters.

     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 
     patsubst(`GNUs not Unix', `not', `NOT\')
     error->m4:stdin:6: Warning: trailing \ ignored in replacement
     =>GNUs NOT Unix

   Here is a slightly more realistic example, which capitalizes
individual words or whole sentences, by substituting calls of the macros
'upcase' and 'downcase' into the strings.

 -- Composite: upcase (TEXT)
 -- Composite: downcase (TEXT)
 -- Composite: capitalize (TEXT)
     Expand to TEXT, but with capitalization changed: 'upcase' changes
     all letters to upper case, 'downcase' changes all letters to lower
     case, and 'capitalize' changes the first character of each word to
     upper case and the remaining characters to lower case.

   First, an example of their usage, using implementations distributed
in 'm4-1.4.17/examples/capitalize.m4'.

     $ m4 -I examples
     include(`capitalize.m4')
     =>
     upcase(`GNUs not Unix')
     =>GNUS NOT UNIX
     downcase(`GNUs not Unix')
     =>gnus not unix
     capitalize(`GNUs not Unix')
     =>Gnus Not Unix

   Now for the implementation.  There is a helper macro '_capitalize'
which puts only its first word in mixed case.  Then 'capitalize' merely
parses out the words, and replaces them with an invocation of
'_capitalize'.  (As presented here, the 'capitalize' macro has some
subtle flaws.  You should try to see if you can find and correct them;
or *note Answers: Improved capitalize.).

     $ m4 -I examples
     undivert(`capitalize.m4')dnl
     =>divert(`-1')
     =># upcase(text)
     =># downcase(text)
     =># capitalize(text)
     =>#   change case of text, simple version
     =>define(`upcase', `translit(`$*', `a-z', `A-Z')')
     =>define(`downcase', `translit(`$*', `A-Z', `a-z')')
     =>define(`_capitalize',
     =>       `regexp(`$1', `^\(\w\)\(\w*\)',
     =>               `upcase(`\1')`'downcase(`\2')')')
     =>define(`capitalize', `patsubst(`$1', `\w+', `_$0(`\&')')')
     =>divert`'dnl

   While 'regexp' replaces the whole input with the replacement as soon
as there is a match, 'patsubst' replaces each _occurrence_ of a match
and preserves non-matching pieces:

     define(`patreg',
     `patsubst($@)
     regexp($@)')dnl
     patreg(`bar foo baz Foo', `foo\|Foo', `FOO')
     =>bar FOO baz FOO
     =>FOO
     patreg(`aba abb 121', `\(.\)\(.\)\1', `\2\1\2')
     =>bab abb 212
     =>bab

   Omitting REGEXP evokes a warning, but still produces output; contrast
this with an empty REGEXP argument.

     patsubst(`abc')
     error->m4:stdin:1: Warning: too few arguments to builtin `patsubst'
     =>abc
     patsubst(`abc', `')
     =>abc
     patsubst(`abc', `', `\\-')
     =>\-a\-b\-c\-


File: m4.info,  Node: Format,  Prev: Patsubst,  Up: Text handling

11.7 Formatting strings (printf-like)
=====================================

Formatted output can be made with 'format':

 -- Builtin: format (FORMAT-STRING, ...)
     Works much like the C function 'printf'.  The first argument
     FORMAT-STRING can contain '%' specifications which are satisfied by
     additional arguments, and the expansion of 'format' is the
     formatted string.

     The macro 'format' is recognized only with parameters.

   Its use is best described by a few examples:

     define(`foo', `The brown fox jumped over the lazy dog')
     =>
     format(`The string "%s" uses %d characters', foo, len(foo))
     =>The string "The brown fox jumped over the lazy dog" uses 38 characters
     format(`%*.*d', `-1', `-1', `1')
     =>1
     format(`%.0f', `56789.9876')
     =>56790
     len(format(`%-*X', `5000', `1'))
     =>5000
     ifelse(format(`%010F', `infinity'), `       INF', `success',
            format(`%010F', `infinity'), `  INFINITY', `success',
            format(`%010F', `infinity'))
     =>success
     ifelse(format(`%.1A', `1.999'), `0X1.0P+1', `success',
            format(`%.1A', `1.999'), `0X2.0P+0', `success',
            format(`%.1A', `1.999'))
     =>success
     format(`%g', `0xa.P+1')
     =>20

   Using the 'forloop' macro defined earlier (*note Forloop::), this
example shows how 'format' can be used to produce tabular output.

     $ m4 -I examples
     include(`forloop.m4')
     =>
     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 these '%' specifiers: 'c', 's', 'd', 'o', 'x', 'X', 'u',
'a', 'A', 'e', 'E', 'f', 'F', 'g', 'G', and '%'; it supports field
widths and precisions, and the flags '+', '-', ' ', '0', '#', and '''.
For integer specifiers, the width modifiers 'hh', 'h', and 'l' are
recognized, and for floating point specifiers, the width modifier 'l' is
recognized.  Items not yet supported include positional arguments, the
'n', 'p', 'S', and 'C' specifiers, the 'z', 't', 'j', 'L' and 'll'
modifiers, and any platform extensions available in the native 'printf'.
For more details on the functioning of 'printf', see the C Library
Manual, or the POSIX specification (for example, '%a' is supported even
on platforms that haven't yet implemented C99 hexadecimal floating point
output natively).

   Unrecognized specifiers result in a warning.  It is anticipated that
a future release of GNU 'm4' will support more specifiers, and give
better warnings when various problems such as overflow are encountered.
Likewise, escape sequences are not yet recognized.

     format(`%p', `0')
     error->m4:stdin:1: Warning: unrecognized specifier in `%p'
     =>


File: m4.info,  Node: Arithmetic,  Next: Shell commands,  Prev: Text handling,  Up: Top

12 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,  Up: Arithmetic

12.1 Decrement and increment operators
======================================

Increment and decrement of integers are supported using the builtins
'incr' and 'decr':

 -- Builtin: incr (NUMBER)
 -- Builtin: decr (NUMBER)
     Expand to the numerical value of NUMBER, incremented or
     decremented, respectively, by one.  Except for the empty string,
     the expansion is empty if NUMBER could not be parsed.

     The macros 'incr' and 'decr' are recognized only with parameters.

     incr(`4')
     =>5
     decr(`7')
     =>6
     incr()
     error->m4:stdin:3: empty string treated as 0 in builtin `incr'
     =>1
     decr()
     error->m4:stdin:4: empty string treated as 0 in builtin `decr'
     =>-1


File: m4.info,  Node: Eval,  Prev: Incr,  Up: Arithmetic

12.2 Evaluating integer expressions
===================================

Integer expressions are evaluated with 'eval':

 -- Builtin: eval (EXPRESSION, [RADIX = '10']
     Expands to the value of EXPRESSION.  The expansion is empty if a
     problem is encountered while parsing the arguments.  If specified,
     RADIX and WIDTH control the format of the output.

     Calculations are done with 32-bit signed numbers.  Overflow
     silently results in wraparound.  A warning is issued if division by
     zero is attempted, or if EXPRESSION could not be parsed.

     Expressions can contain the following operators, listed in order of
     decreasing precedence.

     '()'
          Parentheses
     '+ - ~ !'
          Unary plus and minus, and bitwise and logical negation
     '**'
          Exponentiation
     '* / %'
          Multiplication, division, and modulo
     '+ -'
          Addition and subtraction
     '<< >>'
          Shift left or right
     '> >= < <='
          Relational operators
     '== !='
          Equality operators
     '&'
          Bitwise and
     '^'
          Bitwise exclusive-or
     '|'
          Bitwise or
     '&&'
          Logical and
     '||'
          Logical or

     The macro 'eval' is recognized only with parameters.

   All binary operators, except exponentiation, are left associative.  C
operators that perform variable assignment, such as '+=' or '--', are
not implemented, since 'eval' only operates on constants, not variables.
Attempting to use them results in an error.  However, since traditional
implementations treated '=' as an undocumented alias for '==' as opposed
to an assignment operator, this usage is supported as a special case.
Be aware that a future version of GNU M4 may support assignment
semantics as an extension when POSIX mode is not requested, and that
using '=' to check equality is not portable.

     eval(`2 = 2')
     error->m4:stdin:1: Warning: recommend ==, not =, for equality operator
     =>1
     eval(`++0')
     error->m4:stdin:2: invalid operator in eval: ++0
     =>
     eval(`0 |= 1')
     error->m4:stdin:3: invalid operator in eval: 0 |= 1
     =>

   Note that some older 'm4' implementations use '^' as an alternate
operator for the exponentiation, although POSIX requires the C behavior
of bitwise exclusive-or.  The precedence of the negation operators, '~'
and '!', was traditionally lower than equality.  The unary operators
could not be used reliably more than once on the same term without
intervening parentheses.  The traditional precedence of the equality
operators '==' and '!=' was identical instead of lower than the
relational operators such as '<', even through GNU M4 1.4.8.  Starting
with version 1.4.9, GNU M4 correctly follows POSIX precedence rules.  M4
scripts designed to be portable between releases must be aware that
parentheses may be required to enforce C precedence rules.  Likewise,
division by zero, even in the unused branch of a short-circuiting
operator, is not always well-defined in other implementations.

   Following are some examples where the current version of M4 follows C
precedence rules, but where older versions and some other
implementations of 'm4' require explicit parentheses to get the correct
result:

     eval(`1 == 2 > 0')
     =>1
     eval(`(1 == 2) > 0')
     =>0
     eval(`! 0 * 2')
     =>2
     eval(`! (0 * 2)')
     =>1
     eval(`1 | 1 ^ 1')
     =>1
     eval(`(1 | 1) ^ 1')
     =>0
     eval(`+ + - ~ ! ~ 0')
     =>1
     eval(`2 || 1 / 0')
     =>1
     eval(`0 || 1 / 0')
     error->m4:stdin:9: divide by zero in eval: 0 || 1 / 0
     =>
     eval(`0 && 1 % 0')
     =>0
     eval(`2 && 1 % 0')
     error->m4:stdin:11: modulo by zero in eval: 2 && 1 % 0
     =>

   As a GNU extension, the operator '**' performs integral
exponentiation.  The operator is right-associative, and if evaluated,
the exponent must be non-negative, and at least one of the arguments
must be non-zero, or a warning is issued.

     eval(`2 ** 3 ** 2')
     =>512
     eval(`(2 ** 3) ** 2')
     =>64
     eval(`0 ** 1')
     =>0
     eval(`2 ** 0')
     =>1
     eval(`0 ** 0')
     =>
     error->m4:stdin:5: divide by zero in eval: 0 ** 0
     eval(`4 ** -2')
     error->m4:stdin:6: negative exponent in eval: 4 ** -2
     =>

   Within EXPRESSION, (but not RADIX or WIDTH), numbers without a
special prefix are decimal.  A simple '0' prefix introduces an octal
number.  '0x' introduces a hexadecimal number.  As GNU extensions, '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 radix 1, leading zeros are ignored, and all remaining
digits must be '1'; for all other radices, 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(`-99 / 10')
     =>-9
     eval(`-99 % 10')
     =>-9
     eval(`99 % -10')
     =>9
     eval(index(`Hello world', `llo') >= 0)
     =>1
     eval(`0r1:0111 + 0b100 + 0r3:12')
     =>12
     define(`square', `eval(`($1) ** 2')')
     =>
     square(`9')
     =>81
     square(square(`5')` + 1')
     =>676
     define(`foo', `666')
     =>
     eval(`foo / 6')
     error->m4:stdin:11: bad expression in eval: foo / 6
     =>
     eval(foo / 6)
     =>111

   As the last two lines show, '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'.

   Some calculations are not portable to other implementations, since
they have undefined semantics in C, but GNU 'm4' has well-defined
behavior on overflow.  When shifting, an out-of-range shift amount is
implicitly brought into the range of 32-bit signed integers using an
implicit bit-wise and with 0x1f).

     define(`max_int', eval(`0x7fffffff'))
     =>
     define(`min_int', incr(max_int))
     =>
     eval(min_int` < 0')
     =>1
     eval(max_int` > 0')
     =>1
     ifelse(eval(min_int` / -1'), min_int, `overflow occurred')
     =>overflow occurred
     min_int
     =>-2147483648
     eval(`0x80000000 % -1')
     =>0
     eval(`-4 >> 1')
     =>-2
     eval(`-4 >> 33')
     =>-2

   If RADIX is specified, it specifies the radix to be used in the
expansion.  The default radix is 10; this is also the case if RADIX is
the empty string.  A warning results if the radix is outside the range
of 1 through 36, inclusive.  The result of 'eval' is always taken to be
signed.  No radix prefix is output, and for radices greater than 10, the
digits are lower case.  The WIDTH argument specifies the minimum output
width, excluding any negative sign.  The result is zero-padded to extend
the expansion to the requested width.  A warning results if the width is
negative.  If RADIX or WIDTH is out of bounds, the expansion of 'eval'
is empty.

     eval(`666', `10')
     =>666
     eval(`666', `11')
     =>556
     eval(`666', `6')
     =>3030
     eval(`666', `6', `10')
     =>0000003030
     eval(`-666', `6', `10')
     =>-0000003030
     eval(`10', `', `0')
     =>10
     `0r1:'eval(`10', `1', `11')
     =>0r1:01111111111
     eval(`10', `16')
     =>a
     eval(`1', `37')
     error->m4:stdin:9: radix 37 in builtin `eval' out of range
     =>
     eval(`1', , `-1')
     error->m4:stdin:10: negative width to builtin `eval'
     =>
     eval()
     error->m4:stdin:11: empty string treated as 0 in builtin `eval'
     =>0


File: m4.info,  Node: Shell commands,  Next: Miscellaneous,  Prev: Arithmetic,  Up: Top

13 Macros for running shell commands
************************************

There are a few builtin macros in 'm4' that allow you to run shell
commands from within 'm4'.

   Note that the definition of a valid shell command is system
dependent.  On UNIX systems, this is the typical '/bin/sh'.  But on
other systems, such as native Windows, the shell has a different syntax
of commands that it understands.  Some examples in this chapter assume
'/bin/sh', and also demonstrate how to quit early with a known exit
value if this is not the case.

* Menu:

* Platform macros::             Determining the platform
* Syscmd::                      Executing simple commands
* Esyscmd::                     Reading the output of commands
* Sysval::                      Exit status
* Mkstemp::                     Making temporary files


File: m4.info,  Node: Platform macros,  Next: Syscmd,  Up: Shell commands

13.1 Determining the platform
=============================

Sometimes it is desirable for an input file to know which platform 'm4'
is running on.  GNU 'm4' provides several macros that are predefined to
expand to the empty string; checking for their existence will confirm
platform details.

 -- Optional builtin: __gnu__
 -- Optional builtin: __os2__
 -- Optional builtin: os2
 -- Optional builtin: __unix__
 -- Optional builtin: unix
 -- Optional builtin: __windows__
 -- Optional builtin: windows
     Each of these macros is conditionally defined as needed to describe
     the environment of 'm4'.  If defined, each macro expands to the
     empty string.  For now, these macros silently ignore all arguments,
     but in a future release of M4, they might warn if arguments are
     present.

   When GNU extensions are in effect (that is, when you did not use the
'-G' option, *note Invoking m4: Limits control.), GNU 'm4' will define
the macro '__gnu__' to expand to the empty string.

     $ m4
     __gnu__
     =>
     __gnu__(`ignored')
     =>
     Extensions are ifdef(`__gnu__', `active', `inactive')
     =>Extensions are active

     $ m4 -G
     __gnu__
     =>__gnu__
     __gnu__(`ignored')
     =>__gnu__(ignored)
     Extensions are ifdef(`__gnu__', `active', `inactive')
     =>Extensions are inactive

   On UNIX systems, GNU 'm4' will define '__unix__' by default, or
'unix' when the '-G' option is specified.

   On native Windows systems, GNU 'm4' will define '__windows__' by
default, or 'windows' when the '-G' option is specified.

   On OS/2 systems, GNU 'm4' will define '__os2__' by default, or 'os2'
when the '-G' option is specified.

   If GNU 'm4' does not provide a platform macro for your system, please
report that as a bug.

     define(`provided', `0')
     =>
     ifdef(`__unix__', `define(`provided', incr(provided))')
     =>
     ifdef(`__windows__', `define(`provided', incr(provided))')
     =>
     ifdef(`__os2__', `define(`provided', incr(provided))')
     =>
     provided
     =>1


File: m4.info,  Node: Syscmd,  Next: Esyscmd,  Prev: Platform macros,  Up: Shell commands

13.2 Executing simple commands
==============================

Any shell command can be executed, using 'syscmd':

 -- Builtin: syscmd (SHELL-COMMAND)
     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 buffers.  The
     default standard input, output and error of SHELL-COMMAND are the
     same as those of 'm4'.

     By default, the SHELL-COMMAND will be used as the argument to the
     '-c' option of the '/bin/sh' shell (or the version of 'sh'
     specified by 'command -p getconf PATH', if your system supports
     that).  If you prefer a different shell, the 'configure' script can
     be given the option '--with-syscmd-shell=LOCATION' to set the
     location of an alternative shell at GNU 'm4' installation; the
     alternative shell must still support '-c'.

     The macro 'syscmd' is recognized only with parameters.

     define(`foo', `FOO')
     =>
     syscmd(`echo foo')
     =>foo
     =>

   Note how the expansion of 'syscmd' keeps the trailing newline of the
command, as well as using the newline that appeared after the macro.

   The following is an example of SHELL-COMMAND using the same standard
input as 'm4':

     $ echo "m4wrap(\`syscmd(\`cat')')" | m4
     =>

   It tells 'm4' to read all of its input before executing the wrapped
text, then hand a valid (albeit emptied) pipe as standard input for the
'cat' subcommand.  Therefore, you should be careful when using standard
input (either by specifying no files, or by passing '-' as a file name
on the command line, *note Invoking m4: Command line files.), and also
invoking subcommands via 'syscmd' or 'esyscmd' that consume data from
standard input.  When standard input is a seekable file, the subprocess
will pick up with the next character not yet processed by 'm4'; when it
is a pipe or other non-seekable file, there is no guarantee how much
data will already be buffered by 'm4' and thus unavailable to the child.


File: m4.info,  Node: Esyscmd,  Next: Sysval,  Prev: Syscmd,  Up: Shell commands

13.3 Reading the output of commands
===================================

If you want 'm4' to read the output of a shell command, use 'esyscmd':

 -- Builtin: esyscmd (SHELL-COMMAND)
     Expands to the standard output of the shell command SHELL-COMMAND.

     Prior to executing the command, 'm4' flushes its buffers.  The
     default standard input and standard error 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'.

     By default, the SHELL-COMMAND will be used as the argument to the
     '-c' option of the '/bin/sh' shell (or the version of 'sh'
     specified by 'command -p getconf PATH', if your system supports
     that).  If you prefer a different shell, the 'configure' script can
     be given the option '--with-syscmd-shell=LOCATION' to set the
     location of an alternative shell at GNU 'm4' installation; the
     alternative shell must still support '-c'.

     The macro 'esyscmd' is recognized only with parameters.

     define(`foo', `FOO')
     =>
     esyscmd(`echo foo')
     =>FOO
     =>

   Note how the expansion of 'esyscmd' keeps the trailing newline of the
command, as well as using the newline that appeared after the macro.

   Just as with 'syscmd', care must be exercised when sharing standard
input between 'm4' and the child process of 'esyscmd'.


File: m4.info,  Node: Sysval,  Next: Mkstemp,  Prev: Esyscmd,  Up: Shell commands

13.4 Exit status
================

To see whether a shell command succeeded, use 'sysval':

 -- Builtin: sysval
     Expands to the exit status of the last shell command run with
     'syscmd' or 'esyscmd'.  Expands to 0 if no command has been run
     yet.

     sysval
     =>0
     syscmd(`false')
     =>
     ifelse(sysval, `0', `zero', `non-zero')
     =>non-zero
     syscmd(`exit 2')
     =>
     sysval
     =>2
     syscmd(`true')
     =>
     sysval
     =>0
     esyscmd(`false')
     =>
     ifelse(sysval, `0', `zero', `non-zero')
     =>non-zero
     esyscmd(`echo dnl && exit 127')
     =>
     sysval
     =>127
     esyscmd(`true')
     =>
     sysval
     =>0

   'sysval' results in 127 if there was a problem executing the command,
for example, if the system-imposed argument length is exceeded, or if
there were not enough resources to fork.  It is not possible to
distinguish between failed execution and successful execution that had
an exit status of 127, unless there was output from the child process.

   On UNIX platforms, where it is possible to detect when command
execution is terminated by a signal, rather than a normal exit, the
result is the signal number shifted left by eight bits.

     dnl This test assumes kill is a shell builtin, and that signals are
     dnl recognizable.
     ifdef(`__unix__', ,
           `errprint(` skipping: syscmd does not have unix semantics
     ')m4exit(`77')')dnl
     syscmd(`kill -9 $$')
     =>
     sysval
     =>2304
     syscmd()
     =>
     sysval
     =>0
     esyscmd(`kill -9 $$')
     =>
     sysval
     =>2304


File: m4.info,  Node: Mkstemp,  Prev: Sysval,  Up: Shell commands

13.5 Making 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,
'mkstemp', for making a temporary file:

 -- Builtin: mkstemp (TEMPLATE)
 -- Builtin: maketemp (TEMPLATE)
     Expands to the quoted name of a new, empty file, made from the
     string TEMPLATE, which should end with the string 'XXXXXX'.  The
     six 'X' characters are then replaced with random characters
     matching the regular expression '[a-zA-Z0-9._-]', in order to make
     the file name unique.  If fewer than six 'X' characters are found
     at the end of 'template', the result will be longer than the
     template.  The created file will have access permissions as if by
     'chmod =rw,go=', meaning that the current umask of the 'm4' process
     is taken into account, and at most only the current user can read
     and write the file.

     The traditional behavior, standardized by POSIX, is that 'maketemp'
     merely replaces the trailing 'X' with the process id, without
     creating a file or quoting the expansion, and without ensuring that
     the resulting string is a unique file name.  In part, this means
     that using the same TEMPLATE twice in the same input file will
     result in the same expansion.  This behavior is a security hole, as
     it is very easy for another process to guess the name that will be
     generated, and thus interfere with a subsequent use of 'syscmd'
     trying to manipulate that file name.  Hence, POSIX has recommended
     that all new implementations of 'm4' provide the secure 'mkstemp'
     builtin, and that users of 'm4' check for its existence.

     The expansion is void and an error issued if a temporary file could
     not be created.

     The macros 'mkstemp' and 'maketemp' are recognized only with
     parameters.

   If you try this next example, you will most likely get different
output for the two file names, since the replacement characters are
randomly chosen:

     $ m4
     define(`tmp', `oops')
     =>
     maketemp(`/tmp/fooXXXXXX')
     =>/tmp/fooa07346
     ifdef(`mkstemp', `define(`maketemp', defn(`mkstemp'))',
           `define(`mkstemp', defn(`maketemp'))dnl
     errprint(`warning: potentially insecure maketemp implementation
     ')')
     =>
     mkstemp(`doc')
     =>docQv83Uw

   Unless you use the '--traditional' command line option (or '-G',
*note Invoking m4: Limits control.), the GNU version of 'maketemp' is
secure.  This means that using the same template to multiple calls will
generate multiple files.  However, we recommend that you use the new
'mkstemp' macro, introduced in GNU M4 1.4.8, which is secure even in
traditional mode.  Also, as of M4 1.4.11, the secure implementation
quotes the resulting file name, so that you are guaranteed to know what
file was created even if the random file name happens to match an
existing macro.  Notice that this example is careful to use 'defn' to
avoid unintended expansion of 'foo'.

     $ m4
     define(`foo', `errprint(`oops')')
     =>
     syscmd(`rm -f foo-??????')sysval
     =>0
     define(`file1', maketemp(`foo-XXXXXX'))dnl
     ifelse(esyscmd(`echo \` foo-?????? \''), ` foo-?????? ',
            `no file', `created')
     =>created
     define(`file2', maketemp(`foo-XX'))dnl
     define(`file3', mkstemp(`foo-XXXXXX'))dnl
     ifelse(len(defn(`file1')), len(defn(`file2')),
            `same length', `different')
     =>same length
     ifelse(defn(`file1'), defn(`file2'), `same', `different file')
     =>different file
     ifelse(defn(`file2'), defn(`file3'), `same', `different file')
     =>different file
     ifelse(defn(`file1'), defn(`file3'), `same', `different file')
     =>different file
     syscmd(`rm 'defn(`file1') defn(`file2') defn(`file3'))
     =>
     sysval
     =>0


File: m4.info,  Node: Miscellaneous,  Next: Frozen files,  Prev: Shell commands,  Up: Top

14 Miscellaneous builtin macros
*******************************

This chapter describes various builtins, that do not really belong in
any of the previous chapters.

* Menu:

* Errprint::                    Printing error messages
* Location::                    Printing current location
* M4exit::                      Exiting from 'm4'


File: m4.info,  Node: Errprint,  Next: Location,  Up: Miscellaneous

14.1 Printing error messages
============================

You can print error messages using 'errprint':

 -- Builtin: errprint (MESSAGE, ...)
     Prints MESSAGE and the rest of the arguments to standard error,
     separated by spaces.  Standard error is used, regardless of the
     '--debugfile' option (*note Invoking m4: Debugging options.).

     The expansion of 'errprint' is void.  The macro 'errprint' is
     recognized only with parameters.

     errprint(`Invalid arguments to forloop
     ')
     error->Invalid arguments to forloop
     =>
     errprint(`1')errprint(`2',`3
     ')
     error->12 3
     =>

   A trailing newline is _not_ printed automatically, so it should be
supplied as part of the argument, as in the example.  Unfortunately, the
exact output of 'errprint' is not very portable to other 'm4'
implementations: POSIX requires that all arguments be printed, but some
implementations of 'm4' only print the first.  Furthermore, some BSD
implementations always append a newline for each 'errprint' call,
regardless of whether the last argument already had one, and POSIX is
silent on whether this is acceptable.


File: m4.info,  Node: Location,  Next: M4exit,  Prev: Errprint,  Up: Miscellaneous

14.2 Printing current location
==============================

To make it possible to specify the location of an error, three utility
builtins exist:

 -- Builtin: __file__
 -- Builtin: __line__
 -- Builtin: __program__
     Expand to the quoted name of the current input file, the current
     input line number in that file, and the quoted name of the current
     invocation of 'm4'.

     errprint(__program__:__file__:__line__: `input error
     ')
     error->m4:stdin:1: input error
     =>

   Line numbers start at 1 for each file.  If the file was found due to
the '-I' option or 'M4PATH' environment variable, that is reflected in
the file name.  The syncline option ('-s', *note Invoking m4:
Preprocessor features.), and the 'f' and 'l' flags of 'debugmode' (*note
Debug Levels::), also use this notion of current file and line.
Redefining the three location macros has no effect on syncline, debug,
warning, or error message output.

   This example reuses the file 'incl.m4' mentioned earlier (*note
Include::):

     $ m4 -I examples
     define(`foo', ``$0' called at __file__:__line__')
     =>
     foo
     =>foo called at stdin:2
     include(`incl.m4')
     =>Include file start
     =>foo called at examples/incl.m4:2
     =>Include file end
     =>

   The location of macros invoked during the rescanning of macro
expansion text corresponds to the location in the file where the
expansion was triggered, regardless of how many newline characters the
expansion text contains.  As of GNU M4 1.4.8, the location of text
wrapped with 'm4wrap' (*note M4wrap::) is the point at which the
'm4wrap' was invoked.  Previous versions, however, behaved as though
wrapped text came from line 0 of the file "".

     define(`echo', `$@')
     =>
     define(`foo', `echo(__line__
     __line__)')
     =>
     echo(__line__
     __line__)
     =>4
     =>5
     m4wrap(`foo
     ')
     =>
     foo(errprint(__line__
     __line__
     ))
     error->8
     error->9
     =>8
     =>8
     __line__
     =>11
     m4wrap(`__line__
     ')
     =>
     ^D
     =>12
     =>6
     =>6

   The '__program__' macro behaves like '$0' in shell terminology.  If
you invoke 'm4' through an absolute path or a link with a different
spelling, rather than by relying on a 'PATH' search for plain 'm4', it
will affect how '__program__' expands.  The intent is that you can use
it to produce error messages with the same formatting that 'm4' produces
internally.  It can also be used within 'syscmd' (*note Syscmd::) to
pick the same version of 'm4' that is currently running, rather than
whatever version of 'm4' happens to be first in 'PATH'.  It was first
introduced in GNU M4 1.4.6.


File: m4.info,  Node: M4exit,  Prev: Location,  Up: Miscellaneous

14.3 Exiting from 'm4'
======================

If you need to exit from 'm4' before the entire input has been read, you
can use 'm4exit':

 -- Builtin: m4exit ([CODE = '0']
     Causes 'm4' to exit, with exit status CODE.  If CODE is left out,
     the exit status is zero.  If CODE cannot be parsed, or is outside
     the range of 0 to 255, the exit status is one.  No further input is
     read, and all wrapped and diverted text is discarded.

     m4wrap(`This text is lost due to `m4exit'.')
     =>
     divert(`1') So is this.
     divert
     =>
     m4exit And this is never read.

   A common use of this is to abort processing:

 -- Composite: fatal_error (MESSAGE)
     Abort processing with an error message and non-zero status.  Prefix
     MESSAGE with details about where the error occurred, and print the
     resulting string to standard error.

     define(`fatal_error',
            `errprint(__program__:__file__:__line__`: fatal error: $*
     ')m4exit(`1')')
     =>
     fatal_error(`this is a BAD one, buster')
     error->m4:stdin:4: fatal error: this is a BAD one, buster

   After this macro call, 'm4' will exit with exit status 1.  This macro
is only intended for error exits, since the normal exit procedures are
not followed, i.e., diverted text is not undiverted, and saved text
(*note M4wrap::) is not reread.  (This macro could be made more robust
to earlier versions of 'm4'.  You should try to see if you can find
weaknesses and correct them; or *note Answers: Improved fatal_error.).

   Note that it is still possible for the exit status to be different
than what was requested by 'm4exit'.  If 'm4' detects some other error,
such as a write error on standard output, the exit status will be
non-zero even if 'm4exit' requested zero.

   If standard input is seekable, then the file will be positioned at
the next unread character.  If it is a pipe or other non-seekable file,
then there are no guarantees how much data 'm4' might have read into
buffers, and thus discarded.


File: m4.info,  Node: Frozen files,  Next: Compatibility,  Prev: Miscellaneous,  Up: Top

15 Fast loading of frozen state
*******************************

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
each input file uses 'include'.

   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.

* Menu:

* Using frozen files::          Using frozen files
* Frozen file format::          Frozen file format


File: m4.info,  Node: Using frozen files,  Next: Frozen file format,  Up: Frozen files

15.1 Using frozen files
=======================

Suppose a user has a library of 'm4' initializations in 'base.m4', which
is then used with multiple input files:

     $ m4 base.m4 input1.m4
     $ m4 base.m4 input2.m4
     $ m4 base.m4 input3.m4

   Rather than spending time parsing the fixed contents of 'base.m4'
every time, the user might rather execute:

     $ m4 -F base.m4f base.m4

once, and further execute, as often as needed:

     $ m4 -R base.m4f input1.m4
     $ m4 -R base.m4f input2.m4
     $ m4 -R base.m4f input3.m4

with the varying input.  The first call, containing the '-F' option,
only reads and executes file 'base.m4', defining various application
macros and computing other initializations.  Once the input file
'base.m4' has been completely processed, GNU 'm4' produces in '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', from 'base.m4f', _prior_ to reading any other
input files.  This means 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'.  Currently,
'm4wrap' and 'sysval' also have problems.  Also, interactions for some
options of 'm4', being used in one call and not in the next, have not
been fully analyzed yet.  On the other end, you may be confident that
stacks of 'pushdef' definitions are handled correctly, as well as
undefined or renamed builtins, and changed strings for quotes or
comments.  And future releases of GNU M4 will improve on the utility of
frozen files.

   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::).

   If the frozen file was generated with a newer version of 'm4', and
contains directives that an older 'm4' cannot parse, attempting to load
the frozen file with option '-R' will cause 'm4' to exit with status 63
to indicate version mismatch.


File: m4.info,  Node: Frozen file format,  Prev: Using frozen files,  Up: Frozen files

15.2 Frozen file format
=======================

Frozen files are sharable across architectures.  It is safe to write a
frozen file on one machine and read it on another, given that the second
machine uses the same or newer version of GNU 'm4'.  It is conventional,
but not required, to give a frozen file the suffix of '.m4f'.

   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 if they are not part of an embedded
string.  In the following descriptions, each LEN refers to the length of
the corresponding strings STR in the next line of input.  Numbers are
always expressed in decimal.  There are no escape characters.  The
directives are:

'C LEN1 , LEN2 <NL> STR1 STR2 <NL>'
     Uses STR1 and STR2 as the begin-comment and end-comment strings.
     If omitted, then '#' and <NL> are the comment delimiters.

'D NUMBER, LEN <NL> STR <NL>'
     Selects diversion NUMBER, making it current, then copy STR 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 STR.  With 0 as the diversion NUMBER,
     STR will be issued on standard output at reload time.  GNU 'm4'
     will not produce the 'D' directive with non-zero length for
     diversion 0, but this can be done with manual edits.  This
     directive may appear more than once for the same diversion, in
     which case the diversion is the concatenation of the various uses.
     If omitted, then diversion 0 is current.

'F LEN1 , LEN2 <NL> STR1 STR2 <NL>'
     Defines, through 'pushdef', a definition for STR1 expanding to the
     function whose builtin name is STR2.  If the builtin does not exist
     (for example, if the frozen file was produced by a copy of 'm4'
     compiled with changeword support, but the version of 'm4' reloading
     was compiled without it), the reload is silent, but any subsequent
     use of the definition of STR1 will result in a warning.  This
     directive may appear more than once for the same name, and its
     order, along with 'T', is important.  If omitted, you will have no
     access to any builtins.

'Q LEN1 , LEN2 <NL> STR1 STR2 <NL>'
     Uses STR1 and STR2 as the begin-quote and end-quote strings.  If
     omitted, then '`' and ''' are the quote delimiters.

'T LEN1 , LEN2 <NL> STR1 STR2 <NL>'
     Defines, though 'pushdef', a definition for STR1 expanding to the
     text given by STR2.  This directive may appear more than once for
     the same name, and its order, along with 'F', is important.

'V NUMBER <NL>'
     Confirms the format of the file.  'm4' 1.4.17 only creates and
     understands frozen files where NUMBER is 1.  This directive must be
     the first non-comment in the file, and may not appear more than
     once.


File: m4.info,  Node: Compatibility,  Next: Answers,  Prev: Frozen files,  Up: Top

16 Compatibility with other versions of 'm4'
********************************************

This chapter describes the many of the differences between this
implementation of 'm4', and of other implementations found under UNIX,
such as System V Release 4, Solaris, and BSD flavors.  In particular, it
lists the known differences and extensions to POSIX. However, the list
is not necessarily comprehensive.

   At the time of this writing, POSIX 2001 (also known as IEEE Std
1003.1-2001) is the latest standard, although a new version of POSIX is
under development and includes several proposals for modifying what 'm4'
is required to do.  The requirements for 'm4' are shared between SUSv3
and POSIX, and can be viewed at
<http://www.opengroup.org/onlinepubs/000095399/utilities/m4.html>.

* Menu:

* Extensions::                  Extensions in GNU M4
* Incompatibilities::           Facilities in System V m4 not in GNU M4
* Other Incompatibilities::     Other incompatibilities


File: m4.info,  Node: Extensions,  Next: Incompatibilities,  Up: Compatibility

16.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 (*note Invoking m4: Limits control.), 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::).

     This means that 'define(`foo', `$11')' is ambiguous between
     implementations.  To portably choose between grabbing the first
     parameter and appending 1 to the expansion, or grabbing the
     eleventh parameter, you can do the following:

          define(`a1', `A1')
          =>
          dnl First argument, concatenated with 1
          define(`_1', `$1')define(`first1', `_1($@)1')
          =>
          dnl Eleventh argument, portable
          define(`_9', `$9')define(`eleventh', `_9(shift(shift($@)))')
          =>
          dnl Eleventh argument, GNU style
          define(`Eleventh', `$11')
          =>
          first1(`a', `b', `c', `d', `e', `f', `g', `h', `i', `j', `k')
          =>A1
          eleventh(`a', `b', `c', `d', `e', `f', `g', `h', `i', `j', `k')
          =>k
          Eleventh(`a', `b', `c', `d', `e', `f', `g', `h', `i', `j', `k')
          =>k

     Also see the 'argn' macro (*note Shift::).

   * The 'divert' (*note Divert::) macro can manage more than 9
     diversions.  GNU 'm4' treats all positive numbers as valid
     diversions, rather than discarding diversions greater than 9.

   * 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 basic regular expressions
     are supported by the 'regexp' (*note Regexp::) and 'patsubst'
     (*note Patsubst::) builtins.  Some BSD implementations use extended
     regular expressions instead.

   * 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 program, the current input file, and the current
     input line number are accessible through the builtins
     '__program__', '__file__', and '__line__' (*note Location::).

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

   * The 'maketemp' (*note Mkstemp::) macro behaves like 'mkstemp',
     creating a new file with a unique name on every invocation, rather
     than following the insecure behavior of replacing the trailing 'X'
     characters with the 'm4' process id.

   * POSIX only requires support for the command line options '-s',
     '-D', and '-U', so all other options accepted by GNU M4 are
     extensions.  *Note Invoking m4::, for a description of these
     options.

     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 Incompatibilities,  Prev: Extensions,  Up: Compatibility

16.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.  Additionally, POSIX requires some
behaviors that GNU 'm4' has not implemented yet.  Relying on these
behaviors is non-portable, as a future release of GNU 'm4' may change.

   * POSIX requires support for multiple arguments to 'defn', without
     any clarification on how 'defn' behaves when one of the multiple
     arguments names a builtin.  System V 'm4' and some other
     implementations allow mixing builtins and text macros into a single
     macro.  GNU 'm4' only supports joining multiple text arguments,
     although a future implementation may lift this restriction to
     behave more like System V.  The only portable way to join text
     macros with builtins is via helper macros and implicit
     concatenation of macro results.

   * POSIX requires an application to exit with non-zero status if it
     wrote an error message to stderr.  This has not yet been
     consistently implemented for the various builtins that are required
     to issue an error (such as 'eval' (*note Eval::) when an argument
     cannot be parsed).

   * Some traditional implementations only allow reading standard input
     once, but GNU 'm4' correctly handles multiple instances of '-' on
     the command line.

   * POSIX requires 'm4wrap' (*note M4wrap::) to act in FIFO (first-in,
     first-out) order, but GNU 'm4' currently uses LIFO order.
     Furthermore, POSIX states that only the first argument to 'm4wrap'
     is saved for later evaluation, but GNU 'm4' saves and processes all
     arguments, with output separated by spaces.

   * POSIX states that builtins that require arguments, but are called
     without arguments, have undefined behavior.  Traditional
     implementations simply behave as though empty strings had been
     passed.  For example, 'a`'define`'b' would expand to 'ab'.  But GNU
     'm4' ignores certain builtins if they have missing arguments,
     giving 'adefineb' for the above example.

   * Traditional implementations handle 'define(`f',`1')' (*note
     Define::) by undefining the entire stack of previous definitions,
     and if doing 'undefine(`f')' first.  GNU 'm4' replaces just the top
     definition on the stack, as if doing 'popdef(`f')' followed by
     'pushdef(`f',`1')'.  POSIX allows either behavior.

   * POSIX 2001 requires 'syscmd' (*note Syscmd::) to evaluate command
     output for macro expansion, but this was a mistake that is
     anticipated to be corrected in the next version of POSIX. GNU 'm4'
     follows traditional behavior in 'syscmd' where output is not
     rescanned, and provides the extension 'esyscmd' that does scan the
     output.

   * At one point, POSIX required 'changequote(ARG)' (*note
     Changequote::) to use newline as the close quote, but this was a
     bug, and the next version of POSIX is anticipated to state that
     using empty strings or just one argument is unspecified.
     Meanwhile, the GNU 'm4' behavior of treating an empty end-quote
     delimiter as ''' is not portable, as Solaris treats it as repeating
     the start-quote delimiter, and BSD treats it as leaving the
     previous end-quote delimiter unchanged.  For predictable results,
     never call changequote with just one argument, or with empty
     strings for arguments.

   * At one point, POSIX required 'changecom(ARG,)' (*note Changecom::)
     to make it impossible to end a comment, but this is a bug, and the
     next version of POSIX is anticipated to state that using empty
     strings is unspecified.  Meanwhile, the GNU 'm4' behavior of
     treating an empty end-comment delimiter as newline is not portable,
     as BSD treats it as leaving the previous end-comment delimiter
     unchanged.  It is also impossible in BSD implementations to disable
     comments, even though that is required by POSIX. For predictable
     results, never call changecom with empty strings for arguments.

   * Most implementations of 'm4' give macros a higher precedence than
     comments when parsing, meaning that if the start delimiter given to
     'changecom' (*note Changecom::) starts with a macro name, comments
     are effectively disabled.  POSIX does not specify what the
     precedence is, so this version of GNU 'm4' parser recognizes
     comments, then macros, then quoted strings.

   * Traditional implementations allow argument collection, but not
     string and comment processing, to span file boundaries.  Thus, if
     'a.m4' contains 'len(', and 'b.m4' contains 'abc)', 'm4 a.m4 b.m4'
     outputs '3' with traditional 'm4', but gives an error message that
     the end of file was encountered inside a macro with GNU 'm4'.  On
     the other hand, traditional implementations do end of file
     processing for files included with 'include' or 'sinclude' (*note
     Include::), while GNU 'm4' seamlessly integrates the content of
     those files.  Thus 'include(`a.m4')include(`b.m4')' will output '3'
     instead of giving an error.

   * Traditional 'm4' treats 'traceon' (*note Trace::) without arguments
     as a global variable, independent of named macro tracing.  Also,
     once a macro is undefined, named tracing of that macro is lost.  On
     the other hand, when GNU 'm4' encounters 'traceon' without
     arguments, it turns tracing on for all existing definitions at the
     time, but does not trace future definitions; 'traceoff' without
     arguments turns tracing off for all definitions regardless of
     whether they were also traced by name; and tracing by name, such as
     with '-tfoo' at the command line or 'traceon(`foo')' in the input,
     is an attribute that is preserved even if the macro is currently
     undefined.

     Additionally, while POSIX requires trace output, it makes no
     demands on the formatting of that output.  Parsing trace output is
     not guaranteed to be reliable, even between different releases of
     GNU M4; however, the intent is that any future changes in trace
     output will only occur under the direction of additional
     'debugmode' flags (*note Debug Levels::).

   * POSIX requires 'eval' (*note Eval::) to treat all operators with
     the same precedence as C.  However, earlier versions of GNU 'm4'
     followed the traditional behavior of other 'm4' implementations,
     where bitwise and logical negation ('~' and '!') have lower
     precedence than equality operators; and where equality operators
     ('==' and '!=') had the same precedence as relational operators
     (such as '<').  Use explicit parentheses to ensure proper
     precedence.  As extensions to POSIX, GNU 'm4' gives well-defined
     semantics to operations that C leaves undefined, such as when
     overflow occurs, when shifting negative numbers, or when performing
     division by zero.  POSIX also requires '=' to cause an error, but
     many traditional implementations allowed it as an alias for '=='.

   * POSIX 2001 requires 'translit' (*note Translit::) to treat each
     character of the second and third arguments literally.  However, it
     is anticipated that the next version of POSIX will allow the GNU
     'm4' behavior of treating '-' as a range operator.

   * POSIX requires 'm4' to honor the locale environment variables of
     'LANG', 'LC_ALL', 'LC_CTYPE', 'LC_MESSAGES', and 'NLSPATH', but
     this has not yet been implemented in GNU 'm4'.

   * POSIX states that only unquoted leading newlines and blanks (that
     is, space and tab) are ignored when collecting macro arguments.
     However, this appears to be a bug in POSIX, since most traditional
     implementations also ignore all whitespace (formfeed, carriage
     return, and vertical tab).  GNU 'm4' follows tradition and ignores
     all leading unquoted whitespace.

   * A strictly-compliant POSIX client is not allowed to use
     command-line arguments not specified by POSIX. However, since this
     version of M4 ignores 'POSIXLY_CORRECT' and enables the option
     '--gnu' by default (*note Invoking m4: Limits control.), a client
     desiring to be strictly compliant has no way to disable GNU
     extensions that conflict with POSIX when directly invoking the
     compiled 'm4'.  A future version of 'GNU' M4 will honor the
     environment variable 'POSIXLY_CORRECT', implicitly enabling
     '--traditional' if it is set, in order to allow a
     strictly-compliant client.  In the meantime, a client needing
     strict POSIX compliance can use the workaround of invoking a shell
     script wrapper, where the wrapper then adds '--traditional' to the
     arguments passed to the compiled 'm4'.


File: m4.info,  Node: Other Incompatibilities,  Prev: Incompatibilities,  Up: Compatibility

16.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 file names 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.

     The sync line option is 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 was made, and not where it was inserted again.

          divert(2)2
          divert(1)1
          divert`'0
          =>#line 3 "stdin"
          =>0
          ^D
          =>#line 2 "stdin"
          =>1
          =>#line 1 "stdin"
          =>2

     The current 'm4' implementation has a limitation that the syncline
     output at the start of each diversion occurs no matter what, even
     if the previous diversion did not end with a newline.  This goes
     contrary to the claim that synclines appear on a line by
     themselves, so this limitation may be corrected in a future version
     of 'm4'.  In the meantime, when using '-s', it is wisest to make
     sure all diversions end with newline.

   * GNU 'm4' makes no attempt at prohibiting self-referential
     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, because that would cause
     an infinite rescan loop.  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 leaves 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.


File: m4.info,  Node: Answers,  Next: Copying This Package,  Prev: Compatibility,  Up: Top

17 Correct version of some examples
***********************************

Some of the examples in this manuals are buggy or not very robust, for
demonstration purposes.  Improved versions of these composite macros are
presented here.

* Menu:

* Improved exch::               Solution for 'exch'
* Improved forloop::            Solution for 'forloop'
* Improved foreach::            Solution for 'foreach'
* Improved copy::               Solution for 'copy'
* Improved m4wrap::             Solution for 'm4wrap'
* Improved cleardivert::        Solution for 'cleardivert'
* Improved capitalize::         Solution for 'capitalize'
* Improved fatal_error::        Solution for 'fatal_error'


File: m4.info,  Node: Improved exch,  Next: Improved forloop,  Up: Answers

17.1 Solution for 'exch'
========================

The 'exch' macro (*note Arguments::) as presented requires clients to
double quote their arguments.  A nicer definition, which lets clients
follow the rule of thumb of one level of quoting per level of
parentheses, involves adding quotes in the definition of 'exch', as
follows:

     define(`exch', ``$2', `$1'')
     =>
     define(exch(`expansion text', `macro'))
     =>
     macro
     =>expansion text


File: m4.info,  Node: Improved forloop,  Next: Improved foreach,  Prev: Improved exch,  Up: Answers

17.2 Solution for 'forloop'
===========================

The 'forloop' macro (*note Forloop::) as presented earlier can go into
an infinite loop if given an iterator that is not parsed as a macro
name.  It does not do any sanity checking on its numeric bounds, and
only permits decimal numbers for bounds.  Here is an improved version,
shipped as 'm4-1.4.17/examples/forloop2.m4'; this version also optimizes
overhead by calling four macros instead of six per iteration (excluding
those in TEXT), by not dereferencing the ITERATOR in the helper
'_forloop'.

     $ m4 -d -I examples
     undivert(`forloop2.m4')dnl
     =>divert(`-1')
     =># forloop(var, from, to, stmt) - improved version:
     =>#   works even if VAR is not a strict macro name
     =>#   performs sanity check that FROM is larger than TO
     =>#   allows complex numerical expressions in TO and FROM
     =>define(`forloop', `ifelse(eval(`($2) <= ($3)'), `1',
     =>  `pushdef(`$1')_$0(`$1', eval(`$2'),
     =>    eval(`$3'), `$4')popdef(`$1')')')
     =>define(`_forloop',
     =>  `define(`$1', `$2')$4`'ifelse(`$2', `$3', `',
     =>    `$0(`$1', incr(`$2'), `$3', `$4')')')
     =>divert`'dnl
     include(`forloop2.m4')
     =>
     forloop(`i', `2', `1', `no iteration occurs')
     =>
     forloop(`', `1', `2', ` odd iterator name')
     => odd iterator name odd iterator name
     forloop(`i', `5 + 5', `0xc', ` 0x`'eval(i, `16')')
     => 0xa 0xb 0xc
     forloop(`i', `a', `b', `non-numeric bounds')
     error->m4:stdin:6: bad expression in eval (bad input): (a) <= (b)
     =>

   One other change to notice is that the improved version used '_$0'
rather than '_foreach' to invoke the helper routine.  In general, this
is a good practice to follow, because then the set of macros can be
uniformly transformed.  The following example shows a transformation
that doubles the current quoting and appends a suffix '2' to each
transformed macro.  If 'foreach' refers to the literal '_foreach', then
'foreach2' invokes '_foreach' instead of the intended '_foreach2', and
the mixing of quoting paradigms leads to an infinite recursion loop in
this example.

     $ m4 -d -L 9 -I examples
     define(`arg1', `$1')include(`forloop2.m4')include(`quote.m4')
     =>
     define(`double', `define(`$1'`2',
       arg1(patsubst(dquote(defn(`$1')), `[`']', `\&\&')))')
     =>
     double(`forloop')double(`_forloop')defn(`forloop2')
     =>ifelse(eval(``($2) <= ($3)''), ``1'',
     =>  ``pushdef(``$1'')_$0(``$1'', eval(``$2''),
     =>    eval(``$3''), ``$4'')popdef(``$1'')'')
     forloop(i, 1, 5, `ifelse(')forloop(i, 1, 5, `)')
     =>
     changequote(`[', `]')changequote([``], [''])
     =>
     forloop2(i, 1, 5, ``ifelse('')forloop2(i, 1, 5, ``)'')
     =>
     changequote`'include(`forloop.m4')
     =>
     double(`forloop')double(`_forloop')defn(`forloop2')
     =>pushdef(``$1'', ``$2'')_forloop($@)popdef(``$1'')
     forloop(i, 1, 5, `ifelse(')forloop(i, 1, 5, `)')
     =>
     changequote(`[', `]')changequote([``], [''])
     =>
     forloop2(i, 1, 5, ``ifelse('')forloop2(i, 1, 5, ``)'')
     error->m4:stdin:12: recursion limit of 9 exceeded, use -L<N> to change it

   One more optimization is still possible.  Instead of repeatedly
assigning a variable then invoking or dereferencing it, it is possible
to pass the current iterator value as a single argument.  Coupled with
'curry' if other arguments are needed (*note Composition::), or with
helper macros if the argument is needed in more than one place in the
expansion, the output can be generated with three, rather than four,
macros of overhead per iteration.  Notice how the file
'm4-1.4.17/examples/forloop3.m4' rearranges the arguments of the helper
'_forloop' to take two arguments that are placed around the current
value.  By splitting a balanced set of parantheses across multiple
arguments, the helper macro can now be shared by 'forloop' and the new
'forloop_arg'.

     $ m4 -I examples
     include(`forloop3.m4')
     =>
     undivert(`forloop3.m4')dnl
     =>divert(`-1')
     =># forloop_arg(from, to, macro) - invoke MACRO(value) for
     =>#   each value between FROM and TO, without define overhead
     =>define(`forloop_arg', `ifelse(eval(`($1) <= ($2)'), `1',
     =>  `_forloop(`$1', eval(`$2'), `$3(', `)')')')
     =># forloop(var, from, to, stmt) - refactored to share code
     =>define(`forloop', `ifelse(eval(`($2) <= ($3)'), `1',
     =>  `pushdef(`$1')_forloop(eval(`$2'), eval(`$3'),
     =>    `define(`$1',', `)$4')popdef(`$1')')')
     =>define(`_forloop',
     =>  `$3`$1'$4`'ifelse(`$1', `$2', `',
     =>    `$0(incr(`$1'), `$2', `$3', `$4')')')
     =>divert`'dnl
     forloop(`i', `1', `3', ` i')
     => 1 2 3
     define(`echo', `$@')
     =>
     forloop_arg(`1', `3', ` echo')
     => 1 2 3
     include(`curry.m4')
     =>
     forloop_arg(`1', `3', `curry(`pushdef', `a')')
     =>
     a
     =>3
     popdef(`a')a
     =>2
     popdef(`a')a
     =>1
     popdef(`a')a
     =>a

   Of course, it is possible to make even more improvements, such as
adding an optional step argument, or allowing iteration through
descending sequences.  GNU Autoconf provides some of these additional
bells and whistles in its 'm4_for' macro.


File: m4.info,  Node: Improved foreach,  Next: Improved copy,  Prev: Improved forloop,  Up: Answers

17.3 Solution for 'foreach'
===========================

The 'foreach' and 'foreachq' macros (*note Foreach::) as presented
earlier each have flaws.  First, we will examine and fix the quadratic
behavior of 'foreachq':

     $ m4 -I examples
     include(`foreachq.m4')
     =>
     traceon(`shift')debugmode(`aq')
     =>
     foreachq(`x', ``1', `2', `3', `4'', `x
     ')dnl
     =>1
     error->m4trace: -3- shift(`1', `2', `3', `4')
     error->m4trace: -2- shift(`1', `2', `3', `4')
     =>2
     error->m4trace: -4- shift(`1', `2', `3', `4')
     error->m4trace: -3- shift(`2', `3', `4')
     error->m4trace: -3- shift(`1', `2', `3', `4')
     error->m4trace: -2- shift(`2', `3', `4')
     =>3
     error->m4trace: -5- shift(`1', `2', `3', `4')
     error->m4trace: -4- shift(`2', `3', `4')
     error->m4trace: -3- shift(`3', `4')
     error->m4trace: -4- shift(`1', `2', `3', `4')
     error->m4trace: -3- shift(`2', `3', `4')
     error->m4trace: -2- shift(`3', `4')
     =>4
     error->m4trace: -6- shift(`1', `2', `3', `4')
     error->m4trace: -5- shift(`2', `3', `4')
     error->m4trace: -4- shift(`3', `4')
     error->m4trace: -3- shift(`4')

   Each successive iteration was adding more quoted 'shift' invocations,
and the entire list contents were passing through every iteration.  In
general, when recursing, it is a good idea to make the recursion use
fewer arguments, rather than adding additional quoted uses of 'shift'.
By doing so, 'm4' uses less memory, invokes fewer macros, is less likely
to run into machine limits, and most importantly, performs faster.  The
fixed version of 'foreachq' can be found in
'm4-1.4.17/examples/foreachq2.m4':

     $ m4 -I examples
     include(`foreachq2.m4')
     =>
     undivert(`foreachq2.m4')dnl
     =>include(`quote.m4')dnl
     =>divert(`-1')
     =># foreachq(x, `item_1, item_2, ..., item_n', stmt)
     =>#   quoted list, improved version
     =>define(`foreachq', `pushdef(`$1')_$0($@)popdef(`$1')')
     =>define(`_arg1q', ``$1'')
     =>define(`_rest', `ifelse(`$#', `1', `', `dquote(shift($@))')')
     =>define(`_foreachq', `ifelse(`$2', `', `',
     =>  `define(`$1', _arg1q($2))$3`'$0(`$1', _rest($2), `$3')')')
     =>divert`'dnl
     traceon(`shift')debugmode(`aq')
     =>
     foreachq(`x', ``1', `2', `3', `4'', `x
     ')dnl
     =>1
     error->m4trace: -3- shift(`1', `2', `3', `4')
     =>2
     error->m4trace: -3- shift(`2', `3', `4')
     =>3
     error->m4trace: -3- shift(`3', `4')
     =>4

   Note that the fixed version calls unquoted helper macros in
'_foreachq' to trim elements immediately; those helper macros in turn
must re-supply the layer of quotes lost in the macro invocation.
Contrast the use of '_arg1q', which quotes the first list element, with
'_arg1' of the earlier implementation that returned the first list
element directly.  Additionally, by calling the helper method
immediately, the 'defn(`ITERATOR')' no longer contains unexpanded
macros.

   The astute m4 programmer might notice that the solution above still
uses more memory and macro invocations, and thus more time, than
strictly necessary.  Note that '$2', which contains an arbitrarily long
quoted list, is expanded and rescanned three times per iteration of
'_foreachq'.  Furthermore, every iteration of the algorithm effectively
unboxes then reboxes the list, which costs a couple of macro
invocations.  It is possible to rewrite the algorithm for a bit more
speed by swapping the order of the arguments to '_foreachq' in order to
operate on an unboxed list in the first place, and by using the
fixed-length '$#' instead of an arbitrary length list as the key to end
recursion.  The result is an overhead of six macro invocations per loop
(excluding any macros in TEXT), instead of eight.  This alternative
approach is available as 'm4-1.4.17/examples/foreach3.m4':

     $ m4 -I examples
     include(`foreachq3.m4')
     =>
     undivert(`foreachq3.m4')dnl
     =>divert(`-1')
     =># foreachq(x, `item_1, item_2, ..., item_n', stmt)
     =>#   quoted list, alternate improved version
     =>define(`foreachq', `ifelse(`$2', `', `',
     =>  `pushdef(`$1')_$0(`$1', `$3', `', $2)popdef(`$1')')')
     =>define(`_foreachq', `ifelse(`$#', `3', `',
     =>  `define(`$1', `$4')$2`'$0(`$1', `$2',
     =>    shift(shift(shift($@))))')')
     =>divert`'dnl
     traceon(`shift')debugmode(`aq')
     =>
     foreachq(`x', ``1', `2', `3', `4'', `x
     ')dnl
     =>1
     error->m4trace: -4- shift(`x', `x
     error->', `', `1', `2', `3', `4')
     error->m4trace: -3- shift(`x
     error->', `', `1', `2', `3', `4')
     error->m4trace: -2- shift(`', `1', `2', `3', `4')
     =>2
     error->m4trace: -4- shift(`x', `x
     error->', `1', `2', `3', `4')
     error->m4trace: -3- shift(`x
     error->', `1', `2', `3', `4')
     error->m4trace: -2- shift(`1', `2', `3', `4')
     =>3
     error->m4trace: -4- shift(`x', `x
     error->', `2', `3', `4')
     error->m4trace: -3- shift(`x
     error->', `2', `3', `4')
     error->m4trace: -2- shift(`2', `3', `4')
     =>4
     error->m4trace: -4- shift(`x', `x
     error->', `3', `4')
     error->m4trace: -3- shift(`x
     error->', `3', `4')
     error->m4trace: -2- shift(`3', `4')

   In the current version of M4, every instance of '$@' is rescanned as
it is encountered.  Thus, the 'foreachq3.m4' alternative uses much less
memory than 'foreachq2.m4', and executes as much as 10% faster, since
each iteration encounters fewer '$@'.  However, the implementation of
rescanning every byte in '$@' is quadratic in the number of bytes
scanned (for example, making the broken version in 'foreachq.m4' cubic,
rather than quadratic, in behavior).  A future release of M4 will
improve the underlying implementation by reusing results of previous
scans, so that both styles of 'foreachq' can become linear in the number
of bytes scanned.  Notice how the implementation injects an empty
argument prior to expanding '$2' within 'foreachq'; the helper macro
'_foreachq' then ignores the third argument altogether, and ends
recursion when there are three arguments left because there was nothing
left to pass through 'shift'.  Thus, each iteration only needs one
'ifelse', rather than the two conditionals used in the version from
'foreachq2.m4'.

   So far, all of the implementations of 'foreachq' presented have been
quadratic with M4 1.4.x.  But 'forloop' is linear, because each
iteration parses a constant amount of arguments.  So, it is possible to
design a variant that uses 'forloop' to do the iteration, then uses '$@'
only once at the end, giving a linear result even with older M4
implementations.  This implementation relies on the GNU extension that
'$10' expands to the tenth argument rather than the first argument
concatenated with '0'.  The trick is to define an intermediate macro
that repeats the text 'm4_define(`$1', `$N')$2`'', with 'n' set to
successive integers corresponding to each argument.  The helper macro
'_foreachq_' is needed in order to generate the literal sequences such
as '$1' into the intermediate macro, rather than expanding them as the
arguments of '_foreachq'.  With this approach, no 'shift' calls are even
needed!  Even though there are seven macros of overhead per iteration
instead of six in 'foreachq3.m4', the linear scaling is apparent at
relatively small list sizes.  However, this approach will need
adjustment when a future version of M4 follows POSIX by no longer
treating '$10' as the tenth argument; the anticipation is that '${10}'
can be used instead, although that alternative syntax is not yet
supported.

     $ m4 -I examples
     include(`foreachq4.m4')
     =>
     undivert(`foreachq4.m4')dnl
     =>include(`forloop2.m4')dnl
     =>divert(`-1')
     =># foreachq(x, `item_1, item_2, ..., item_n', stmt)
     =>#   quoted list, version based on forloop
     =>define(`foreachq',
     =>`ifelse(`$2', `', `', `_$0(`$1', `$3', $2)')')
     =>define(`_foreachq',
     =>`pushdef(`$1', forloop(`$1', `3', `$#',
     =>  `$0_(`1', `2', indir(`$1'))')`popdef(
     =>    `$1')')indir(`$1', $@)')
     =>define(`_foreachq_',
     =>``define(`$$1', `$$3')$$2`''')
     =>divert`'dnl
     traceon(`shift')debugmode(`aq')
     =>
     foreachq(`x', ``1', `2', `3', `4'', `x
     ')dnl
     =>1
     =>2
     =>3
     =>4

   For yet another approach, the improved version of 'foreach',
available in 'm4-1.4.17/examples/foreach2.m4', simply overquotes the
arguments to '_foreach' to begin with, using 'dquote_elt'.  Then
'_foreach' can just use '_arg1' to remove the extra layer of quoting
that was added up front:

     $ m4 -I examples
     include(`foreach2.m4')
     =>
     undivert(`foreach2.m4')dnl
     =>include(`quote.m4')dnl
     =>divert(`-1')
     =># foreach(x, (item_1, item_2, ..., item_n), stmt)
     =>#   parenthesized list, improved version
     =>define(`foreach', `pushdef(`$1')_$0(`$1',
     =>  (dquote(dquote_elt$2)), `$3')popdef(`$1')')
     =>define(`_arg1', `$1')
     =>define(`_foreach', `ifelse(`$2', `(`')', `',
     =>  `define(`$1', _arg1$2)$3`'$0(`$1', (dquote(shift$2)), `$3')')')
     =>divert`'dnl
     traceon(`shift')debugmode(`aq')
     =>
     foreach(`x', `(`1', `2', `3', `4')', `x
     ')dnl
     error->m4trace: -4- shift(`1', `2', `3', `4')
     error->m4trace: -4- shift(`2', `3', `4')
     error->m4trace: -4- shift(`3', `4')
     =>1
     error->m4trace: -3- shift(``1'', ``2'', ``3'', ``4'')
     =>2
     error->m4trace: -3- shift(``2'', ``3'', ``4'')
     =>3
     error->m4trace: -3- shift(``3'', ``4'')
     =>4
     error->m4trace: -3- shift(``4'')

   It is likewise possible to write a variant of 'foreach' that performs
in linear time on M4 1.4.x; the easiest method is probably writing a
version of 'foreach' that unboxes its list, then invokes '_foreachq' as
previously defined in 'foreachq4.m4'.

   In summary, recursion over list elements is trickier than it appeared
at first glance, but provides a powerful idiom within 'm4' processing.
As a final demonstration, both list styles are now able to handle
several scenarios that would wreak havoc on one or both of the original
implementations.  This points out one other difference between the list
styles.  'foreach' evaluates unquoted list elements only once, in
preparation for calling '_foreach', similary for 'foreachq' as provided
by 'foreachq3.m4' or 'foreachq4.m4'.  But 'foreachq', as provided by
'foreachq2.m4', evaluates unquoted list elements twice while visiting
the first list element, once in '_arg1q' and once in '_rest'.  When
deciding which list style to use, one must take into account whether
repeating the side effects of unquoted list elements will have any
detrimental effects.

     $ m4 -I examples
     include(`foreach2.m4')
     =>
     include(`foreachq2.m4')
     =>
     dnl 0-element list:
     foreach(`x', `', `<x>') / foreachq(`x', `', `<x>')
     => / 
     dnl 1-element list of empty element
     foreach(`x', `()', `<x>') / foreachq(`x', ``'', `<x>')
     =><> / <>
     dnl 2-element list of empty elements
     foreach(`x', `(`',`')', `<x>') / foreachq(`x', ``',`'', `<x>')
     =><><> / <><>
     dnl 1-element list of a comma
     foreach(`x', `(`,')', `<x>') / foreachq(`x', ``,'', `<x>')
     =><,> / <,>
     dnl 2-element list of unbalanced parentheses
     foreach(`x', `(`(', `)')', `<x>') / foreachq(`x', ``(', `)'', `<x>')
     =><(><)> / <(><)>
     define(`ab', `oops')dnl using defn(`iterator')
     foreach(`x', `(`a', `b')', `defn(`x')') /dnl
      foreachq(`x', ``a', `b'', `defn(`x')')
     =>ab / ab
     define(`active', `ACT, IVE')
     =>
     traceon(`active')
     =>
     dnl list of unquoted macros; expansion occurs before recursion
     foreach(`x', `(active, active)', `<x>
     ')dnl
     error->m4trace: -4- active -> `ACT, IVE'
     error->m4trace: -4- active -> `ACT, IVE'
     =><ACT>
     =><IVE>
     =><ACT>
     =><IVE>
     foreachq(`x', `active, active', `<x>
     ')dnl
     error->m4trace: -3- active -> `ACT, IVE'
     error->m4trace: -3- active -> `ACT, IVE'
     =><ACT>
     error->m4trace: -3- active -> `ACT, IVE'
     error->m4trace: -3- active -> `ACT, IVE'
     =><IVE>
     =><ACT>
     =><IVE>
     dnl list of quoted macros; expansion occurs during recursion
     foreach(`x', `(`active', `active')', `<x>
     ')dnl
     error->m4trace: -1- active -> `ACT, IVE'
     =><ACT, IVE>
     error->m4trace: -1- active -> `ACT, IVE'
     =><ACT, IVE>
     foreachq(`x', ``active', `active'', `<x>
     ')dnl
     error->m4trace: -1- active -> `ACT, IVE'
     =><ACT, IVE>
     error->m4trace: -1- active -> `ACT, IVE'
     =><ACT, IVE>
     dnl list of double-quoted macro names; no expansion
     foreach(`x', `(``active'', ``active'')', `<x>
     ')dnl
     =><active>
     =><active>
     foreachq(`x', ```active'', ``active''', `<x>
     ')dnl
     =><active>
     =><active>


File: m4.info,  Node: Improved copy,  Next: Improved m4wrap,  Prev: Improved foreach,  Up: Answers

17.4 Solution for 'copy'
========================

The macro 'copy' presented above is unable to handle builtin tokens with
M4 1.4.x, because it tries to pass the builtin token through the macro
'curry', where it is silently flattened to an empty string (*note
Composition::).  Rather than using the problematic 'curry' to work
around the limitation that 'stack_foreach' expects to invoke a macro
that takes exactly one argument, we can write a new macro that lets us
form the exact two-argument 'pushdef' call sequence needed, so that we
are no longer passing a builtin token through a text macro.

 -- Composite: stack_foreach_sep (MACRO, PRE, POST, SEP)
 -- Composite: stack_foreach_sep_lifo (MACRO, PRE, POST, SEP)
     For each of the 'pushdef' definitions associated with MACRO, expand
     the sequence 'PRE`'definition`'POST'.  Additionally, expand SEP
     between definitions.  'stack_foreach_sep' visits the oldest
     definition first, while 'stack_foreach_sep_lifo' visits the current
     definition first.  The expansion may dereference MACRO, but should
     not modify it.  There are a few special macros, such as 'defn',
     which cannot be used as the MACRO parameter.

   Note that 'stack_foreach(`MACRO', `ACTION')' is equivalent to
'stack_foreach_sep(`MACRO', `ACTION(', `)')'.  By supplying explicit
parentheses, split among the PRE and POST arguments to
'stack_foreach_sep', it is now possible to construct macro calls with
more than one argument, without passing builtin tokens through a macro
call.  It is likewise possible to directly reference the stack
definitions without a macro call, by leaving PRE and POST empty.  Thus,
in addition to fixing 'copy' on builtin tokens, it also executes with
fewer macro invocations.

   The new macro also adds a separator that is only output after the
first iteration of the helper '_stack_reverse_sep', implemented by
prepending the original SEP to PRE and omitting a SEP argument in
subsequent iterations.  Note that the empty string that separates SEP
from PRE is provided as part of the fourth argument when originally
calling '_stack_reverse_sep', and not by writing '$4`'$3' as the third
argument in the recursive call; while the other approach would give the
same output, it does so at the expense of increasing the argument size
on each iteration of '_stack_reverse_sep', which results in quadratic
instead of linear execution time.  The improved stack walking macros are
available in 'm4-1.4.17/examples/stack_sep.m4':

     $ m4 -I examples
     include(`stack_sep.m4')
     =>
     define(`copy', `ifdef(`$2', `errprint(`$2 already defined
     ')m4exit(`1')',
        `stack_foreach_sep(`$1', `pushdef(`$2',', `)')')')dnl
     pushdef(`a', `1')pushdef(`a', defn(`divnum'))
     =>
     copy(`a', `b')
     =>
     b
     =>0
     popdef(`b')
     =>
     b
     =>1
     pushdef(`c', `1')pushdef(`c', `2')
     =>
     stack_foreach_sep_lifo(`c', `', `', `, ')
     =>2, 1
     undivert(`stack_sep.m4')dnl
     =>divert(`-1')
     =># stack_foreach_sep(macro, pre, post, sep)
     =># Invoke PRE`'defn`'POST with a single argument of each definition
     =># from the definition stack of MACRO, starting with the oldest, and
     =># separated by SEP between definitions.
     =>define(`stack_foreach_sep',
     =>`_stack_reverse_sep(`$1', `tmp-$1')'dnl
     =>`_stack_reverse_sep(`tmp-$1', `$1', `$2`'defn(`$1')$3', `$4`'')')
     =># stack_foreach_sep_lifo(macro, pre, post, sep)
     =># Like stack_foreach_sep, but starting with the newest definition.
     =>define(`stack_foreach_sep_lifo',
     =>`_stack_reverse_sep(`$1', `tmp-$1', `$2`'defn(`$1')$3', `$4`'')'dnl
     =>`_stack_reverse_sep(`tmp-$1', `$1')')
     =>define(`_stack_reverse_sep',
     =>`ifdef(`$1', `pushdef(`$2', defn(`$1'))$3`'popdef(`$1')$0(
     =>  `$1', `$2', `$4$3')')')
     =>divert`'dnl


File: m4.info,  Node: Improved m4wrap,  Next: Improved cleardivert,  Prev: Improved copy,  Up: Answers

17.5 Solution for 'm4wrap'
==========================

The replacement 'm4wrap' versions presented above, designed to guarantee
FIFO or LIFO order regardless of the underlying M4 implementation, share
a bug when dealing with wrapped text that looks like parameter
expansion.  Note how the invocation of 'm4wrapN' interprets these
parameters, while using the builtin preserves them for their intended
use.

     $ m4 -I examples
     include(`wraplifo.m4')
     =>
     m4wrap(`define(`foo', ``$0:'-$1-$*-$#-')foo(`a', `b')
     ')
     =>
     builtin(`m4wrap', ``'define(`bar', ``$0:'-$1-$*-$#-')bar(`a', `b')
     ')
     =>
     ^D
     =>bar:-a-a,b-2-
     =>m4wrap0:---0-

   Additionally, the computation of '_m4wrap_level' and creation of
multiple 'm4wrapN' placeholders in the original examples is more
expensive in time and memory than strictly necessary.  Notice how the
improved version grabs the wrapped text via 'defn' to avoid parameter
expansion, then undefines '_m4wrap_text', before stripping a level of
quotes with '_arg1' to expand the text.  That way, each level of
wrapping reuses the single placeholder, which starts each nesting level
in an undefined state.

   Finally, it is worth emulating the GNU M4 extension of saving all
arguments to 'm4wrap', separated by a space, rather than saving just the
first argument.  This is done with the 'join' macro documented
previously (*note Shift::).  The improved LIFO example is shipped as
'm4-1.4.17/examples/wraplifo2.m4', and can easily be converted to a FIFO
solution by swapping the adjacent invocations of 'joinall' and 'defn'.

     $ m4 -I examples
     include(`wraplifo2.m4')
     =>
     undivert(`wraplifo2.m4')dnl
     =>dnl Redefine m4wrap to have LIFO semantics, improved example.
     =>include(`join.m4')dnl
     =>define(`_m4wrap', defn(`m4wrap'))dnl
     =>define(`_arg1', `$1')dnl
     =>define(`m4wrap',
     =>`ifdef(`_$0_text',
     =>       `define(`_$0_text', joinall(` ', $@)defn(`_$0_text'))',
     =>       `_$0(`_arg1(defn(`_$0_text')undefine(`_$0_text'))')dnl
     =>define(`_$0_text', joinall(` ', $@))')')dnl
     m4wrap(`define(`foo', ``$0:'-$1-$*-$#-')foo(`a', `b')
     ')
     =>
     m4wrap(`lifo text
     m4wrap(`nested', `', `$@
     ')')
     =>
     ^D
     =>lifo text
     =>foo:-a-a,b-2-
     =>nested  $@


File: m4.info,  Node: Improved cleardivert,  Next: Improved capitalize,  Prev: Improved m4wrap,  Up: Answers

17.6 Solution for 'cleardivert'
===============================

The 'cleardivert' macro (*note Cleardivert::) cannot, as it stands, be
called without arguments to clear all pending diversions.  That is
because using undivert with an empty string for an argument is different
than using it with no arguments at all.  Compare the earlier definition
with one that takes the number of arguments into account:

     define(`cleardivert',
       `pushdef(`_n', divnum)divert(`-1')undivert($@)divert(_n)popdef(`_n')')
     =>
     divert(`1')one
     divert
     =>
     cleardivert
     =>
     undivert
     =>one
     =>
     define(`cleardivert',
       `pushdef(`_num', divnum)divert(`-1')ifelse(`$#', `0',
         `undivert`'', `undivert($@)')divert(_num)popdef(`_num')')
     =>
     divert(`2')two
     divert
     =>
     cleardivert
     =>
     undivert
     =>


File: m4.info,  Node: Improved capitalize,  Next: Improved fatal_error,  Prev: Improved cleardivert,  Up: Answers

17.7 Solution for 'capitalize'
==============================

The 'capitalize' macro (*note Patsubst::) as presented earlier does not
allow clients to follow the quoting rule of thumb.  Consider the three
macros 'active', 'Active', and 'ACTIVE', and the difference between
calling 'capitalize' with the expansion of a macro, expanding the result
of a case change, and changing the case of a double-quoted string:

     $ m4 -I examples
     include(`capitalize.m4')dnl
     define(`active', `act1, ive')dnl
     define(`Active', `Act2, Ive')dnl
     define(`ACTIVE', `ACT3, IVE')dnl
     upcase(active)
     =>ACT1,IVE
     upcase(`active')
     =>ACT3, IVE
     upcase(``active'')
     =>ACTIVE
     downcase(ACTIVE)
     =>act3,ive
     downcase(`ACTIVE')
     =>act1, ive
     downcase(``ACTIVE'')
     =>active
     capitalize(active)
     =>Act1
     capitalize(`active')
     =>Active
     capitalize(``active'')
     =>_capitalize(`active')
     define(`A', `OOPS')
     =>
     capitalize(active)
     =>OOPSct1
     capitalize(`active')
     =>OOPSctive

   First, when 'capitalize' is called with more than one argument, it
was throwing away later arguments, whereas 'upcase' and 'downcase' used
'$*' to collect them all.  The fix is simple: use '$*' consistently.

   Next, with single-quoting, 'capitalize' outputs a single character, a
set of quotes, then the rest of the characters, making it impossible to
invoke 'Active' after the fact, and allowing the alternate macro 'A' to
interfere.  Here, the solution is to use additional quoting in the
helper macros, then pass the final over-quoted output string through
'_arg1' to remove the extra quoting and finally invoke the concatenated
portions as a single string.

   Finally, when passed a double-quoted string, the nested macro
'_capitalize' is never invoked because it ended up nested inside quotes.
This one is the toughest to fix.  In short, we have no idea how many
levels of quotes are in effect on the substring being altered by
'patsubst'.  If the replacement string cannot be expressed entirely in
terms of literal text and backslash substitutions, then we need a
mechanism to guarantee that the helper macros are invoked outside of
quotes.  In other words, this sounds like a job for 'changequote' (*note
Changequote::).  By changing the active quoting characters, we can
guarantee that replacement text injected by 'patsubst' always occurs in
the middle of a string that has exactly one level of over-quoting using
alternate quotes; so the replacement text closes the quoted string,
invokes the helper macros, then reopens the quoted string.  In turn,
that means the replacement text has unbalanced quotes, necessitating
another round of 'changequote'.

   In the fixed version below, (also shipped as
'm4-1.4.17/examples/capitalize2.m4'), 'capitalize' uses the alternate
quotes of '<<[' and ']>>' (the longer strings are chosen so as to be
less likely to appear in the text being converted).  The helpers
'_to_alt' and '_from_alt' merely reduce the number of characters
required to perform a 'changequote', since the definition changes twice.
The outermost pair means that 'patsubst' and '_capitalize_alt' are
invoked with alternate quoting; the innermost pair is used so that the
third argument to 'patsubst' can contain an unbalanced ']>>'/'<<[' pair.
Note that 'upcase' and 'downcase' must be redefined as '_upcase_alt' and
'_downcase_alt', since they contain nested quotes but are invoked with
the alternate quoting scheme in effect.

     $ m4 -I examples
     include(`capitalize2.m4')dnl
     define(`active', `act1, ive')dnl
     define(`Active', `Act2, Ive')dnl
     define(`ACTIVE', `ACT3, IVE')dnl
     define(`A', `OOPS')dnl
     capitalize(active; `active'; ``active''; ```actIVE''')
     =>Act1,Ive; Act2, Ive; Active; `Active'
     undivert(`capitalize2.m4')dnl
     =>divert(`-1')
     =># upcase(text)
     =># downcase(text)
     =># capitalize(text)
     =>#   change case of text, improved version
     =>define(`upcase', `translit(`$*', `a-z', `A-Z')')
     =>define(`downcase', `translit(`$*', `A-Z', `a-z')')
     =>define(`_arg1', `$1')
     =>define(`_to_alt', `changequote(`<<[', `]>>')')
     =>define(`_from_alt', `changequote(<<[`]>>, <<[']>>)')
     =>define(`_upcase_alt', `translit(<<[$*]>>, <<[a-z]>>, <<[A-Z]>>)')
     =>define(`_downcase_alt', `translit(<<[$*]>>, <<[A-Z]>>, <<[a-z]>>)')
     =>define(`_capitalize_alt',
     =>  `regexp(<<[$1]>>, <<[^\(\w\)\(\w*\)]>>,
     =>    <<[_upcase_alt(<<[<<[\1]>>]>>)_downcase_alt(<<[<<[\2]>>]>>)]>>)')
     =>define(`capitalize',
     =>  `_arg1(_to_alt()patsubst(<<[<<[$*]>>]>>, <<[\w+]>>,
     =>    _from_alt()`]>>_$0_alt(<<[\&]>>)<<['_to_alt())_from_alt())')
     =>divert`'dnl


File: m4.info,  Node: Improved fatal_error,  Prev: Improved capitalize,  Up: Answers

17.8 Solution for 'fatal_error'
===============================

The 'fatal_error' macro (*note M4exit::) is not robust to versions of
GNU M4 earlier than 1.4.8, where invoking '__file__' (*note Location::)
inside 'm4wrap' would result in an empty string, and '__line__' resulted
in '0' even though all files start at line 1.  Furthermore, versions
earlier than 1.4.6 did not support the '__program__' macro.  If you want
'fatal_error' to work across the entire 1.4.x release series, a better
implementation would be:

     define(`fatal_error',
       `errprint(ifdef(`__program__', `__program__', ``m4'')'dnl
     `:ifelse(__line__, `0', `',
         `__file__:__line__:')` fatal error: $*
     ')m4exit(`1')')
     =>
     m4wrap(`divnum(`demo of internal message')
     fatal_error(`inside wrapped text')')
     =>
     ^D
     error->m4:stdin:6: Warning: excess arguments to builtin `divnum' ignored
     =>0
     error->m4:stdin:6: fatal error: inside wrapped text


File: m4.info,  Node: Copying This Package,  Next: Copying This Manual,  Prev: Answers,  Up: Top

Appendix A How to make copies of the overall M4 package
*******************************************************

This appendix covers the license for copying the source code of the
overall M4 package.  This manual is under a different set of
restrictions, covered later (*note Copying This Manual::).

* Menu:

* GNU General Public License::  License for copying the M4 package


File: m4.info,  Node: GNU General Public License,  Up: Copying This Package

A.1 License for copying the M4 package
======================================

                        Version 3, 29 June 2007

     Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>

     Everyone is permitted to copy and distribute verbatim copies of this
     license document, but changing it is not allowed.

Preamble
========

The GNU General Public License is a free, copyleft license for software
and other kinds of works.

   The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

   When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

   To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

   For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

   Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

   For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

   Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

   Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

   The precise terms and conditions for copying, distribution and
modification follow.

TERMS AND CONDITIONS
====================

  0. Definitions.

     "This License" refers to version 3 of the GNU General Public
     License.

     "Copyright" also means copyright-like laws that apply to other
     kinds of works, such as semiconductor masks.

     "The Program" refers to any copyrightable work licensed under this
     License.  Each licensee is addressed as "you".  "Licensees" and
     "recipients" may be individuals or organizations.

     To "modify" a work means to copy from or adapt all or part of the
     work in a fashion requiring copyright permission, other than the
     making of an exact copy.  The resulting work is called a "modified
     version" of the earlier work or a work "based on" the earlier work.

     A "covered work" means either the unmodified Program or a work
     based on the Program.

     To "propagate" a work means to do anything with it that, without
     permission, would make you directly or secondarily liable for
     infringement under applicable copyright law, except executing it on
     a computer or modifying a private copy.  Propagation includes
     copying, distribution (with or without modification), making
     available to the public, and in some countries other activities as
     well.

     To "convey" a work means any kind of propagation that enables other
     parties to make or receive copies.  Mere interaction with a user
     through a computer network, with no transfer of a copy, is not
     conveying.

     An interactive user interface displays "Appropriate Legal Notices"
     to the extent that it includes a convenient and prominently visible
     feature that (1) displays an appropriate copyright notice, and (2)
     tells the user that there is no warranty for the work (except to
     the extent that warranties are provided), that licensees may convey
     the work under this License, and how to view a copy of this
     License.  If the interface presents a list of user commands or
     options, such as a menu, a prominent item in the list meets this
     criterion.

  1. Source Code.

     The "source code" for a work means the preferred form of the work
     for making modifications to it.  "Object code" means any non-source
     form of a work.

     A "Standard Interface" means an interface that either is an
     official standard defined by a recognized standards body, or, in
     the case of interfaces specified for a particular programming
     language, one that is widely used among developers working in that
     language.

     The "System Libraries" of an executable work include anything,
     other than the work as a whole, that (a) is included in the normal
     form of packaging a Major Component, but which is not part of that
     Major Component, and (b) serves only to enable use of the work with
     that Major Component, or to implement a Standard Interface for
     which an implementation is available to the public in source code
     form.  A "Major Component", in this context, means a major
     essential component (kernel, window system, and so on) of the
     specific operating system (if any) on which the executable work
     runs, or a compiler used to produce the work, or an object code
     interpreter used to run it.

     The "Corresponding Source" for a work in object code form means all
     the source code needed to generate, install, and (for an executable
     work) run the object code and to modify the work, including scripts
     to control those activities.  However, it does not include the
     work's System Libraries, or general-purpose tools or generally
     available free programs which are used unmodified in performing
     those activities but which are not part of the work.  For example,
     Corresponding Source includes interface definition files associated
     with source files for the work, and the source code for shared
     libraries and dynamically linked subprograms that the work is
     specifically designed to require, such as by intimate data
     communication or control flow between those subprograms and other
     parts of the work.

     The Corresponding Source need not include anything that users can
     regenerate automatically from other parts of the Corresponding
     Source.

     The Corresponding Source for a work in source code form is that
     same work.

  2. Basic Permissions.

     All rights granted under this License are granted for the term of
     copyright on the Program, and are irrevocable provided the stated
     conditions are met.  This License explicitly affirms your unlimited
     permission to run the unmodified Program.  The output from running
     a covered work is covered by this License only if the output, given
     its content, constitutes a covered work.  This License acknowledges
     your rights of fair use or other equivalent, as provided by
     copyright law.

     You may make, run and propagate covered works that you do not
     convey, without conditions so long as your license otherwise
     remains in force.  You may convey covered works to others for the
     sole purpose of having them make modifications exclusively for you,
     or provide you with facilities for running those works, provided
     that you comply with the terms of this License in conveying all
     material for which you do not control copyright.  Those thus making
     or running the covered works for you must do so exclusively on your
     behalf, under your direction and control, on terms that prohibit
     them from making any copies of your copyrighted material outside
     their relationship with you.

     Conveying under any other circumstances is permitted solely under
     the conditions stated below.  Sublicensing is not allowed; section
     10 makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

     No covered work shall be deemed part of an effective technological
     measure under any applicable law fulfilling obligations under
     article 11 of the WIPO copyright treaty adopted on 20 December
     1996, or similar laws prohibiting or restricting circumvention of
     such measures.

     When you convey a covered work, you waive any legal power to forbid
     circumvention of technological measures to the extent such
     circumvention is effected by exercising rights under this License
     with respect to the covered work, and you disclaim any intention to
     limit operation or modification of the work as a means of
     enforcing, against the work's users, your or third parties' legal
     rights to forbid circumvention of technological measures.

  4. Conveying Verbatim Copies.

     You may convey verbatim copies of the Program's source code as you
     receive it, in any medium, provided that you conspicuously and
     appropriately publish on each copy an appropriate copyright notice;
     keep intact all notices stating that this License and any
     non-permissive terms added in accord with section 7 apply to the
     code; keep intact all notices of the absence of any warranty; and
     give all recipients a copy of this License along with the Program.

     You may charge any price or no price for each copy that you convey,
     and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

     You may convey a work based on the Program, or the modifications to
     produce it from the Program, in the form of source code under the
     terms of section 4, provided that you also meet all of these
     conditions:

       a. The work must carry prominent notices stating that you
          modified it, and giving a relevant date.

       b. The work must carry prominent notices stating that it is
          released under this License and any conditions added under
          section 7.  This requirement modifies the requirement in
          section 4 to "keep intact all notices".

       c. You must license the entire work, as a whole, under this
          License to anyone who comes into possession of a copy.  This
          License will therefore apply, along with any applicable
          section 7 additional terms, to the whole of the work, and all
          its parts, regardless of how they are packaged.  This License
          gives no permission to license the work in any other way, but
          it does not invalidate such permission if you have separately
          received it.

       d. If the work has interactive user interfaces, each must display
          Appropriate Legal Notices; however, if the Program has
          interactive interfaces that do not display Appropriate Legal
          Notices, your work need not make them do so.

     A compilation of a covered work with other separate and independent
     works, which are not by their nature extensions of the covered
     work, and which are not combined with it such as to form a larger
     program, in or on a volume of a storage or distribution medium, is
     called an "aggregate" if the compilation and its resulting
     copyright are not used to limit the access or legal rights of the
     compilation's users beyond what the individual works permit.
     Inclusion of a covered work in an aggregate does not cause this
     License to apply to the other parts of the aggregate.

  6. Conveying Non-Source Forms.

     You may convey a covered work in object code form under the terms
     of sections 4 and 5, provided that you also convey the
     machine-readable Corresponding Source under the terms of this
     License, in one of these ways:

       a. Convey the object code in, or embodied in, a physical product
          (including a physical distribution medium), accompanied by the
          Corresponding Source fixed on a durable physical medium
          customarily used for software interchange.

       b. Convey the object code in, or embodied in, a physical product
          (including a physical distribution medium), accompanied by a
          written offer, valid for at least three years and valid for as
          long as you offer spare parts or customer support for that
          product model, to give anyone who possesses the object code
          either (1) a copy of the Corresponding Source for all the
          software in the product that is covered by this License, on a
          durable physical medium customarily used for software
          interchange, for a price no more than your reasonable cost of
          physically performing this conveying of source, or (2) access
          to copy the Corresponding Source from a network server at no
          charge.

       c. Convey individual copies of the object code with a copy of the
          written offer to provide the Corresponding Source.  This
          alternative is allowed only occasionally and noncommercially,
          and only if you received the object code with such an offer,
          in accord with subsection 6b.

       d. Convey the object code by offering access from a designated
          place (gratis or for a charge), and offer equivalent access to
          the Corresponding Source in the same way through the same
          place at no further charge.  You need not require recipients
          to copy the Corresponding Source along with the object code.
          If the place to copy the object code is a network server, the
          Corresponding Source may be on a different server (operated by
          you or a third party) that supports equivalent copying
          facilities, provided you maintain clear directions next to the
          object code saying where to find the Corresponding Source.
          Regardless of what server hosts the Corresponding Source, you
          remain obligated to ensure that it is available for as long as
          needed to satisfy these requirements.

       e. Convey the object code using peer-to-peer transmission,
          provided you inform other peers where the object code and
          Corresponding Source of the work are being offered to the
          general public at no charge under subsection 6d.

     A separable portion of the object code, whose source code is
     excluded from the Corresponding Source as a System Library, need
     not be included in conveying the object code work.

     A "User Product" is either (1) a "consumer product", which means
     any tangible personal property which is normally used for personal,
     family, or household purposes, or (2) anything designed or sold for
     incorporation into a dwelling.  In determining whether a product is
     a consumer product, doubtful cases shall be resolved in favor of
     coverage.  For a particular product received by a particular user,
     "normally used" refers to a typical or common use of that class of
     product, regardless of the status of the particular user or of the
     way in which the particular user actually uses, or expects or is
     expected to use, the product.  A product is a consumer product
     regardless of whether the product has substantial commercial,
     industrial or non-consumer uses, unless such uses represent the
     only significant mode of use of the product.

     "Installation Information" for a User Product means any methods,
     procedures, authorization keys, or other information required to
     install and execute modified versions of a covered work in that
     User Product from a modified version of its Corresponding Source.
     The information must suffice to ensure that the continued
     functioning of the modified object code is in no case prevented or
     interfered with solely because modification has been made.

     If you convey an object code work under this section in, or with,
     or specifically for use in, a User Product, and the conveying
     occurs as part of a transaction in which the right of possession
     and use of the User Product is transferred to the recipient in
     perpetuity or for a fixed term (regardless of how the transaction
     is characterized), the Corresponding Source conveyed under this
     section must be accompanied by the Installation Information.  But
     this requirement does not apply if neither you nor any third party
     retains the ability to install modified object code on the User
     Product (for example, the work has been installed in ROM).

     The requirement to provide Installation Information does not
     include a requirement to continue to provide support service,
     warranty, or updates for a work that has been modified or installed
     by the recipient, or for the User Product in which it has been
     modified or installed.  Access to a network may be denied when the
     modification itself materially and adversely affects the operation
     of the network or violates the rules and protocols for
     communication across the network.

     Corresponding Source conveyed, and Installation Information
     provided, in accord with this section must be in a format that is
     publicly documented (and with an implementation available to the
     public in source code form), and must require no special password
     or key for unpacking, reading or copying.

  7. Additional Terms.

     "Additional permissions" are terms that supplement the terms of
     this License by making exceptions from one or more of its
     conditions.  Additional permissions that are applicable to the
     entire Program shall be treated as though they were included in
     this License, to the extent that they are valid under applicable
     law.  If additional permissions apply only to part of the Program,
     that part may be used separately under those permissions, but the
     entire Program remains governed by this License without regard to
     the additional permissions.

     When you convey a copy of a covered work, you may at your option
     remove any additional permissions from that copy, or from any part
     of it.  (Additional permissions may be written to require their own
     removal in certain cases when you modify the work.)  You may place
     additional permissions on material, added by you to a covered work,
     for which you have or can give appropriate copyright permission.

     Notwithstanding any other provision of this License, for material
     you add to a covered work, you may (if authorized by the copyright
     holders of that material) supplement the terms of this License with
     terms:

       a. Disclaiming warranty or limiting liability differently from
          the terms of sections 15 and 16 of this License; or

       b. Requiring preservation of specified reasonable legal notices
          or author attributions in that material or in the Appropriate
          Legal Notices displayed by works containing it; or

       c. Prohibiting misrepresentation of the origin of that material,
          or requiring that modified versions of such material be marked
          in reasonable ways as different from the original version; or

       d. Limiting the use for publicity purposes of names of licensors
          or authors of the material; or

       e. Declining to grant rights under trademark law for use of some
          trade names, trademarks, or service marks; or

       f. Requiring indemnification of licensors and authors of that
          material by anyone who conveys the material (or modified
          versions of it) with contractual assumptions of liability to
          the recipient, for any liability that these contractual
          assumptions directly impose on those licensors and authors.

     All other non-permissive additional terms are considered "further
     restrictions" within the meaning of section 10.  If the Program as
     you received it, or any part of it, contains a notice stating that
     it is governed by this License along with a term that is a further
     restriction, you may remove that term.  If a license document
     contains a further restriction but permits relicensing or conveying
     under this License, you may add to a covered work material governed
     by the terms of that license document, provided that the further
     restriction does not survive such relicensing or conveying.

     If you add terms to a covered work in accord with this section, you
     must place, in the relevant source files, a statement of the
     additional terms that apply to those files, or a notice indicating
     where to find the applicable terms.

     Additional terms, permissive or non-permissive, may be stated in
     the form of a separately written license, or stated as exceptions;
     the above requirements apply either way.

  8. Termination.

     You may not propagate or modify a covered work except as expressly
     provided under this License.  Any attempt otherwise to propagate or
     modify it is void, and will automatically terminate your rights
     under this License (including any patent licenses granted under the
     third paragraph of section 11).

     However, if you cease all violation of this License, then your
     license from a particular copyright holder is reinstated (a)
     provisionally, unless and until the copyright holder explicitly and
     finally terminates your license, and (b) permanently, if the
     copyright holder fails to notify you of the violation by some
     reasonable means prior to 60 days after the cessation.

     Moreover, your license from a particular copyright holder is
     reinstated permanently if the copyright holder notifies you of the
     violation by some reasonable means, this is the first time you have
     received notice of violation of this License (for any work) from
     that copyright holder, and you cure the violation prior to 30 days
     after your receipt of the notice.

     Termination of your rights under this section does not terminate
     the licenses of parties who have received copies or rights from you
     under this License.  If your rights have been terminated and not
     permanently reinstated, you do not qualify to receive new licenses
     for the same material under section 10.

  9. Acceptance Not Required for Having Copies.

     You are not required to accept this License in order to receive or
     run a copy of the Program.  Ancillary propagation of a covered work
     occurring solely as a consequence of using peer-to-peer
     transmission to receive a copy likewise does not require
     acceptance.  However, nothing other than this License grants you
     permission to propagate or modify any covered work.  These actions
     infringe copyright if you do not accept this License.  Therefore,
     by modifying or propagating a covered work, you indicate your
     acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

     Each time you convey a covered work, the recipient automatically
     receives a license from the original licensors, to run, modify and
     propagate that work, subject to this License.  You are not
     responsible for enforcing compliance by third parties with this
     License.

     An "entity transaction" is a transaction transferring control of an
     organization, or substantially all assets of one, or subdividing an
     organization, or merging organizations.  If propagation of a
     covered work results from an entity transaction, each party to that
     transaction who receives a copy of the work also receives whatever
     licenses to the work the party's predecessor in interest had or
     could give under the previous paragraph, plus a right to possession
     of the Corresponding Source of the work from the predecessor in
     interest, if the predecessor has it or can get it with reasonable
     efforts.

     You may not impose any further restrictions on the exercise of the
     rights granted or affirmed under this License.  For example, you
     may not impose a license fee, royalty, or other charge for exercise
     of rights granted under this License, and you may not initiate
     litigation (including a cross-claim or counterclaim in a lawsuit)
     alleging that any patent claim is infringed by making, using,
     selling, offering for sale, or importing the Program or any portion
     of it.

  11. Patents.

     A "contributor" is a copyright holder who authorizes use under this
     License of the Program or a work on which the Program is based.
     The work thus licensed is called the contributor's "contributor
     version".

     A contributor's "essential patent claims" are all patent claims
     owned or controlled by the contributor, whether already acquired or
     hereafter acquired, that would be infringed by some manner,
     permitted by this License, of making, using, or selling its
     contributor version, but do not include claims that would be
     infringed only as a consequence of further modification of the
     contributor version.  For purposes of this definition, "control"
     includes the right to grant patent sublicenses in a manner
     consistent with the requirements of this License.

     Each contributor grants you a non-exclusive, worldwide,
     royalty-free patent license under the contributor's essential
     patent claims, to make, use, sell, offer for sale, import and
     otherwise run, modify and propagate the contents of its contributor
     version.

     In the following three paragraphs, a "patent license" is any
     express agreement or commitment, however denominated, not to
     enforce a patent (such as an express permission to practice a
     patent or covenant not to sue for patent infringement).  To "grant"
     such a patent license to a party means to make such an agreement or
     commitment not to enforce a patent against the party.

     If you convey a covered work, knowingly relying on a patent
     license, and the Corresponding Source of the work is not available
     for anyone to copy, free of charge and under the terms of this
     License, through a publicly available network server or other
     readily accessible means, then you must either (1) cause the
     Corresponding Source to be so available, or (2) arrange to deprive
     yourself of the benefit of the patent license for this particular
     work, or (3) arrange, in a manner consistent with the requirements
     of this License, to extend the patent license to downstream
     recipients.  "Knowingly relying" means you have actual knowledge
     that, but for the patent license, your conveying the covered work
     in a country, or your recipient's use of the covered work in a
     country, would infringe one or more identifiable patents in that
     country that you have reason to believe are valid.

     If, pursuant to or in connection with a single transaction or
     arrangement, you convey, or propagate by procuring conveyance of, a
     covered work, and grant a patent license to some of the parties
     receiving the covered work authorizing them to use, propagate,
     modify or convey a specific copy of the covered work, then the
     patent license you grant is automatically extended to all
     recipients of the covered work and works based on it.

     A patent license is "discriminatory" if it does not include within
     the scope of its coverage, prohibits the exercise of, or is
     conditioned on the non-exercise of one or more of the rights that
     are specifically granted under this License.  You may not convey a
     covered work if you are a party to an arrangement with a third
     party that is in the business of distributing software, under which
     you make payment to the third party based on the extent of your
     activity of conveying the work, and under which the third party
     grants, to any of the parties who would receive the covered work
     from you, a discriminatory patent license (a) in connection with
     copies of the covered work conveyed by you (or copies made from
     those copies), or (b) primarily for and in connection with specific
     products or compilations that contain the covered work, unless you
     entered into that arrangement, or that patent license was granted,
     prior to 28 March 2007.

     Nothing in this License shall be construed as excluding or limiting
     any implied license or other defenses to infringement that may
     otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

     If conditions are imposed on you (whether by court order, agreement
     or otherwise) that contradict the conditions of this License, they
     do not excuse you from the conditions of this License.  If you
     cannot convey a covered work so as to satisfy simultaneously your
     obligations under this License and any other pertinent obligations,
     then as a consequence you may not convey it at all.  For example,
     if you agree to terms that obligate you to collect a royalty for
     further conveying from those to whom you convey the Program, the
     only way you could satisfy both those terms and this License would
     be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

     Notwithstanding any other provision of this License, you have
     permission to link or combine any covered work with a work licensed
     under version 3 of the GNU Affero General Public License into a
     single combined work, and to convey the resulting work.  The terms
     of this License will continue to apply to the part which is the
     covered work, but the special requirements of the GNU Affero
     General Public License, section 13, concerning interaction through
     a network will apply to the combination as such.

  14. Revised Versions of this License.

     The Free Software Foundation may publish revised and/or new
     versions of the GNU General Public License from time to time.  Such
     new versions will be similar in spirit to the present version, but
     may differ in detail to address new problems or concerns.

     Each version is given a distinguishing version number.  If the
     Program specifies that a certain numbered version of the GNU
     General Public License "or any later version" applies to it, you
     have the option of following the terms and conditions either of
     that numbered version or of any later version published by the Free
     Software Foundation.  If the Program does not specify a version
     number of the GNU General Public License, you may choose any
     version ever published by the Free Software Foundation.

     If the Program specifies that a proxy can decide which future
     versions of the GNU General Public License can be used, that
     proxy's public statement of acceptance of a version permanently
     authorizes you to choose that version for the Program.

     Later license versions may give you additional or different
     permissions.  However, no additional obligations are imposed on any
     author or copyright holder as a result of your choosing to follow a
     later version.

  15. Disclaimer of Warranty.

     THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
     APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE
     COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS"
     WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
     INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE
     RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.
     SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
     NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

     IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
     WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES
     AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR
     DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
     CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
     THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
     BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
     PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
     PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF
     THE POSSIBILITY OF SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

     If the disclaimer of warranty and limitation of liability provided
     above cannot be given local legal effect according to their terms,
     reviewing courts shall apply local law that most closely
     approximates an absolute waiver of all civil liability in
     connection with the Program, unless a warranty or assumption of
     liability accompanies a copy of the Program in return for a fee.

END OF TERMS AND CONDITIONS
===========================

How to Apply These Terms to Your New Programs
=============================================

If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.

   To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.

     ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES.
     Copyright (C) YEAR NAME OF AUTHOR

     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 3 of the License, or (at
     your option) any later version.

     This program is distributed in the hope that it will be useful, but
     WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     General Public License for more details.

     You should have received a copy of the GNU General Public License
     along with this program.  If not, see <http://www.gnu.org/licenses/>.

   Also add information on how to contact you by electronic and paper
mail.

   If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

     PROGRAM Copyright (C) YEAR NAME OF AUTHOR
     This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'.
     This is free software, and you are welcome to redistribute it
     under certain conditions; type 'show c' for details.

   The hypothetical commands 'show w' and 'show c' should show the
appropriate parts of the General Public License.  Of course, your
program's commands might be different; for a GUI interface, you would
use an "about box".

   You should also get your employer (if you work as a programmer) or
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  For more information on this, and how to apply and follow
the GNU GPL, see <http://www.gnu.org/licenses/>.

   The GNU General Public License does not permit incorporating your
program into proprietary programs.  If your program is a subroutine
library, you may consider it more useful to permit linking proprietary
applications with the library.  If this is what you want to do, use the
GNU Lesser General Public License instead of this License.  But first,
please read <http://www.gnu.org/philosophy/why-not-lgpl.html>.

