The main documentation of the Settings m4 Macros contains additional explanation of this code listing.
dnl dnl Author: Michael L. Hall dnl P.O. Box 1663, MS-D409, LANL dnl Los Alamos, NM 87545 dnl ph: 505-665-4312 dnl email: hall@lanl.gov dnl dnl Created on: 02/26/98 dnl Date: 03/21/00, 17:15:20 dnl Version: 6.8 dnl Change the quotation characters to avoid F90 conflicts. m4_changequote([,]) dnl Change the comment characters to eliminate m4 macro dnl expansion in F90 comments. m4_changecom([!]) dnl Redefine the "dnl" command to be unprefixed. Note that the "dnl" dnl command is nonfunctional before this definition is made, but that dnl unwanted output from the processing of this file is avoided by dnl diverting the entire output (up until now) to nowhere. (Notice the dnl m4_divert(-1) command in the initialization.) m4_define([dnl],m4_defn([m4_dnl])) m4_divert dnl Define unprefixed versions of m4 builtin macros that are dnl commonly used. All other m4 builtin macros must be prefixed dnl by "m4_". m4_define([define],m4_defn([m4_define])) m4_define([ifdef],m4_defn([m4_ifdef])) m4_define([ifelse],m4_defn([m4_ifelse])) m4_define([include],m4_defn([m4_include])) m4_define([popdef],m4_defn([m4_popdef])) m4_define([pushdef],m4_defn([m4_pushdef])) m4_define([undefine],m4_defn([m4_undefine])) dnl The m4_chop macro (based on perl's chop command) returns the dnl input string minus its final character. m4_chop is useful for dnl removing "\n" from m4_esyscmd strings. define([m4_chop], [m4_substr($1, 0, m4_decr(m4_len($1)))]) dnl Define cpp-style predefined macros for date and time information. dnl These names correspond to those described in "The C Programming dnl Language", B. W. Kernighan and D. M. Ritchie (1988), page 233. dnl The __file__ and __line__ predefined macros are already defined dnl in Gnu m4, but are redefined here to remove the "m4_" prefix. define([__date__], [m4_chop(m4_esyscmd(date +%D))]) define([__time__], [m4_chop(m4_esyscmd(date +%T))]) define([__file__], m4_defn([m4___file__])) define([__line__], m4_defn([m4___line__])) dnl The m4_die macro (based on perl's die command) prints an error dnl message and then terminates. define([m4_die],[m4_errprint([m4:]__FILE__:__LINE__: [$1]) m4_m4exit(1)]) dnl The expand macro is used to force macro expansion in a word dnl containing underscores, since underscores are not a word-delimiter dnl in standard m4. define([expand], [m4_translit(m4_translit([$1], [_], [*]), [*], [_])]) dnl The forloop macro, which iterates a section of text numerically, dnl letting the loop variable take on successive numerical values when dnl expressing the section of text. This version is better than the dnl version in the Gnu m4 manual because it checks for the case of dnl starting loop value greater than final loop value, and produces dnl no output when this occurs. dnl dnl The arguments for the forloop macro are: dnl dnl $1 - The name of the iteration variable. dnl $2 - The starting value. dnl $3 - The final value. dnl $4 - The text to be expanded for each iteration. define([forloop], [ifelse( m4_eval($2 > $3), 1, [], m4_eval($2 <= $3), 1, [pushdef([$1], [$2])$4[]popdef([$1])])[]dnl ifelse( m4_eval($2 < $3), 1, [forloop([$1], m4_incr($2), [$3], [$4])])]) dnl The firstword and tailwords macros operate on a space-delimited list dnl of words. The firstword macro returns the first word in the list, and dnl the tailwords macro returns a space-delimited list of words derived dnl by eliminating the first word. define([firstword], [ifelse( m4_index([$1], [ ]), [-1], [$1], [m4_substr([$1],0,m4_index([$1], [ ]))])[]dnl ]) define([tailwords], [ifelse( m4_index([$1], [ ]), [-1], [], [m4_substr([$1],m4_incr(m4_index([$1], [ ])))])[]dnl ]) dnl The fortext macro is similar to the forloop macro, except that the dnl loop variable takes on successive textual values instead of numerical dnl values. The arguments for the fortext macro are: dnl dnl $1 - The name of the iteration variable. dnl $2 - A string of values for the iteration variable, separated by dnl spaces. dnl $3 - The text to be expanded for each iteration. define([fortext], [ifelse( firstword($2), [], [], [pushdef([$1],[firstword($2)])$3[]fortext( [$1], tailwords($2), [$3])])popdef([$1])[]dnl ])