DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 

(m4.info.gz) M4wrap

Info Catalog (m4.info.gz) Changeword (m4.info.gz) Input Control
 
 7.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.
 
    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: ERROR: end of file in argument list
 
Info Catalog (m4.info.gz) Changeword (m4.info.gz) Input Control
automatically generated byinfo2html