(m4.info)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.), 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'.


automatically generated by info2www