Command:   m4 - macro processor
Syntax:    m4 [-D name = value] [-U name]
Flags:     -D  Define a symbol
           -U  Undefine a symbol
Example:   m4 <m4test               # Run M4

     M4 is a macro processor intended as a front end for Ratfor, Pascal,
and  other  languages  that  do  not  have  a  built-in macro processing
capability.  M4 reads standard input, the processed text is  written  on
the standard output.

     The options and their effects are as follows:

      -D name[=val]  Defines name to val, or to null in val's absence.
      -U name        Undefines name.

     Macro calls have the form: name(arg1,arg2, ..., argn)

The '(' must immediately follow the name of the macro. If the name of  a
defined  macro  is  not followed by a ( it is taken to be a call of that
macro with no arguments, i.e. name().  Potential macro names consist  of
alphabetic letters and digits.

     Leading unquoted  blanks,  tabs  and  newlines  are  ignored  while
collecting  arguments.   Left  and right single quotes are used to quote
strings.  The value of a quoted string is the  string  stripped  of  the

     When a macro name is recognized, its  arguments  are  collected  by
searching for a matching ).  If fewer arguments are supplied than are in
the macro definition, the trailing  arguments  are  taken  to  be  null.
Macro   evaluation  proceeds  normally  during  the  collection  of  the
arguments, and any commas or right parentheses which happen to  turn  up
within  the  value  of  a  nested  call are as effective as those in the
original input text.  (This is typically referred as   inside-out  macro
expansion.)  After argument collection, the value of the macro is pushed
back onto the input stream and rescanned.

     M4 makes available the following  built-in  macros.   They  may  be
redefined,  but  once  this is done the original meaning is lost.  Their
values are null unless otherwise stated.

     define "(name [, val])" the second argument  is  installed  as  the
value  of  the  macro  whose name is the first argument.  If there is no
second argument, the value is null.  Each  occurrence  of  $  n  in  the
replacement text, where n is a digit, is replaced by the n -th argument.
Argument 0 is the name of the macro; missing arguments are  replaced  by
the null string.

     defn "(name [, name ...])" returns the  quoted  definition  of  its
argument(s). Useful in renaming macros.

     undefine "(name [,  name  ...])"  removes  the  definition  of  the
macro(s)  named.  If  there  is  more  than one definition for the named
macro, (due to previous use of pushdef) all definitions are removed.

     pushdef "(name [,  val])"  like  define,  but  saves  any  previous
definition by stacking the current definition.

     popdef "(name [, name ...])"  removes  current  definition  of  its
argument(s), exposing the previous one if any.

     ifdef "(name, if-def [,  ifnot-def])"  if  the  first  argument  is
defined,  the  value  is  the  second argument, otherwise the third.  If
there is no third argument, the value is null.  A  word  indicating  the
current operating system is predefined.  (e.g. unix or vms).

     shift "(arg, arg, arg, ...)" returns all but  its  first  argument.
The  other  arguments are quoted and pushed back with commas in between.
The  quoting  nullifies  the  effect  of  the  extra  scan   that   will
subsequently be performed.

     changequote "(lqchar, rqchar)" change quote symbols  to  the  first
and  second  arguments.  With no arguments, the quotes are reset back to
the default characters. (i.e., `').

     changecom "(lcchar, rcchar)" change left and right comment  markers
from  the  default  #  and  newline.   With  no  arguments,  the comment
mechanism is reset back to the default characters.  With  one  argument,
the  left  marker  becomes  the  argument  and  the right marker becomes
newline.  With two arguments, both markers are affected.

     divert  "(divnum)"  maintains  10  output  streams,  numbered  0-9.
Initially  stream  0 is the current stream. The divert macro changes the
current output stream to its (digit-string) argument.   Output  diverted
to a stream other than 0 through 9 is lost.

     undivert "([divnum [, divnum ...]])"  causes  immediate  output  of
text  from  diversions  named  as  argument(s),  or all diversions if no
argument.  Text may be undiverted into another  diversion.   Undiverting
discards the diverted text. At the end of input processing, M4 forces an
automatic undivert unless is defined.

     divnum "()" returns the value of the current output stream.

     dnl "()" reads and discards characters up to and including the next

     ifelse "(arg, arg, if-same [, ifnot-same  |  arg,  arg  ...])"  has
three  or  more  arguments.  If the first argument is the same string as
the second, then the value is the third argument.  If not, and if  there
are  more than four arguments, the process is repeated with arguments 4,
5, 6 and 7.  Otherwise, the value is either the fourth string, or, if it
is not present, null.

     incr "(num)" returns the value of its argument  incremented  by  1.
The  value  of  the  argument  is  calculated by interpreting an initial
digit-string as a decimal number.

     decr "(num)" returns the value of its argument decremented by 1.

     eval  "(expression)"  evaluates  its   argument   as   a   constant
expression,  using integer arithmetic.  The evaluation mechanism is very
similar to that of cpp (#if expression).   The  expression  can  involve
only  integer  constants  and character constants, possibly connected by
the binary operators

      *    /    %    +    -    >>   <<    <    >   <=   >=   ==   !=   &
      ^    |     &&   ||

or the unary operators - ! or tilde or by the ternary  operator  ?  :  .
Parentheses  may be used for grouping. Octal numbers may be specified as
in C.

     len "(string)" returns the number of characters in its argument.

     index "(search-string, string)" returns the position in  its  first
argument  where  the  second  argument begins (zero origin), or 1 if the
second argument does not occur.

     substr "(string, index [, length])"  returns  a  substring  of  its
first  argument.  The  second argument is a zero origin number selecting
the first character (internally treated as  an  expression);  the  third
argument  indicates  the  length  of  the  substring.   A  missing third
argument is taken to be large enough to extend to the end of  the  first

     translit  "(source, from [, to])" transliterates the characters  in
its  first argument from the set given by the second argument to the set
given by the third.  If the third argument is shorter than  the  second,
all  extra  characters in the second argument are deleted from the first
argument. If the third argument is missing altogether, all characters in
the second argument are deleted from the first argument.

     include "(filename)" returns the contents of the file that is named
in the argument.

     sinclude "(filename)"is identical to include, except that  it  says
nothing if the file is inaccessable.

     paste "(filename)" returns the contents of the file  named  in  the
argument without any processing, unlike include.

     spaste "(filename)" is identical to  paste,  except  that  it  says
nothing if the file is inaccessibl[De.

     syscmd "(command)" executes the UNIX command  given  in  the  first
argument. No value is returned.

     sysval "()" is the return code from the last call to syscmd.
 .PP maketemp '(string)" fills in a string of  XXXXXX  in  its  argument
with the current process ID.

     m4exit "([exitcode])" causes immediate exit from M4.   Argument  1,
if given, is the exit code; the default is 0.

     m4wrap "(m4-macro-or-built-n)" argument 1 will be  pushed  back  at
final EOF; example: m4wrap(`dumptable()').

     errprint "(str [,  str,  str,  ...])"  prints  its  argument(s)  on
stderr.  If  there is more than one argument, each argument is separated
by a space during the output.  An arbitrary number of arguments  may  be

     dumpdef "([name, name, ...])" prints current names and definitions,
for the named items, or for all if no arguments are given.


     M4 was written by Ozan S. Yigif.