manpagez: man pages & more
info m4
Home | html | info | man

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

© manpagez.com 2000-2025
Individual documents may contain additional copyright information.