Annotation of win32/tools/cygwin/usr/share/bison/m4sugar/m4sugar.m4, revision 1.1

1.1     ! misha       1: divert(-1)#                                                  -*- Autoconf -*-
        !             2: # This file is part of Autoconf.
        !             3: # Base M4 layer.
        !             4: # Requires GNU M4.
        !             5: #
        !             6: # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
        !             7: # 2008 Free Software Foundation, Inc.
        !             8: #
        !             9: # This program is free software: you can redistribute it and/or modify
        !            10: # it under the terms of the GNU General Public License as published by
        !            11: # the Free Software Foundation, either version 3 of the License, or
        !            12: # (at your option) any later version.
        !            13: #
        !            14: # This program is distributed in the hope that it will be useful,
        !            15: # but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            16: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            17: # GNU General Public License for more details.
        !            18: #
        !            19: # You should have received a copy of the GNU General Public License
        !            20: # along with this program.  If not, see <http://www.gnu.org/licenses/>.
        !            21: 
        !            22: # As a special exception, the Free Software Foundation gives unlimited
        !            23: # permission to copy, distribute and modify the configure scripts that
        !            24: # are the output of Autoconf.  You need not follow the terms of the GNU
        !            25: # General Public License when using or distributing such scripts, even
        !            26: # though portions of the text of Autoconf appear in them.  The GNU
        !            27: # General Public License (GPL) does govern all other use of the material
        !            28: # that constitutes the Autoconf program.
        !            29: #
        !            30: # Certain portions of the Autoconf source text are designed to be copied
        !            31: # (in certain cases, depending on the input) into the output of
        !            32: # Autoconf.  We call these the "data" portions.  The rest of the Autoconf
        !            33: # source text consists of comments plus executable code that decides which
        !            34: # of the data portions to output in any given case.  We call these
        !            35: # comments and executable code the "non-data" portions.  Autoconf never
        !            36: # copies any of the non-data portions into its output.
        !            37: #
        !            38: # This special exception to the GPL applies to versions of Autoconf
        !            39: # released by the Free Software Foundation.  When you make and
        !            40: # distribute a modified version of Autoconf, you may extend this special
        !            41: # exception to the GPL to apply to your modified version as well, *unless*
        !            42: # your modified version has the potential to copy into its output some
        !            43: # of the text that was the non-data portion of the version that you started
        !            44: # with.  (In other words, unless your change moves or copies text from
        !            45: # the non-data portions to the data portions.)  If your modification has
        !            46: # such potential, you must delete any notice of this special exception
        !            47: # to the GPL from your modified version.
        !            48: #
        !            49: # Written by Akim Demaille.
        !            50: #
        !            51: 
        !            52: # Set the quotes, whatever the current quoting system.
        !            53: changequote()
        !            54: changequote([, ])
        !            55: 
        !            56: # Some old m4's don't support m4exit.  But they provide
        !            57: # equivalent functionality by core dumping because of the
        !            58: # long macros we define.
        !            59: ifdef([__gnu__], ,
        !            60: [errprint(M4sugar requires GNU M4. Install it before installing M4sugar or
        !            61: set the M4 environment variable to its absolute file name.)
        !            62: m4exit(2)])
        !            63: 
        !            64: 
        !            65: ## ------------------------------- ##
        !            66: ## 1. Simulate --prefix-builtins.  ##
        !            67: ## ------------------------------- ##
        !            68: 
        !            69: # m4_define
        !            70: # m4_defn
        !            71: # m4_undefine
        !            72: define([m4_define],   defn([define]))
        !            73: define([m4_defn],     defn([defn]))
        !            74: define([m4_undefine], defn([undefine]))
        !            75: 
        !            76: m4_undefine([define])
        !            77: m4_undefine([defn])
        !            78: m4_undefine([undefine])
        !            79: 
        !            80: 
        !            81: # m4_copy(SRC, DST)
        !            82: # -----------------
        !            83: # Define DST as the definition of SRC.
        !            84: # What's the difference between:
        !            85: # 1. m4_copy([from], [to])
        !            86: # 2. m4_define([to], [from($@)])
        !            87: # Well, obviously 1 is more expensive in space.  Maybe 2 is more expensive
        !            88: # in time, but because of the space cost of 1, it's not that obvious.
        !            89: # Nevertheless, one huge difference is the handling of `$0'.  If `from'
        !            90: # uses `$0', then with 1, `to''s `$0' is `to', while it is `from' in 2.
        !            91: # The user would certainly prefer to see `to'.
        !            92: m4_define([m4_copy],
        !            93: [m4_define([$2], m4_defn([$1]))])
        !            94: 
        !            95: 
        !            96: # m4_rename(SRC, DST)
        !            97: # -------------------
        !            98: # Rename the macro SRC to DST.
        !            99: m4_define([m4_rename],
        !           100: [m4_copy([$1], [$2])m4_undefine([$1])])
        !           101: 
        !           102: 
        !           103: # m4_rename_m4(MACRO-NAME)
        !           104: # ------------------------
        !           105: # Rename MACRO-NAME to m4_MACRO-NAME.
        !           106: m4_define([m4_rename_m4],
        !           107: [m4_rename([$1], [m4_$1])])
        !           108: 
        !           109: 
        !           110: # m4_copy_unm4(m4_MACRO-NAME)
        !           111: # ---------------------------
        !           112: # Copy m4_MACRO-NAME to MACRO-NAME.
        !           113: m4_define([m4_copy_unm4],
        !           114: [m4_copy([$1], m4_bpatsubst([$1], [^m4_\(.*\)], [[\1]]))])
        !           115: 
        !           116: 
        !           117: # Some m4 internals have names colliding with tokens we might use.
        !           118: # Rename them a` la `m4 --prefix-builtins'.  Conditionals first, since
        !           119: # some subsequent renames are conditional.
        !           120: m4_rename_m4([ifdef])
        !           121: m4_rename([ifelse], [m4_if])
        !           122: 
        !           123: m4_rename_m4([builtin])
        !           124: m4_rename_m4([changecom])
        !           125: m4_rename_m4([changequote])
        !           126: m4_ifdef([changeword],dnl conditionally available in 1.4.x
        !           127: [m4_undefine([changeword])])
        !           128: m4_rename_m4([debugfile])
        !           129: m4_rename_m4([debugmode])
        !           130: m4_rename_m4([decr])
        !           131: m4_undefine([divert])
        !           132: m4_rename_m4([divnum])
        !           133: m4_rename_m4([dumpdef])
        !           134: m4_rename_m4([errprint])
        !           135: m4_rename_m4([esyscmd])
        !           136: m4_rename_m4([eval])
        !           137: m4_rename_m4([format])
        !           138: m4_undefine([include])
        !           139: m4_rename_m4([incr])
        !           140: m4_rename_m4([index])
        !           141: m4_rename_m4([indir])
        !           142: m4_rename_m4([len])
        !           143: m4_rename([m4exit], [m4_exit])
        !           144: m4_undefine([m4wrap])
        !           145: m4_ifdef([mkstemp],dnl added in M4 1.4.8
        !           146: [m4_rename_m4([mkstemp])
        !           147: m4_copy([m4_mkstemp], [m4_maketemp])
        !           148: m4_undefine([maketemp])],
        !           149: [m4_rename_m4([maketemp])
        !           150: m4_copy([m4_maketemp], [m4_mkstemp])])
        !           151: m4_rename([patsubst], [m4_bpatsubst])
        !           152: m4_rename_m4([popdef])
        !           153: m4_rename_m4([pushdef])
        !           154: m4_rename([regexp], [m4_bregexp])
        !           155: m4_rename_m4([shift])
        !           156: m4_undefine([sinclude])
        !           157: m4_rename_m4([substr])
        !           158: m4_ifdef([symbols],dnl present only in alpha-quality 1.4o
        !           159: [m4_rename_m4([symbols])])
        !           160: m4_rename_m4([syscmd])
        !           161: m4_rename_m4([sysval])
        !           162: m4_rename_m4([traceoff])
        !           163: m4_rename_m4([traceon])
        !           164: m4_rename_m4([translit])
        !           165: m4_undefine([undivert])
        !           166: 
        !           167: 
        !           168: ## ------------------- ##
        !           169: ## 2. Error messages.  ##
        !           170: ## ------------------- ##
        !           171: 
        !           172: 
        !           173: # m4_location
        !           174: # -----------
        !           175: m4_define([m4_location],
        !           176: [__file__:__line__])
        !           177: 
        !           178: 
        !           179: # m4_errprintn(MSG)
        !           180: # -----------------
        !           181: # Same as `errprint', but with the missing end of line.
        !           182: m4_define([m4_errprintn],
        !           183: [m4_errprint([$1
        !           184: ])])
        !           185: 
        !           186: 
        !           187: # m4_warning(MSG)
        !           188: # ---------------
        !           189: # Warn the user.
        !           190: m4_define([m4_warning],
        !           191: [m4_errprintn(m4_location[: warning: $1])])
        !           192: 
        !           193: 
        !           194: # m4_fatal(MSG, [EXIT-STATUS])
        !           195: # ----------------------------
        !           196: # Fatal the user.                                                      :)
        !           197: m4_define([m4_fatal],
        !           198: [m4_errprintn(m4_location[: error: $1])dnl
        !           199: m4_expansion_stack_dump()dnl
        !           200: m4_exit(m4_if([$2],, 1, [$2]))])
        !           201: 
        !           202: 
        !           203: # m4_assert(EXPRESSION, [EXIT-STATUS = 1])
        !           204: # ----------------------------------------
        !           205: # This macro ensures that EXPRESSION evaluates to true, and exits if
        !           206: # EXPRESSION evaluates to false.
        !           207: m4_define([m4_assert],
        !           208: [m4_if(m4_eval([$1]), 0,
        !           209:        [m4_fatal([assert failed: $1], [$2])])])
        !           210: 
        !           211: 
        !           212: 
        !           213: ## ------------- ##
        !           214: ## 3. Warnings.  ##
        !           215: ## ------------- ##
        !           216: 
        !           217: 
        !           218: # _m4_warn(CATEGORY, MESSAGE, STACK-TRACE)
        !           219: # ----------------------------------------
        !           220: # Report a MESSAGE to the user if the CATEGORY of warnings is enabled.
        !           221: # This is for traces only.
        !           222: # The STACK-TRACE is a \n-separated list of "LOCATION: MESSAGE".
        !           223: #
        !           224: # Within m4, the macro is a no-op.  This macro really matters
        !           225: # when autom4te post-processes the trace output.
        !           226: m4_define([_m4_warn], [])
        !           227: 
        !           228: 
        !           229: # m4_warn(CATEGORY, MESSAGE)
        !           230: # --------------------------
        !           231: # Report a MESSAGE to the user if the CATEGORY of warnings is enabled.
        !           232: m4_define([m4_warn],
        !           233: [_m4_warn([$1], [$2],
        !           234: m4_ifdef([m4_expansion_stack],
        !           235:         [_m4_defn([m4_expansion_stack])
        !           236: m4_location[: the top level]]))dnl
        !           237: ])
        !           238: 
        !           239: 
        !           240: 
        !           241: ## ------------------- ##
        !           242: ## 4. File inclusion.  ##
        !           243: ## ------------------- ##
        !           244: 
        !           245: 
        !           246: # We also want to neutralize include (and sinclude for symmetry),
        !           247: # but we want to extend them slightly: warn when a file is included
        !           248: # several times.  This is, in general, a dangerous operation, because
        !           249: # too many people forget to quote the first argument of m4_define.
        !           250: #
        !           251: # For instance in the following case:
        !           252: #   m4_define(foo, [bar])
        !           253: # then a second reading will turn into
        !           254: #   m4_define(bar, [bar])
        !           255: # which is certainly not what was meant.
        !           256: 
        !           257: # m4_include_unique(FILE)
        !           258: # -----------------------
        !           259: # Declare that the FILE was loading; and warn if it has already
        !           260: # been included.
        !           261: m4_define([m4_include_unique],
        !           262: [m4_ifdef([m4_include($1)],
        !           263:          [m4_warn([syntax], [file `$1' included several times])])dnl
        !           264: m4_define([m4_include($1)])])
        !           265: 
        !           266: 
        !           267: # m4_include(FILE)
        !           268: # ----------------
        !           269: # Like the builtin include, but warns against multiple inclusions.
        !           270: m4_define([m4_include],
        !           271: [m4_include_unique([$1])dnl
        !           272: m4_builtin([include], [$1])])
        !           273: 
        !           274: 
        !           275: # m4_sinclude(FILE)
        !           276: # -----------------
        !           277: # Like the builtin sinclude, but warns against multiple inclusions.
        !           278: m4_define([m4_sinclude],
        !           279: [m4_include_unique([$1])dnl
        !           280: m4_builtin([sinclude], [$1])])
        !           281: 
        !           282: 
        !           283: 
        !           284: ## ------------------------------------ ##
        !           285: ## 5. Additional branching constructs.  ##
        !           286: ## ------------------------------------ ##
        !           287: 
        !           288: # Both `m4_ifval' and `m4_ifset' tests against the empty string.  The
        !           289: # difference is that `m4_ifset' is specialized on macros.
        !           290: #
        !           291: # In case of arguments of macros, eg. $1, it makes little difference.
        !           292: # In the case of a macro `FOO', you don't want to check `m4_ifval(FOO,
        !           293: # TRUE)', because if `FOO' expands with commas, there is a shifting of
        !           294: # the arguments.  So you want to run `m4_ifval([FOO])', but then you just
        !           295: # compare the *string* `FOO' against `', which, of course fails.
        !           296: #
        !           297: # So you want the variation `m4_ifset' that expects a macro name as $1.
        !           298: # If this macro is both defined and defined to a non empty value, then
        !           299: # it runs TRUE, etc.
        !           300: 
        !           301: 
        !           302: # m4_ifval(COND, [IF-TRUE], [IF-FALSE])
        !           303: # -------------------------------------
        !           304: # If COND is not the empty string, expand IF-TRUE, otherwise IF-FALSE.
        !           305: # Comparable to m4_ifdef.
        !           306: m4_define([m4_ifval],
        !           307: [m4_if([$1], [], [$3], [$2])])
        !           308: 
        !           309: 
        !           310: # m4_n(TEXT)
        !           311: # ----------
        !           312: # If TEXT is not empty, return TEXT and a new line, otherwise nothing.
        !           313: m4_define([m4_n],
        !           314: [m4_if([$1],
        !           315:        [], [],
        !           316:           [$1
        !           317: ])])
        !           318: 
        !           319: 
        !           320: # m4_ifvaln(COND, [IF-TRUE], [IF-FALSE])
        !           321: # --------------------------------------
        !           322: # Same as `m4_ifval', but add an extra newline to IF-TRUE or IF-FALSE
        !           323: # unless that argument is empty.
        !           324: m4_define([m4_ifvaln],
        !           325: [m4_if([$1],
        !           326:        [],   [m4_n([$3])],
        !           327:             [m4_n([$2])])])
        !           328: 
        !           329: 
        !           330: # m4_ifset(MACRO, [IF-TRUE], [IF-FALSE])
        !           331: # --------------------------------------
        !           332: # If MACRO has no definition, or of its definition is the empty string,
        !           333: # expand IF-FALSE, otherwise IF-TRUE.
        !           334: m4_define([m4_ifset],
        !           335: [m4_ifdef([$1],
        !           336:          [m4_ifval(_m4_defn([$1]), [$2], [$3])],
        !           337:          [$3])])
        !           338: 
        !           339: 
        !           340: # m4_ifndef(NAME, [IF-NOT-DEFINED], [IF-DEFINED])
        !           341: # -----------------------------------------------
        !           342: m4_define([m4_ifndef],
        !           343: [m4_ifdef([$1], [$3], [$2])])
        !           344: 
        !           345: 
        !           346: # m4_case(SWITCH, VAL1, IF-VAL1, VAL2, IF-VAL2, ..., DEFAULT)
        !           347: # -----------------------------------------------------------
        !           348: # m4 equivalent of
        !           349: # switch (SWITCH)
        !           350: # {
        !           351: #   case VAL1:
        !           352: #     IF-VAL1;
        !           353: #     break;
        !           354: #   case VAL2:
        !           355: #     IF-VAL2;
        !           356: #     break;
        !           357: #   ...
        !           358: #   default:
        !           359: #     DEFAULT;
        !           360: #     break;
        !           361: # }.
        !           362: # All the values are optional, and the macro is robust to active
        !           363: # symbols properly quoted.
        !           364: #
        !           365: # Please keep foreach.m4 in sync with any adjustments made here.
        !           366: m4_define([m4_case],
        !           367: [m4_if([$#], 0, [],
        !           368:        [$#], 1, [],
        !           369:        [$#], 2, [$2],
        !           370:        [$1], [$2], [$3],
        !           371:        [$0([$1], m4_shift3($@))])])
        !           372: 
        !           373: 
        !           374: # m4_bmatch(SWITCH, RE1, VAL1, RE2, VAL2, ..., DEFAULT)
        !           375: # -----------------------------------------------------
        !           376: # m4 equivalent of
        !           377: #
        !           378: # if (SWITCH =~ RE1)
        !           379: #   VAL1;
        !           380: # elif (SWITCH =~ RE2)
        !           381: #   VAL2;
        !           382: # elif ...
        !           383: #   ...
        !           384: # else
        !           385: #   DEFAULT
        !           386: #
        !           387: # All the values are optional, and the macro is robust to active symbols
        !           388: # properly quoted.
        !           389: #
        !           390: # Please keep foreach.m4 in sync with any adjustments made here.
        !           391: m4_define([m4_bmatch],
        !           392: [m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])],
        !           393:        [$#], 1, [m4_fatal([$0: too few arguments: $#: $1])],
        !           394:        [$#], 2, [$2],
        !           395:        [m4_if(m4_bregexp([$1], [$2]), -1, [$0([$1], m4_shift3($@))],
        !           396:              [$3])])])
        !           397: 
        !           398: 
        !           399: # m4_car(LIST)
        !           400: # m4_cdr(LIST)
        !           401: # ------------
        !           402: # Manipulate m4 lists.
        !           403: m4_define([m4_car], [[$1]])
        !           404: m4_define([m4_cdr],
        !           405: [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
        !           406:        [$#], 1, [],
        !           407:        [m4_dquote(m4_shift($@))])])
        !           408: 
        !           409: # _m4_cdr(LIST)
        !           410: # -------------
        !           411: # Like m4_cdr, except include a leading comma unless only one element
        !           412: # remains.  Why?  Because comparing a large list against [] is more
        !           413: # expensive in expansion time than comparing the number of arguments; so
        !           414: # _m4_cdr can be used to reduce the number of arguments when it is time
        !           415: # to end recursion.
        !           416: m4_define([_m4_cdr],
        !           417: [m4_if([$#], 1, [],
        !           418:        [, m4_dquote(m4_shift($@))])])
        !           419: 
        !           420: 
        !           421: 
        !           422: # m4_cond(TEST1, VAL1, IF-VAL1, TEST2, VAL2, IF-VAL2, ..., [DEFAULT])
        !           423: # -------------------------------------------------------------------
        !           424: # Similar to m4_if, except that each TEST is expanded when encountered.
        !           425: # If the expansion of TESTn matches the string VALn, the result is IF-VALn.
        !           426: # The result is DEFAULT if no tests passed.  This macro allows
        !           427: # short-circuiting of expensive tests, where it pays to arrange quick
        !           428: # filter tests to run first.
        !           429: #
        !           430: # For an example, consider a previous implementation of _AS_QUOTE_IFELSE:
        !           431: #
        !           432: #    m4_if(m4_index([$1], [\]), [-1], [$2],
        !           433: #          m4_eval(m4_index([$1], [\\]) >= 0), [1], [$2],
        !           434: #          m4_eval(m4_index([$1], [\$]) >= 0), [1], [$2],
        !           435: #          m4_eval(m4_index([$1], [\`]) >= 0), [1], [$3],
        !           436: #          m4_eval(m4_index([$1], [\"]) >= 0), [1], [$3],
        !           437: #          [$2])
        !           438: #
        !           439: # Here, m4_index is computed 5 times, and m4_eval 4, even if $1 contains
        !           440: # no backslash.  It is more efficient to do:
        !           441: #
        !           442: #    m4_cond([m4_index([$1], [\])], [-1], [$2],
        !           443: #            [m4_eval(m4_index([$1], [\\]) >= 0)], [1], [$2],
        !           444: #            [m4_eval(m4_index([$1], [\$]) >= 0)], [1], [$2],
        !           445: #            [m4_eval(m4_index([$1], [\`]) >= 0)], [1], [$3],
        !           446: #            [m4_eval(m4_index([$1], [\"]) >= 0)], [1], [$3],
        !           447: #            [$2])
        !           448: #
        !           449: # In the common case of $1 with no backslash, only one m4_index expansion
        !           450: # occurs, and m4_eval is avoided altogether.
        !           451: #
        !           452: # Please keep foreach.m4 in sync with any adjustments made here.
        !           453: m4_define([m4_cond],
        !           454: [m4_if([$#], [0], [m4_fatal([$0: cannot be called without arguments])],
        !           455:        [$#], [1], [$1],
        !           456:        m4_eval([$# % 3]), [2], [m4_fatal([$0: missing an argument])],
        !           457:        [_$0($@)])])
        !           458: 
        !           459: m4_define([_m4_cond],
        !           460: [m4_if(($1), [($2)], [$3],
        !           461:        [$#], [3], [],
        !           462:        [$#], [4], [$4],
        !           463:        [$0(m4_shift3($@))])])
        !           464: 
        !           465: 
        !           466: ## ---------------------------------------- ##
        !           467: ## 6. Enhanced version of some primitives.  ##
        !           468: ## ---------------------------------------- ##
        !           469: 
        !           470: # m4_bpatsubsts(STRING, RE1, SUBST1, RE2, SUBST2, ...)
        !           471: # ----------------------------------------------------
        !           472: # m4 equivalent of
        !           473: #
        !           474: #   $_ = STRING;
        !           475: #   s/RE1/SUBST1/g;
        !           476: #   s/RE2/SUBST2/g;
        !           477: #   ...
        !           478: #
        !           479: # All the values are optional, and the macro is robust to active symbols
        !           480: # properly quoted.
        !           481: #
        !           482: # I would have liked to name this macro `m4_bpatsubst', unfortunately,
        !           483: # due to quotation problems, I need to double quote $1 below, therefore
        !           484: # the anchors are broken :(  I can't let users be trapped by that.
        !           485: #
        !           486: # Recall that m4_shift3 always results in an argument.  Hence, we need
        !           487: # to distinguish between a final deletion vs. ending recursion.
        !           488: #
        !           489: # Please keep foreach.m4 in sync with any adjustments made here.
        !           490: m4_define([m4_bpatsubsts],
        !           491: [m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])],
        !           492:        [$#], 1, [m4_fatal([$0: too few arguments: $#: $1])],
        !           493:        [$#], 2, [m4_unquote(m4_builtin([patsubst], [[$1]], [$2]))],
        !           494:        [$#], 3, [m4_unquote(m4_builtin([patsubst], [[$1]], [$2], [$3]))],
        !           495:        [_$0($@m4_if(m4_eval($# & 1), 0, [,]))])])
        !           496: m4_define([_m4_bpatsubsts],
        !           497: [m4_if([$#], 2, [$1],
        !           498:        [$0(m4_builtin([patsubst], [[$1]], [$2], [$3]),
        !           499:           m4_shift3($@))])])
        !           500: 
        !           501: 
        !           502: # m4_define_default(MACRO, VALUE)
        !           503: # -------------------------------
        !           504: # If MACRO is undefined, set it to VALUE.
        !           505: m4_define([m4_define_default],
        !           506: [m4_ifndef([$1], [m4_define($@)])])
        !           507: 
        !           508: 
        !           509: # m4_default(EXP1, EXP2)
        !           510: # ----------------------
        !           511: # Returns EXP1 if non empty, otherwise EXP2.
        !           512: #
        !           513: # This macro is called on hot paths, so inline the contents of m4_ifval,
        !           514: # for one less round of expansion.
        !           515: m4_define([m4_default],
        !           516: [m4_if([$1], [], [$2], [$1])])
        !           517: 
        !           518: 
        !           519: # m4_defn(NAME)
        !           520: # -------------
        !           521: # Like the original, except guarantee a warning when using something which is
        !           522: # undefined (unlike M4 1.4.x).  This replacement is not a full-featured
        !           523: # replacement: if any of the defined macros contain unbalanced quoting, but
        !           524: # when pasted together result in a well-quoted string, then only native m4
        !           525: # support is able to get it correct.  But that's where quadrigraphs come in
        !           526: # handy, if you really need unbalanced quotes inside your macros.
        !           527: #
        !           528: # This macro is called frequently, so minimize the amount of additional
        !           529: # expansions by skipping m4_ifndef.  Better yet, if __m4_version__ exists,
        !           530: # (added in M4 1.6), then let m4 do the job for us (see m4_init).
        !           531: #
        !           532: # _m4_defn is for internal use only - it bypasses the wrapper, so it
        !           533: # must only be used on one argument at a time, and only on macros
        !           534: # known to be defined.  Make sure this still works if the user renames
        !           535: # m4_defn but not _m4_defn.
        !           536: m4_copy([m4_defn], [_m4_defn])
        !           537: m4_define([m4_defn],
        !           538: [m4_if([$#], [0], [[$0]],
        !           539:        [$#], [1], [m4_ifdef([$1], [_m4_defn([$1])],
        !           540:                            [m4_fatal([$0: undefined macro: $1])])],
        !           541:        [m4_foreach([_m4_macro], [$@], [$0(_m4_defn([_m4_macro]))])])])
        !           542: 
        !           543: 
        !           544: # _m4_dumpdefs_up(NAME)
        !           545: # ---------------------
        !           546: m4_define([_m4_dumpdefs_up],
        !           547: [m4_ifdef([$1],
        !           548:          [m4_pushdef([_m4_dumpdefs], _m4_defn([$1]))dnl
        !           549: m4_dumpdef([$1])dnl
        !           550: _m4_popdef([$1])dnl
        !           551: _m4_dumpdefs_up([$1])])])
        !           552: 
        !           553: 
        !           554: # _m4_dumpdefs_down(NAME)
        !           555: # -----------------------
        !           556: m4_define([_m4_dumpdefs_down],
        !           557: [m4_ifdef([_m4_dumpdefs],
        !           558:          [m4_pushdef([$1], _m4_defn([_m4_dumpdefs]))dnl
        !           559: _m4_popdef([_m4_dumpdefs])dnl
        !           560: _m4_dumpdefs_down([$1])])])
        !           561: 
        !           562: 
        !           563: # m4_dumpdefs(NAME)
        !           564: # -----------------
        !           565: # Similar to `m4_dumpdef(NAME)', but if NAME was m4_pushdef'ed, display its
        !           566: # value stack (most recent displayed first).
        !           567: m4_define([m4_dumpdefs],
        !           568: [_m4_dumpdefs_up([$1])dnl
        !           569: _m4_dumpdefs_down([$1])])
        !           570: 
        !           571: 
        !           572: # m4_popdef(NAME)
        !           573: # ---------------
        !           574: # Like the original, except guarantee a warning when using something which is
        !           575: # undefined (unlike M4 1.4.x).
        !           576: #
        !           577: # This macro is called frequently, so minimize the amount of additional
        !           578: # expansions by skipping m4_ifndef.  Better yet, if __m4_version__ exists,
        !           579: # (added in M4 1.6), then let m4 do the job for us (see m4_init).
        !           580: #
        !           581: # _m4_popdef is for internal use only - it bypasses the wrapper, so it
        !           582: # must only be used on macros known to be defined.  Make sure this
        !           583: # still works if the user renames m4_popdef but not _m4_popdef.
        !           584: m4_copy([m4_popdef], [_m4_popdef])
        !           585: m4_define([m4_popdef],
        !           586: [m4_if([$#], [0], [[$0]],
        !           587:        [$#], [1], [m4_ifdef([$1], [_m4_popdef([$1])],
        !           588:                            [m4_fatal([$0: undefined macro: $1])])],
        !           589:        [m4_foreach([_m4_macro], [$@], [$0(_m4_defn([_m4_macro]))])])])
        !           590: 
        !           591: 
        !           592: # m4_shiftn(N, ...)
        !           593: # -----------------
        !           594: # Returns ... shifted N times.  Useful for recursive "varargs" constructs.
        !           595: #
        !           596: # Autoconf does not use this macro, because it is inherently slower than
        !           597: # calling the common cases of m4_shift2 or m4_shift3 directly.  But it
        !           598: # might as well be fast for other clients, such as Libtool.  One way to
        !           599: # do this is to expand $@ only once in _m4_shiftn (otherwise, for long
        !           600: # lists, the expansion of m4_if takes twice as much memory as what the
        !           601: # list itself occupies, only to throw away the unused branch).  The end
        !           602: # result is strictly equivalent to
        !           603: #   m4_if([$1], 1, [m4_shift(,m4_shift(m4_shift($@)))],
        !           604: #         [_m4_shiftn(m4_decr([$1]), m4_shift(m4_shift($@)))])
        !           605: # but with the final `m4_shift(m4_shift($@)))' shared between the two
        !           606: # paths.  The first leg uses a no-op m4_shift(,$@) to balance out the ().
        !           607: #
        !           608: # Please keep foreach.m4 in sync with any adjustments made here.
        !           609: m4_define([m4_shiftn],
        !           610: [m4_assert(0 < $1 && $1 < $#)_$0($@)])
        !           611: 
        !           612: m4_define([_m4_shiftn],
        !           613: [m4_if([$1], 1, [m4_shift(],
        !           614:        [$0(m4_decr([$1])]), m4_shift(m4_shift($@)))])
        !           615: 
        !           616: # m4_shift2(...)
        !           617: # m4_shift3(...)
        !           618: # -----------------
        !           619: # Returns ... shifted twice, and three times.  Faster than m4_shiftn.
        !           620: m4_define([m4_shift2], [m4_shift(m4_shift($@))])
        !           621: m4_define([m4_shift3], [m4_shift(m4_shift(m4_shift($@)))])
        !           622: 
        !           623: # _m4_shift2(...)
        !           624: # _m4_shift3(...)
        !           625: # ---------------
        !           626: # Like m4_shift2 or m4_shift3, except include a leading comma unless shifting
        !           627: # consumes all arguments.  Why?  Because in recursion, it is nice to
        !           628: # distinguish between 1 element left and 0 elements left, based on how many
        !           629: # arguments this shift expands to.
        !           630: m4_define([_m4_shift2],
        !           631: [m4_if([$#], [2], [],
        !           632:        [, m4_shift(m4_shift($@))])])
        !           633: m4_define([_m4_shift3],
        !           634: [m4_if([$#], [3], [],
        !           635:        [, m4_shift(m4_shift(m4_shift($@)))])])
        !           636: 
        !           637: 
        !           638: # m4_undefine(NAME)
        !           639: # -----------------
        !           640: # Like the original, except guarantee a warning when using something which is
        !           641: # undefined (unlike M4 1.4.x).
        !           642: #
        !           643: # This macro is called frequently, so minimize the amount of additional
        !           644: # expansions by skipping m4_ifndef.  Better yet, if __m4_version__ exists,
        !           645: # (added in M4 1.6), then let m4 do the job for us (see m4_init).
        !           646: #
        !           647: # _m4_undefine is for internal use only - it bypasses the wrapper, so
        !           648: # it must only be used on macros known to be defined.  Make sure this
        !           649: # still works if the user renames m4_undefine but not _m4_undefine.
        !           650: m4_copy([m4_undefine], [_m4_undefine])
        !           651: m4_define([m4_undefine],
        !           652: [m4_if([$#], [0], [[$0]],
        !           653:        [$#], [1], [m4_ifdef([$1], [_m4_undefine([$1])],
        !           654:                            [m4_fatal([$0: undefined macro: $1])])],
        !           655:        [m4_foreach([_m4_macro], [$@], [$0(_m4_defn([_m4_macro]))])])])
        !           656: 
        !           657: # _m4_wrap(PRE, POST)
        !           658: # -------------------
        !           659: # Helper macro for m4_wrap and m4_wrap_lifo.  Allows nested calls to
        !           660: # m4_wrap within wrapped text.  Use _m4_defn and _m4_popdef for speed.
        !           661: m4_define([_m4_wrap],
        !           662: [m4_ifdef([$0_text],
        !           663:          [m4_define([$0_text], [$1]_m4_defn([$0_text])[$2])],
        !           664:          [m4_builtin([m4wrap], [m4_unquote(
        !           665:   _m4_defn([$0_text])_m4_popdef([$0_text]))])m4_define([$0_text], [$1$2])])])
        !           666: 
        !           667: # m4_wrap(TEXT)
        !           668: # -------------
        !           669: # Append TEXT to the list of hooks to be executed at the end of input.
        !           670: # Whereas the order of the original may be LIFO in the underlying m4,
        !           671: # this version is always FIFO.
        !           672: m4_define([m4_wrap],
        !           673: [_m4_wrap([], [$1[]])])
        !           674: 
        !           675: # m4_wrap_lifo(TEXT)
        !           676: # ------------------
        !           677: # Prepend TEXT to the list of hooks to be executed at the end of input.
        !           678: # Whereas the order of m4_wrap may be FIFO in the underlying m4, this
        !           679: # version is always LIFO.
        !           680: m4_define([m4_wrap_lifo],
        !           681: [_m4_wrap([$1[]])])
        !           682: 
        !           683: ## ------------------------- ##
        !           684: ## 7. Quoting manipulation.  ##
        !           685: ## ------------------------- ##
        !           686: 
        !           687: 
        !           688: # m4_apply(MACRO, LIST)
        !           689: # ---------------------
        !           690: # Invoke MACRO, with arguments provided from the quoted list of
        !           691: # comma-separated quoted arguments.  If LIST is empty, invoke MACRO
        !           692: # without arguments.  The expansion will not be concatenated with
        !           693: # subsequent text.
        !           694: m4_define([m4_apply],
        !           695: [m4_if([$2], [], [$1], [$1($2)])[]])
        !           696: 
        !           697: # _m4_apply(MACRO, LIST)
        !           698: # ----------------------
        !           699: # Like m4_apply, except do nothing if LIST is empty.
        !           700: m4_define([_m4_apply],
        !           701: [m4_if([$2], [], [], [$1($2)[]])])
        !           702: 
        !           703: 
        !           704: # m4_count(ARGS)
        !           705: # --------------
        !           706: # Return a count of how many ARGS are present.
        !           707: m4_define([m4_count], [$#])
        !           708: 
        !           709: 
        !           710: # m4_do(STRING, ...)
        !           711: # ------------------
        !           712: # This macro invokes all its arguments (in sequence, of course).  It is
        !           713: # useful for making your macros more structured and readable by dropping
        !           714: # unnecessary dnl's and have the macros indented properly.  No concatenation
        !           715: # occurs after a STRING; use m4_unquote(m4_join(,STRING)) for that.
        !           716: #
        !           717: # Please keep foreach.m4 in sync with any adjustments made here.
        !           718: m4_define([m4_do],
        !           719: [m4_if([$#], 0, [],
        !           720:        [$#], 1, [$1[]],
        !           721:        [$1[]$0(m4_shift($@))])])
        !           722: 
        !           723: 
        !           724: # m4_dquote(ARGS)
        !           725: # ---------------
        !           726: # Return ARGS as a quoted list of quoted arguments.
        !           727: m4_define([m4_dquote],  [[$@]])
        !           728: 
        !           729: 
        !           730: # m4_dquote_elt(ARGS)
        !           731: # -------------------
        !           732: # Return ARGS as an unquoted list of double-quoted arguments.
        !           733: #
        !           734: # Please keep foreach.m4 in sync with any adjustments made here.
        !           735: m4_define([m4_dquote_elt],
        !           736: [m4_if([$#], [0], [],
        !           737:        [$#], [1], [[[$1]]],
        !           738:        [[[$1]],$0(m4_shift($@))])])
        !           739: 
        !           740: 
        !           741: # m4_echo(ARGS)
        !           742: # -------------
        !           743: # Return the ARGS, with the same level of quoting.  Whitespace after
        !           744: # unquoted commas are consumed.
        !           745: m4_define([m4_echo], [$@])
        !           746: 
        !           747: 
        !           748: # m4_expand(ARG)
        !           749: # --------------
        !           750: # Return the expansion of ARG as a single string.  Unlike m4_quote($1), this
        !           751: # correctly preserves whitespace following single-quoted commas that appeared
        !           752: # within ARG.
        !           753: #
        !           754: #   m4_define([active], [ACT, IVE])
        !           755: #   m4_define([active2], [[ACT, IVE]])
        !           756: #   m4_quote(active, active2)
        !           757: #   => ACT,IVE,ACT, IVE
        !           758: #   m4_expand([active, active2])
        !           759: #   => ACT, IVE, ACT, IVE
        !           760: #
        !           761: # Unfortunately, due to limitations in m4, ARG must expand to something
        !           762: # with balanced quotes (use quadrigraphs to get around this).  The input
        !           763: # is not likely to have unbalanced -=<{(/)}>=- quotes, and it is possible
        !           764: # to have unbalanced (), provided it was specified with proper [] quotes.
        !           765: #
        !           766: # Exploit that extra () will group unquoted commas and the following
        !           767: # whitespace, then convert () to [].  m4_bpatsubst can't handle newlines
        !           768: # inside $1, and m4_substr strips quoting.  So we (ab)use m4_changequote.
        !           769: m4_define([m4_expand], [_$0(-=<{($1)}>=-)])
        !           770: m4_define([_m4_expand],
        !           771: [m4_changequote([-=<{(], [)}>=-])$1m4_changequote([, ])])
        !           772: 
        !           773: 
        !           774: # m4_ignore(ARGS)
        !           775: # ---------------
        !           776: # Expands to nothing.  Useful for conditionally ignoring an arbitrary
        !           777: # number of arguments (see _m4_list_cmp for an example).
        !           778: m4_define([m4_ignore])
        !           779: 
        !           780: 
        !           781: # m4_make_list(ARGS)
        !           782: # ------------------
        !           783: # Similar to m4_dquote, this creates a quoted list of quoted ARGS.  This
        !           784: # version is less efficient than m4_dquote, but separates each argument
        !           785: # with a comma and newline, rather than just comma, for readability.
        !           786: # When developing an m4sugar algorithm, you could temporarily use
        !           787: #   m4_pushdef([m4_dquote],m4_defn([m4_make_list]))
        !           788: # around your code to make debugging easier.
        !           789: m4_define([m4_make_list], [m4_join([,
        !           790: ], m4_dquote_elt($@))])
        !           791: 
        !           792: 
        !           793: # m4_noquote(STRING)
        !           794: # ------------------
        !           795: # Return the result of ignoring all quotes in STRING and invoking the
        !           796: # macros it contains.  Amongst other things, this is useful for enabling
        !           797: # macro invocations inside strings with [] blocks (for instance regexps
        !           798: # and help-strings).  On the other hand, since all quotes are disabled,
        !           799: # any macro expanded during this time that relies on nested [] quoting
        !           800: # will likely crash and burn.  This macro is seldom useful; consider
        !           801: # m4_unquote or m4_expand instead.
        !           802: m4_define([m4_noquote],
        !           803: [m4_changequote([-=<{(],[)}>=-])$1-=<{()}>=-m4_changequote([,])])
        !           804: 
        !           805: 
        !           806: # m4_quote(ARGS)
        !           807: # --------------
        !           808: # Return ARGS as a single argument.  Any whitespace after unquoted commas
        !           809: # is stripped.  There is always output, even when there were no arguments.
        !           810: #
        !           811: # It is important to realize the difference between `m4_quote(exp)' and
        !           812: # `[exp]': in the first case you obtain the quoted *result* of the
        !           813: # expansion of EXP, while in the latter you just obtain the string
        !           814: # `exp'.
        !           815: m4_define([m4_quote],  [[$*]])
        !           816: 
        !           817: 
        !           818: # _m4_quote(ARGS)
        !           819: # ---------------
        !           820: # Like m4_quote, except that when there are no arguments, there is no
        !           821: # output.  For conditional scenarios (such as passing _m4_quote as the
        !           822: # macro name in m4_mapall), this feature can be used to distinguish between
        !           823: # one argument of the empty string vs. no arguments.  However, in the
        !           824: # normal case with arguments present, this is less efficient than m4_quote.
        !           825: m4_define([_m4_quote],
        !           826: [m4_if([$#], [0], [], [[$*]])])
        !           827: 
        !           828: 
        !           829: # m4_reverse(ARGS)
        !           830: # ----------------
        !           831: # Output ARGS in reverse order.
        !           832: #
        !           833: # Please keep foreach.m4 in sync with any adjustments made here.
        !           834: m4_define([m4_reverse],
        !           835: [m4_if([$#], [0], [], [$#], [1], [[$1]],
        !           836:        [$0(m4_shift($@)), [$1]])])
        !           837: 
        !           838: 
        !           839: # m4_unquote(ARGS)
        !           840: # ----------------
        !           841: # Remove one layer of quotes from each ARG, performing one level of
        !           842: # expansion.  For one argument, m4_unquote([arg]) is more efficient than
        !           843: # m4_do([arg]), but for multiple arguments, the difference is that
        !           844: # m4_unquote separates arguments with commas while m4_do concatenates.
        !           845: # Follow this macro with [] if concatenation with subsequent text is
        !           846: # undesired.
        !           847: m4_define([m4_unquote], [$*])
        !           848: 
        !           849: 
        !           850: ## -------------------------- ##
        !           851: ## 8. Implementing m4 loops.  ##
        !           852: ## -------------------------- ##
        !           853: 
        !           854: 
        !           855: # m4_for(VARIABLE, FIRST, LAST, [STEP = +/-1], EXPRESSION)
        !           856: # --------------------------------------------------------
        !           857: # Expand EXPRESSION defining VARIABLE to FROM, FROM + 1, ..., TO with
        !           858: # increments of STEP.  Both limits are included, and bounds are
        !           859: # checked for consistency.  The algorithm is robust to indirect
        !           860: # VARIABLE names.  Changing VARIABLE inside EXPRESSION will not impact
        !           861: # the number of iterations.
        !           862: #
        !           863: # Uses _m4_defn for speed, and avoid dnl in the macro body.
        !           864: m4_define([m4_for],
        !           865: [m4_pushdef([$1], m4_eval([$2]))]dnl
        !           866: [m4_cond([m4_eval(([$3]) > ([$2]))], 1,
        !           867:           [m4_pushdef([_m4_step], m4_eval(m4_default([$4],
        !           868:              1)))m4_assert(_m4_step > 0)_$0([$1], _m4_defn([$1]),
        !           869:   m4_eval((([$3]) - ([$2])) / _m4_step * _m4_step + ([$2])),
        !           870:   _m4_step, [$5])],
        !           871:         [m4_eval(([$3]) < ([$2]))], 1,
        !           872:           [m4_pushdef([_m4_step], m4_eval(m4_default([$4],
        !           873:              -1)))m4_assert(_m4_step < 0)_$0([$1], _m4_defn([$1]),
        !           874:   m4_eval((([$2]) - ([$3])) / -(_m4_step) * _m4_step + ([$2])),
        !           875:   _m4_step, [$5])],
        !           876:         [m4_pushdef([_m4_step])$5])[]]dnl
        !           877: [m4_popdef([_m4_step], [$1])])
        !           878: 
        !           879: 
        !           880: # _m4_for(VARIABLE, COUNT, LAST, STEP, EXPRESSION)
        !           881: # ------------------------------------------------
        !           882: # Core of the loop, no consistency checks, all arguments are plain
        !           883: # numbers.  Define VARIABLE to COUNT, expand EXPRESSION, then alter
        !           884: # COUNT by STEP and iterate if COUNT is not LAST.
        !           885: m4_define([_m4_for],
        !           886: [m4_define([$1], [$2])$5[]m4_if([$2], [$3], [],
        !           887:       [$0([$1], m4_eval([$2 + $4]), [$3], [$4], [$5])])])
        !           888: 
        !           889: 
        !           890: # Implementing `foreach' loops in m4 is much more tricky than it may
        !           891: # seem.  For example, the old M4 1.4.4 manual had an incorrect example,
        !           892: # which looked like this (when translated to m4sugar):
        !           893: #
        !           894: # | # foreach(VAR, (LIST), STMT)
        !           895: # | m4_define([foreach],
        !           896: # |   [m4_pushdef([$1])_foreach([$1], [$2], [$3])m4_popdef([$1])])
        !           897: # | m4_define([_arg1], [$1])
        !           898: # | m4_define([_foreach],
        !           899: # |   [m4_if([$2], [()], ,
        !           900: # |     [m4_define([$1], _arg1$2)$3[]_foreach([$1], (m4_shift$2), [$3])])])
        !           901: #
        !           902: # But then if you run
        !           903: #
        !           904: # | m4_define(a, 1)
        !           905: # | m4_define(b, 2)
        !           906: # | m4_define(c, 3)
        !           907: # | foreach([f], [([a], [(b], [c)])], [echo f
        !           908: # | ])
        !           909: #
        !           910: # it gives
        !           911: #
        !           912: #  => echo 1
        !           913: #  => echo (2,3)
        !           914: #
        !           915: # which is not what is expected.
        !           916: #
        !           917: # Of course the problem is that many quotes are missing.  So you add
        !           918: # plenty of quotes at random places, until you reach the expected
        !           919: # result.  Alternatively, if you are a quoting wizard, you directly
        !           920: # reach the following implementation (but if you really did, then
        !           921: # apply to the maintenance of m4sugar!).
        !           922: #
        !           923: # | # foreach(VAR, (LIST), STMT)
        !           924: # | m4_define([foreach], [m4_pushdef([$1])_foreach($@)m4_popdef([$1])])
        !           925: # | m4_define([_arg1], [[$1]])
        !           926: # | m4_define([_foreach],
        !           927: # |  [m4_if($2, [()], ,
        !           928: # |    [m4_define([$1], [_arg1$2])$3[]_foreach([$1], [(m4_shift$2)], [$3])])])
        !           929: #
        !           930: # which this time answers
        !           931: #
        !           932: #  => echo a
        !           933: #  => echo (b
        !           934: #  => echo c)
        !           935: #
        !           936: # Bingo!
        !           937: #
        !           938: # Well, not quite.
        !           939: #
        !           940: # With a better look, you realize that the parens are more a pain than
        !           941: # a help: since anyway you need to quote properly the list, you end up
        !           942: # with always using an outermost pair of parens and an outermost pair
        !           943: # of quotes.  Rejecting the parens both eases the implementation, and
        !           944: # simplifies the use:
        !           945: #
        !           946: # | # foreach(VAR, (LIST), STMT)
        !           947: # | m4_define([foreach], [m4_pushdef([$1])_foreach($@)m4_popdef([$1])])
        !           948: # | m4_define([_arg1], [$1])
        !           949: # | m4_define([_foreach],
        !           950: # |  [m4_if($2, [], ,
        !           951: # |    [m4_define([$1], [_arg1($2)])$3[]_foreach([$1], [m4_shift($2)], [$3])])])
        !           952: #
        !           953: #
        !           954: # Now, just replace the `$2' with `m4_quote($2)' in the outer `m4_if'
        !           955: # to improve robustness, and you come up with a nice implementation
        !           956: # that doesn't require extra parentheses in the user's LIST.
        !           957: #
        !           958: # But wait -  now the algorithm is quadratic, because every recursion of
        !           959: # the algorithm keeps the entire LIST and merely adds another m4_shift to
        !           960: # the quoted text.  If the user has a lot of elements in LIST, you can
        !           961: # bring the system to its knees with the memory m4 then requires, or trip
        !           962: # the m4 --nesting-limit recursion factor.  The only way to avoid
        !           963: # quadratic growth is ensure m4_shift is expanded prior to the recursion.
        !           964: # Hence the design below.
        !           965: #
        !           966: # The M4 manual now includes a chapter devoted to this issue, with
        !           967: # the lessons learned from m4sugar.  And still, this design is only
        !           968: # optimal for M4 1.6; see foreach.m4 for yet more comments on why
        !           969: # M4 1.4.x uses yet another implementation.
        !           970: 
        !           971: 
        !           972: # m4_foreach(VARIABLE, LIST, EXPRESSION)
        !           973: # --------------------------------------
        !           974: #
        !           975: # Expand EXPRESSION assigning each value of the LIST to VARIABLE.
        !           976: # LIST should have the form `item_1, item_2, ..., item_n', i.e. the
        !           977: # whole list must *quoted*.  Quote members too if you don't want them
        !           978: # to be expanded.
        !           979: #
        !           980: # This macro is robust to active symbols:
        !           981: #      | m4_define(active, [ACT, IVE])
        !           982: #      | m4_foreach(Var, [active, active], [-Var-])
        !           983: #     => -ACT--IVE--ACT--IVE-
        !           984: #
        !           985: #      | m4_foreach(Var, [[active], [active]], [-Var-])
        !           986: #     => -ACT, IVE--ACT, IVE-
        !           987: #
        !           988: #      | m4_foreach(Var, [[[active]], [[active]]], [-Var-])
        !           989: #     => -active--active-
        !           990: #
        !           991: # This macro is called frequently, so avoid extra expansions such as
        !           992: # m4_ifval and dnl.  Also, since $2 might be quite large, try to use it
        !           993: # as little as possible in _m4_foreach; each extra use requires that much
        !           994: # more memory for expansion.  So, rather than directly compare $2 against
        !           995: # [] and use m4_car/m4_cdr for recursion, we instead unbox the list (which
        !           996: # requires swapping the argument order in the helper), insert an ignored
        !           997: # third argument, and use m4_shift3 to detect when recursion is complete.
        !           998: #
        !           999: # Please keep foreach.m4 in sync with any adjustments made here.
        !          1000: m4_define([m4_foreach],
        !          1001: [m4_if([$2], [], [],
        !          1002:        [m4_pushdef([$1])_$0([$1], [$3], [], $2)m4_popdef([$1])])])
        !          1003: 
        !          1004: m4_define([_m4_foreach],
        !          1005: [m4_if([$#], [3], [],
        !          1006:        [m4_define([$1], [$4])$2[]$0([$1], [$2], m4_shift3($@))])])
        !          1007: 
        !          1008: 
        !          1009: # m4_foreach_w(VARIABLE, LIST, EXPRESSION)
        !          1010: # ----------------------------------------
        !          1011: #
        !          1012: # Like m4_foreach, but the list is whitespace separated.
        !          1013: #
        !          1014: # This macro is robust to active symbols:
        !          1015: #    m4_foreach_w([Var], [ active
        !          1016: #    b act\
        !          1017: #    ive  ], [-Var-])end
        !          1018: #    => -active--b--active-end
        !          1019: #
        !          1020: m4_define([m4_foreach_w],
        !          1021: [m4_foreach([$1], m4_split(m4_normalize([$2]), [ ]), [$3])])
        !          1022: 
        !          1023: 
        !          1024: # m4_map(MACRO, LIST)
        !          1025: # m4_mapall(MACRO, LIST)
        !          1026: # ----------------------
        !          1027: # Invoke MACRO($1), MACRO($2) etc. where $1, $2... are the elements of
        !          1028: # LIST.  $1, $2... must in turn be lists, appropriate for m4_apply.
        !          1029: # If LIST contains an empty sublist, m4_map skips the expansion of
        !          1030: # MACRO, while m4_mapall expands MACRO with no arguments.
        !          1031: #
        !          1032: # Since LIST may be quite large, we want to minimize how often it
        !          1033: # appears in the expansion.  Rather than use m4_car/m4_cdr iteration,
        !          1034: # we unbox the list, ignore the second argument, and use m4_shift2 to
        !          1035: # detect the end of recursion.  The mismatch in () is intentional; see
        !          1036: # _m4_map.  For m4_map, an empty list behaves like an empty sublist
        !          1037: # and gets ignored; for m4_mapall, we must special-case the empty
        !          1038: # list.
        !          1039: #
        !          1040: # Please keep foreach.m4 in sync with any adjustments made here.
        !          1041: m4_define([m4_map],
        !          1042: [_m4_map([_m4_apply([$1]], [], $2)])
        !          1043: 
        !          1044: m4_define([m4_mapall],
        !          1045: [m4_if([$2], [], [],
        !          1046:        [_m4_map([m4_apply([$1]], [], $2)])])
        !          1047: 
        !          1048: 
        !          1049: # m4_map_sep(MACRO, SEPARATOR, LIST)
        !          1050: # m4_mapall_sep(MACRO, SEPARATOR, LIST)
        !          1051: # -------------------------------------
        !          1052: # Invoke MACRO($1), SEPARATOR, MACRO($2), ..., MACRO($N) where $1,
        !          1053: # $2... $N are the elements of LIST, and are in turn lists appropriate
        !          1054: # for m4_apply.  SEPARATOR is expanded, in order to allow the creation
        !          1055: # of a list of arguments by using a single-quoted comma as the
        !          1056: # separator.  For each empty sublist, m4_map_sep skips the expansion
        !          1057: # of MACRO and SEPARATOR, while m4_mapall_sep expands MACRO with no
        !          1058: # arguments.
        !          1059: #
        !          1060: # For m4_mapall_sep, merely expand the first iteration without the
        !          1061: # separator, then include separator as part of subsequent recursion;
        !          1062: # but avoid extra expansion of LIST's side-effects via a helper macro.
        !          1063: # For m4_map_sep, things are trickier - we don't know if the first
        !          1064: # list element is an empty sublist, so we must define a self-modifying
        !          1065: # helper macro and use that as the separator instead.
        !          1066: m4_define([m4_map_sep],
        !          1067: [m4_pushdef([m4_Sep], [m4_define([m4_Sep], _m4_defn([m4_unquote]))])]dnl
        !          1068: [_m4_map([_m4_apply([m4_Sep([$2])[]$1]], [], $3)m4_popdef([m4_Sep])])
        !          1069: 
        !          1070: m4_define([m4_mapall_sep],
        !          1071: [m4_if([$3], [], [], [_$0([$1], [$2], $3)])])
        !          1072: 
        !          1073: m4_define([_m4_mapall_sep],
        !          1074: [m4_apply([$1], [$3])_m4_map([m4_apply([$2[]$1]], m4_shift2($@))])
        !          1075: 
        !          1076: # _m4_map(PREFIX, IGNORED, SUBLIST, ...)
        !          1077: # --------------------------------------
        !          1078: # Common implementation for all four m4_map variants.  The mismatch in
        !          1079: # the number of () is intentional.  PREFIX must supply a form of
        !          1080: # m4_apply, the open `(', and the MACRO to be applied.  Each iteration
        !          1081: # then appends `,', the current SUBLIST and the closing `)', then
        !          1082: # recurses to the next SUBLIST.  IGNORED is an aid to ending recursion
        !          1083: # efficiently.
        !          1084: #
        !          1085: # Please keep foreach.m4 in sync with any adjustments made here.
        !          1086: m4_define([_m4_map],
        !          1087: [m4_if([$#], [2], [],
        !          1088:        [$1, [$3])$0([$1], m4_shift2($@))])])
        !          1089: 
        !          1090: # m4_transform(EXPRESSION, ARG...)
        !          1091: # --------------------------------
        !          1092: # Expand EXPRESSION([ARG]) for each argument.  More efficient than
        !          1093: # m4_foreach([var], [ARG...], [EXPRESSION(m4_defn([var]))])
        !          1094: #
        !          1095: # Please keep foreach.m4 in sync with any adjustments made here.
        !          1096: m4_define([m4_transform],
        !          1097: [m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])],
        !          1098:        [$#], [1], [],
        !          1099:        [$#], [2], [$1([$2])[]],
        !          1100:        [$1([$2])[]$0([$1], m4_shift2($@))])])
        !          1101: 
        !          1102: 
        !          1103: # m4_transform_pair(EXPRESSION, [END-EXPR = EXPRESSION], ARG...)
        !          1104: # --------------------------------------------------------------
        !          1105: # Perform a pairwise grouping of consecutive ARGs, by expanding
        !          1106: # EXPRESSION([ARG1], [ARG2]).  If there are an odd number of ARGs, the
        !          1107: # final argument is expanded with END-EXPR([ARGn]).
        !          1108: #
        !          1109: # For example:
        !          1110: #   m4_define([show], [($*)m4_newline])dnl
        !          1111: #   m4_transform_pair([show], [], [a], [b], [c], [d], [e])dnl
        !          1112: #   => (a,b)
        !          1113: #   => (c,d)
        !          1114: #   => (e)
        !          1115: #
        !          1116: # Please keep foreach.m4 in sync with any adjustments made here.
        !          1117: m4_define([m4_transform_pair],
        !          1118: [m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])],
        !          1119:        [$#], [1], [m4_fatal([$0: too few arguments: $#: $1])],
        !          1120:        [$#], [2], [],
        !          1121:        [$#], [3], [m4_default([$2], [$1])([$3])[]],
        !          1122:        [$#], [4], [$1([$3], [$4])[]],
        !          1123:        [$1([$3], [$4])[]$0([$1], [$2], m4_shift(m4_shift3($@)))])])
        !          1124: 
        !          1125: 
        !          1126: ## --------------------------- ##
        !          1127: ## 9. More diversion support.  ##
        !          1128: ## --------------------------- ##
        !          1129: 
        !          1130: 
        !          1131: # _m4_divert(DIVERSION-NAME or NUMBER)
        !          1132: # ------------------------------------
        !          1133: # If DIVERSION-NAME is the name of a diversion, return its number,
        !          1134: # otherwise if it is a NUMBER return it.
        !          1135: m4_define([_m4_divert],
        !          1136: [m4_ifdef([_m4_divert($1)],
        !          1137:          [m4_indir([_m4_divert($1)])],
        !          1138:          [$1])])
        !          1139: 
        !          1140: # KILL is only used to suppress output.
        !          1141: m4_define([_m4_divert(KILL)],           -1)
        !          1142: 
        !          1143: # The empty diversion name is a synonym for 0.
        !          1144: m4_define([_m4_divert()],                0)
        !          1145: 
        !          1146: 
        !          1147: # _m4_divert_n_stack
        !          1148: # ------------------
        !          1149: # Print m4_divert_stack with newline prepended, if it's nonempty.
        !          1150: m4_define([_m4_divert_n_stack],
        !          1151: [m4_ifdef([m4_divert_stack], [
        !          1152: _m4_defn([m4_divert_stack])])])
        !          1153: 
        !          1154: 
        !          1155: # m4_divert(DIVERSION-NAME)
        !          1156: # -------------------------
        !          1157: # Change the diversion stream to DIVERSION-NAME.
        !          1158: m4_define([m4_divert],
        !          1159: [m4_define([m4_divert_stack], m4_location[: $0: $1]_m4_divert_n_stack)]dnl
        !          1160: [m4_builtin([divert], _m4_divert([$1]))])
        !          1161: 
        !          1162: 
        !          1163: # m4_divert_push(DIVERSION-NAME)
        !          1164: # ------------------------------
        !          1165: # Change the diversion stream to DIVERSION-NAME, while stacking old values.
        !          1166: m4_define([m4_divert_push],
        !          1167: [m4_pushdef([m4_divert_stack], m4_location[: $0: $1]_m4_divert_n_stack)]dnl
        !          1168: [m4_pushdef([_m4_divert_diversion], [$1])]dnl
        !          1169: [m4_builtin([divert], _m4_divert([$1]))])
        !          1170: 
        !          1171: 
        !          1172: # m4_divert_pop([DIVERSION-NAME])
        !          1173: # -------------------------------
        !          1174: # Change the diversion stream to its previous value, unstacking it.
        !          1175: # If specified, verify we left DIVERSION-NAME.
        !          1176: # When we pop the last value from the stack, we divert to -1.
        !          1177: m4_define([m4_divert_pop],
        !          1178: [m4_ifndef([_m4_divert_diversion],
        !          1179:           [m4_fatal([too many m4_divert_pop])])]dnl
        !          1180: [m4_if([$1], [], [],
        !          1181:        [$1], _m4_defn([_m4_divert_diversion]), [],
        !          1182:        [m4_fatal([$0($1): diversion mismatch: ]_m4_divert_n_stack)])]dnl
        !          1183: [_m4_popdef([m4_divert_stack], [_m4_divert_diversion])]dnl
        !          1184: [m4_builtin([divert],
        !          1185:            m4_ifdef([_m4_divert_diversion],
        !          1186:                     [_m4_divert(_m4_defn([_m4_divert_diversion]))],
        !          1187:                     -1))])
        !          1188: 
        !          1189: 
        !          1190: # m4_divert_text(DIVERSION-NAME, CONTENT)
        !          1191: # ---------------------------------------
        !          1192: # Output CONTENT into DIVERSION-NAME (which may be a number actually).
        !          1193: # An end of line is appended for free to CONTENT.
        !          1194: m4_define([m4_divert_text],
        !          1195: [m4_divert_push([$1])$2
        !          1196: m4_divert_pop([$1])])
        !          1197: 
        !          1198: 
        !          1199: # m4_divert_once(DIVERSION-NAME, CONTENT)
        !          1200: # ---------------------------------------
        !          1201: # Output CONTENT into DIVERSION-NAME once, if not already there.
        !          1202: # An end of line is appended for free to CONTENT.
        !          1203: m4_define([m4_divert_once],
        !          1204: [m4_expand_once([m4_divert_text([$1], [$2])])])
        !          1205: 
        !          1206: 
        !          1207: # m4_undivert(DIVERSION-NAME)
        !          1208: # ---------------------------
        !          1209: # Undivert DIVERSION-NAME.  Unlike the M4 version, this only takes a single
        !          1210: # diversion identifier, and should not be used to undivert files.
        !          1211: m4_define([m4_undivert],
        !          1212: [m4_builtin([undivert], _m4_divert([$1]))])
        !          1213: 
        !          1214: 
        !          1215: ## --------------------------------------------- ##
        !          1216: ## 10. Defining macros with bells and whistles.  ##
        !          1217: ## --------------------------------------------- ##
        !          1218: 
        !          1219: # `m4_defun' is basically `m4_define' but it equips the macro with the
        !          1220: # needed machinery for `m4_require'.  A macro must be m4_defun'd if
        !          1221: # either it is m4_require'd, or it m4_require's.
        !          1222: #
        !          1223: # Two things deserve attention and are detailed below:
        !          1224: #  1. Implementation of m4_require
        !          1225: #  2. Keeping track of the expansion stack
        !          1226: #
        !          1227: # 1. Implementation of m4_require
        !          1228: # ===============================
        !          1229: #
        !          1230: # Of course m4_defun AC_PROVIDE's the macro, so that a macro which has
        !          1231: # been expanded is not expanded again when m4_require'd, but the
        !          1232: # difficult part is the proper expansion of macros when they are
        !          1233: # m4_require'd.
        !          1234: #
        !          1235: # The implementation is based on two ideas, (i) using diversions to
        !          1236: # prepare the expansion of the macro and its dependencies (by Franc,ois
        !          1237: # Pinard), and (ii) expand the most recently m4_require'd macros _after_
        !          1238: # the previous macros (by Axel Thimm).
        !          1239: #
        !          1240: #
        !          1241: # The first idea: why use diversions?
        !          1242: # -----------------------------------
        !          1243: #
        !          1244: # When a macro requires another, the other macro is expanded in new
        !          1245: # diversion, GROW.  When the outer macro is fully expanded, we first
        !          1246: # undivert the most nested diversions (GROW - 1...), and finally
        !          1247: # undivert GROW.  To understand why we need several diversions,
        !          1248: # consider the following example:
        !          1249: #
        !          1250: # | m4_defun([TEST1], [Test...REQUIRE([TEST2])1])
        !          1251: # | m4_defun([TEST2], [Test...REQUIRE([TEST3])2])
        !          1252: # | m4_defun([TEST3], [Test...3])
        !          1253: #
        !          1254: # Because m4_require is not required to be first in the outer macros, we
        !          1255: # must keep the expansions of the various levels of m4_require separated.
        !          1256: # Right before executing the epilogue of TEST1, we have:
        !          1257: #
        !          1258: #         GROW - 2: Test...3
        !          1259: #         GROW - 1: Test...2
        !          1260: #         GROW:     Test...1
        !          1261: #         BODY:
        !          1262: #
        !          1263: # Finally the epilogue of TEST1 undiverts GROW - 2, GROW - 1, and
        !          1264: # GROW into the regular flow, BODY.
        !          1265: #
        !          1266: #         GROW - 2:
        !          1267: #         GROW - 1:
        !          1268: #         GROW:
        !          1269: #         BODY:        Test...3; Test...2; Test...1
        !          1270: #
        !          1271: # (The semicolons are here for clarification, but of course are not
        !          1272: # emitted.)  This is what Autoconf 2.0 (I think) to 2.13 (I'm sure)
        !          1273: # implement.
        !          1274: #
        !          1275: #
        !          1276: # The second idea: first required first out
        !          1277: # -----------------------------------------
        !          1278: #
        !          1279: # The natural implementation of the idea above is buggy and produces
        !          1280: # very surprising results in some situations.  Let's consider the
        !          1281: # following example to explain the bug:
        !          1282: #
        !          1283: # | m4_defun([TEST1],  [REQUIRE([TEST2a])REQUIRE([TEST2b])])
        !          1284: # | m4_defun([TEST2a], [])
        !          1285: # | m4_defun([TEST2b], [REQUIRE([TEST3])])
        !          1286: # | m4_defun([TEST3],  [REQUIRE([TEST2a])])
        !          1287: # |
        !          1288: # | AC_INIT
        !          1289: # | TEST1
        !          1290: #
        !          1291: # The dependencies between the macros are:
        !          1292: #
        !          1293: #               3 --- 2b
        !          1294: #              /        \              is m4_require'd by
        !          1295: #             /          \       left -------------------- right
        !          1296: #          2a ------------ 1
        !          1297: #
        !          1298: # If you strictly apply the rules given in the previous section you get:
        !          1299: #
        !          1300: #         GROW - 2: TEST3
        !          1301: #         GROW - 1: TEST2a; TEST2b
        !          1302: #         GROW:     TEST1
        !          1303: #         BODY:
        !          1304: #
        !          1305: # (TEST2a, although required by TEST3 is not expanded in GROW - 3
        !          1306: # because is has already been expanded before in GROW - 1, so it has
        !          1307: # been AC_PROVIDE'd, so it is not expanded again) so when you undivert
        !          1308: # the stack of diversions, you get:
        !          1309: #
        !          1310: #         GROW - 2:
        !          1311: #         GROW - 1:
        !          1312: #         GROW:
        !          1313: #         BODY:        TEST3; TEST2a; TEST2b; TEST1
        !          1314: #
        !          1315: # i.e., TEST2a is expanded after TEST3 although the latter required the
        !          1316: # former.
        !          1317: #
        !          1318: # Starting from 2.50, we use an implementation provided by Axel Thimm.
        !          1319: # The idea is simple: the order in which macros are emitted must be the
        !          1320: # same as the one in which macros are expanded.  (The bug above can
        !          1321: # indeed be described as: a macro has been AC_PROVIDE'd before its
        !          1322: # dependent, but it is emitted after: the lack of correlation between
        !          1323: # emission and expansion order is guilty).
        !          1324: #
        !          1325: # How to do that?  You keep the stack of diversions to elaborate the
        !          1326: # macros, but each time a macro is fully expanded, emit it immediately.
        !          1327: #
        !          1328: # In the example above, when TEST2a is expanded, but it's epilogue is
        !          1329: # not run yet, you have:
        !          1330: #
        !          1331: #         GROW - 2:
        !          1332: #         GROW - 1: TEST2a
        !          1333: #         GROW:     Elaboration of TEST1
        !          1334: #         BODY:
        !          1335: #
        !          1336: # The epilogue of TEST2a emits it immediately:
        !          1337: #
        !          1338: #         GROW - 2:
        !          1339: #         GROW - 1:
        !          1340: #         GROW:     Elaboration of TEST1
        !          1341: #         BODY:     TEST2a
        !          1342: #
        !          1343: # TEST2b then requires TEST3, so right before the epilogue of TEST3, you
        !          1344: # have:
        !          1345: #
        !          1346: #         GROW - 2: TEST3
        !          1347: #         GROW - 1: Elaboration of TEST2b
        !          1348: #         GROW:     Elaboration of TEST1
        !          1349: #         BODY:      TEST2a
        !          1350: #
        !          1351: # The epilogue of TEST3 emits it:
        !          1352: #
        !          1353: #         GROW - 2:
        !          1354: #         GROW - 1: Elaboration of TEST2b
        !          1355: #         GROW:     Elaboration of TEST1
        !          1356: #         BODY:     TEST2a; TEST3
        !          1357: #
        !          1358: # TEST2b is now completely expanded, and emitted:
        !          1359: #
        !          1360: #         GROW - 2:
        !          1361: #         GROW - 1:
        !          1362: #         GROW:     Elaboration of TEST1
        !          1363: #         BODY:     TEST2a; TEST3; TEST2b
        !          1364: #
        !          1365: # and finally, TEST1 is finished and emitted:
        !          1366: #
        !          1367: #         GROW - 2:
        !          1368: #         GROW - 1:
        !          1369: #         GROW:
        !          1370: #         BODY:     TEST2a; TEST3; TEST2b: TEST1
        !          1371: #
        !          1372: # The idea is simple, but the implementation is a bit evolved.  If you
        !          1373: # are like me, you will want to see the actual functioning of this
        !          1374: # implementation to be convinced.  The next section gives the full
        !          1375: # details.
        !          1376: #
        !          1377: #
        !          1378: # The Axel Thimm implementation at work
        !          1379: # -------------------------------------
        !          1380: #
        !          1381: # We consider the macros above, and this configure.ac:
        !          1382: #
        !          1383: #          AC_INIT
        !          1384: #          TEST1
        !          1385: #
        !          1386: # You should keep the definitions of _m4_defun_pro, _m4_defun_epi, and
        !          1387: # m4_require at hand to follow the steps.
        !          1388: #
        !          1389: # This implements tries not to assume that the current diversion is
        !          1390: # BODY, so as soon as a macro (m4_defun'd) is expanded, we first
        !          1391: # record the current diversion under the name _m4_divert_dump (denoted
        !          1392: # DUMP below for short).  This introduces an important difference with
        !          1393: # the previous versions of Autoconf: you cannot use m4_require if you
        !          1394: # are not inside an m4_defun'd macro, and especially, you cannot
        !          1395: # m4_require directly from the top level.
        !          1396: #
        !          1397: # We have not tried to simulate the old behavior (better yet, we
        !          1398: # diagnose it), because it is too dangerous: a macro m4_require'd from
        !          1399: # the top level is expanded before the body of `configure', i.e., before
        !          1400: # any other test was run.  I let you imagine the result of requiring
        !          1401: # AC_STDC_HEADERS for instance, before AC_PROG_CC was actually run....
        !          1402: #
        !          1403: # After AC_INIT was run, the current diversion is BODY.
        !          1404: # * AC_INIT was run
        !          1405: #   DUMP:                undefined
        !          1406: #   diversion stack:     BODY |-
        !          1407: #
        !          1408: # * TEST1 is expanded
        !          1409: # The prologue of TEST1 sets _m4_divert_dump, which is the diversion
        !          1410: # where the current elaboration will be dumped, to the current
        !          1411: # diversion.  It also m4_divert_push to GROW, where the full
        !          1412: # expansion of TEST1 and its dependencies will be elaborated.
        !          1413: #   DUMP:        BODY
        !          1414: #   BODY:        empty
        !          1415: #   diversions:  GROW, BODY |-
        !          1416: #
        !          1417: # * TEST1 requires TEST2a
        !          1418: # _m4_require_call m4_divert_pushes another temporary diversion,
        !          1419: # GROW - 1, and expands TEST2a in there.
        !          1420: #   DUMP:        BODY
        !          1421: #   BODY:        empty
        !          1422: #   GROW - 1:    TEST2a
        !          1423: #   diversions:  GROW - 1, GROW, BODY |-
        !          1424: # Than the content of the temporary diversion is moved to DUMP and the
        !          1425: # temporary diversion is popped.
        !          1426: #   DUMP:        BODY
        !          1427: #   BODY:        TEST2a
        !          1428: #   diversions:  GROW, BODY |-
        !          1429: #
        !          1430: # * TEST1 requires TEST2b
        !          1431: # Again, _m4_require_call pushes GROW - 1 and heads to expand TEST2b.
        !          1432: #   DUMP:        BODY
        !          1433: #   BODY:        TEST2a
        !          1434: #   diversions:  GROW - 1, GROW, BODY |-
        !          1435: #
        !          1436: # * TEST2b requires TEST3
        !          1437: # _m4_require_call pushes GROW - 2 and expands TEST3 here.
        !          1438: # (TEST3 requires TEST2a, but TEST2a has already been m4_provide'd, so
        !          1439: # nothing happens.)
        !          1440: #   DUMP:        BODY
        !          1441: #   BODY:        TEST2a
        !          1442: #   GROW - 2:    TEST3
        !          1443: #   diversions:  GROW - 2, GROW - 1, GROW, BODY |-
        !          1444: # Than the diversion is appended to DUMP, and popped.
        !          1445: #   DUMP:        BODY
        !          1446: #   BODY:        TEST2a; TEST3
        !          1447: #   diversions:  GROW - 1, GROW, BODY |-
        !          1448: #
        !          1449: # * TEST1 requires TEST2b (contd.)
        !          1450: # The content of TEST2b is expanded...
        !          1451: #   DUMP:        BODY
        !          1452: #   BODY:        TEST2a; TEST3
        !          1453: #   GROW - 1:    TEST2b,
        !          1454: #   diversions:  GROW - 1, GROW, BODY |-
        !          1455: # ... and moved to DUMP.
        !          1456: #   DUMP:        BODY
        !          1457: #   BODY:        TEST2a; TEST3; TEST2b
        !          1458: #   diversions:  GROW, BODY |-
        !          1459: #
        !          1460: # * TEST1 is expanded: epilogue
        !          1461: # TEST1's own content is in GROW...
        !          1462: #   DUMP:        BODY
        !          1463: #   BODY:        TEST2a; TEST3; TEST2b
        !          1464: #   GROW:        TEST1
        !          1465: #   diversions:  BODY |-
        !          1466: # ... and it's epilogue moves it to DUMP and then undefines DUMP.
        !          1467: #   DUMP:       undefined
        !          1468: #   BODY:       TEST2a; TEST3; TEST2b; TEST1
        !          1469: #   diversions: BODY |-
        !          1470: #
        !          1471: #
        !          1472: # 2. Keeping track of the expansion stack
        !          1473: # =======================================
        !          1474: #
        !          1475: # When M4 expansion goes wrong it is often extremely hard to find the
        !          1476: # path amongst macros that drove to the failure.  What is needed is
        !          1477: # the stack of macro `calls'. One could imagine that GNU M4 would
        !          1478: # maintain a stack of macro expansions, unfortunately it doesn't, so
        !          1479: # we do it by hand.  This is of course extremely costly, but the help
        !          1480: # this stack provides is worth it.  Nevertheless to limit the
        !          1481: # performance penalty this is implemented only for m4_defun'd macros,
        !          1482: # not for define'd macros.
        !          1483: #
        !          1484: # The scheme is simplistic: each time we enter an m4_defun'd macros,
        !          1485: # we prepend its name in m4_expansion_stack, and when we exit the
        !          1486: # macro, we remove it (thanks to pushdef/popdef).
        !          1487: #
        !          1488: # In addition, we want to detect circular m4_require dependencies.
        !          1489: # Each time we expand a macro FOO we define _m4_expanding(FOO); and
        !          1490: # m4_require(BAR) simply checks whether _m4_expanding(BAR) is defined.
        !          1491: 
        !          1492: 
        !          1493: # m4_expansion_stack_push(TEXT)
        !          1494: # -----------------------------
        !          1495: m4_define([m4_expansion_stack_push],
        !          1496: [m4_pushdef([m4_expansion_stack],
        !          1497:            [$1]m4_ifdef([m4_expansion_stack], [
        !          1498: _m4_defn([m4_expansion_stack])]))])
        !          1499: 
        !          1500: 
        !          1501: # m4_expansion_stack_pop
        !          1502: # ----------------------
        !          1503: m4_define([m4_expansion_stack_pop],
        !          1504: [m4_popdef([m4_expansion_stack])])
        !          1505: 
        !          1506: 
        !          1507: # m4_expansion_stack_dump
        !          1508: # -----------------------
        !          1509: # Dump the expansion stack.
        !          1510: m4_define([m4_expansion_stack_dump],
        !          1511: [m4_ifdef([m4_expansion_stack],
        !          1512:          [m4_errprintn(_m4_defn([m4_expansion_stack]))])dnl
        !          1513: m4_errprintn(m4_location[: the top level])])
        !          1514: 
        !          1515: 
        !          1516: # _m4_divert(GROW)
        !          1517: # ----------------
        !          1518: # This diversion is used by the m4_defun/m4_require machinery.  It is
        !          1519: # important to keep room before GROW because for each nested
        !          1520: # AC_REQUIRE we use an additional diversion (i.e., two m4_require's
        !          1521: # will use GROW - 2.  More than 3 levels has never seemed to be
        !          1522: # needed.)
        !          1523: #
        !          1524: # ...
        !          1525: # - GROW - 2
        !          1526: #   m4_require'd code, 2 level deep
        !          1527: # - GROW - 1
        !          1528: #   m4_require'd code, 1 level deep
        !          1529: # - GROW
        !          1530: #   m4_defun'd macros are elaborated here.
        !          1531: 
        !          1532: m4_define([_m4_divert(GROW)],       10000)
        !          1533: 
        !          1534: 
        !          1535: # _m4_defun_pro(MACRO-NAME)
        !          1536: # -------------------------
        !          1537: # The prologue for Autoconf macros.
        !          1538: #
        !          1539: # This is called frequently, so minimize the number of macro invocations
        !          1540: # by avoiding dnl and m4_defn overhead.
        !          1541: m4_define([_m4_defun_pro],
        !          1542: m4_do([[m4_ifdef([m4_expansion_stack], [], [_m4_defun_pro_outer[]])]],
        !          1543:       [[m4_expansion_stack_push(_m4_defn(
        !          1544:          [m4_location($1)])[: $1 is expanded from...])]],
        !          1545:       [[m4_pushdef([_m4_expanding($1)])]]))
        !          1546: 
        !          1547: m4_define([_m4_defun_pro_outer],
        !          1548: [m4_copy([_m4_divert_diversion], [_m4_divert_dump])m4_divert_push([GROW])])
        !          1549: 
        !          1550: # _m4_defun_epi(MACRO-NAME)
        !          1551: # -------------------------
        !          1552: # The Epilogue for Autoconf macros.  MACRO-NAME only helps tracing
        !          1553: # the PRO/EPI pairs.
        !          1554: #
        !          1555: # This is called frequently, so minimize the number of macro invocations
        !          1556: # by avoiding dnl and m4_popdef overhead.
        !          1557: m4_define([_m4_defun_epi],
        !          1558: m4_do([[_m4_popdef([_m4_expanding($1)])]],
        !          1559:       [[m4_expansion_stack_pop()]],
        !          1560:       [[m4_ifdef([m4_expansion_stack], [], [_m4_defun_epi_outer[]])]],
        !          1561:       [[m4_provide([$1])]]))
        !          1562: 
        !          1563: m4_define([_m4_defun_epi_outer],
        !          1564: [_m4_undefine([_m4_divert_dump])m4_divert_pop([GROW])m4_undivert([GROW])])
        !          1565: 
        !          1566: 
        !          1567: # m4_defun(NAME, EXPANSION)
        !          1568: # -------------------------
        !          1569: # Define a macro which automatically provides itself.  Add machinery
        !          1570: # so the macro automatically switches expansion to the diversion
        !          1571: # stack if it is not already using it.  In this case, once finished,
        !          1572: # it will bring back all the code accumulated in the diversion stack.
        !          1573: # This, combined with m4_require, achieves the topological ordering of
        !          1574: # macros.  We don't use this macro to define some frequently called
        !          1575: # macros that are not involved in ordering constraints, to save m4
        !          1576: # processing.
        !          1577: m4_define([m4_defun],
        !          1578: [m4_define([m4_location($1)], m4_location)dnl
        !          1579: m4_define([$1],
        !          1580:          [_m4_defun_pro([$1])$2[]_m4_defun_epi([$1])])])
        !          1581: 
        !          1582: 
        !          1583: # m4_defun_once(NAME, EXPANSION)
        !          1584: # ------------------------------
        !          1585: # As m4_defun, but issues the EXPANSION only once, and warns if used
        !          1586: # several times.
        !          1587: m4_define([m4_defun_once],
        !          1588: [m4_define([m4_location($1)], m4_location)dnl
        !          1589: m4_define([$1],
        !          1590:          [m4_provide_if([$1],
        !          1591:                         [m4_warn([syntax], [$1 invoked multiple times])],
        !          1592:                         [_m4_defun_pro([$1])$2[]_m4_defun_epi([$1])])])])
        !          1593: 
        !          1594: 
        !          1595: # m4_pattern_forbid(ERE, [WHY])
        !          1596: # -----------------------------
        !          1597: # Declare that no token matching the forbidden extended regular
        !          1598: # expression ERE should be seen in the output unless...
        !          1599: m4_define([m4_pattern_forbid], [])
        !          1600: 
        !          1601: 
        !          1602: # m4_pattern_allow(ERE)
        !          1603: # ---------------------
        !          1604: # ... that token also matches the allowed extended regular expression ERE.
        !          1605: # Both used via traces.
        !          1606: m4_define([m4_pattern_allow], [])
        !          1607: 
        !          1608: 
        !          1609: ## --------------------------------- ##
        !          1610: ## 11. Dependencies between macros.  ##
        !          1611: ## --------------------------------- ##
        !          1612: 
        !          1613: 
        !          1614: # m4_before(THIS-MACRO-NAME, CALLED-MACRO-NAME)
        !          1615: # ---------------------------------------------
        !          1616: # Issue a warning if CALLED-MACRO-NAME was called before THIS-MACRO-NAME.
        !          1617: m4_define([m4_before],
        !          1618: [m4_provide_if([$2],
        !          1619:               [m4_warn([syntax], [$2 was called before $1])])])
        !          1620: 
        !          1621: 
        !          1622: # m4_require(NAME-TO-CHECK, [BODY-TO-EXPAND = NAME-TO-CHECK])
        !          1623: # -----------------------------------------------------------
        !          1624: # If NAME-TO-CHECK has never been expanded (actually, if it is not
        !          1625: # m4_provide'd), expand BODY-TO-EXPAND *before* the current macro
        !          1626: # expansion.  Once expanded, emit it in _m4_divert_dump.  Keep track
        !          1627: # of the m4_require chain in m4_expansion_stack.
        !          1628: #
        !          1629: # The normal cases are:
        !          1630: #
        !          1631: # - NAME-TO-CHECK == BODY-TO-EXPAND
        !          1632: #   Which you can use for regular macros with or without arguments, e.g.,
        !          1633: #     m4_require([AC_PROG_CC], [AC_PROG_CC])
        !          1634: #     m4_require([AC_CHECK_HEADERS(limits.h)], [AC_CHECK_HEADERS(limits.h)])
        !          1635: #   which is just the same as
        !          1636: #     m4_require([AC_PROG_CC])
        !          1637: #     m4_require([AC_CHECK_HEADERS(limits.h)])
        !          1638: #
        !          1639: # - BODY-TO-EXPAND == m4_indir([NAME-TO-CHECK])
        !          1640: #   In the case of macros with irregular names.  For instance:
        !          1641: #     m4_require([AC_LANG_COMPILER(C)], [indir([AC_LANG_COMPILER(C)])])
        !          1642: #   which means `if the macro named `AC_LANG_COMPILER(C)' (the parens are
        !          1643: #   part of the name, it is not an argument) has not been run, then
        !          1644: #   call it.'
        !          1645: #   Had you used
        !          1646: #     m4_require([AC_LANG_COMPILER(C)], [AC_LANG_COMPILER(C)])
        !          1647: #   then m4_require would have tried to expand `AC_LANG_COMPILER(C)', i.e.,
        !          1648: #   call the macro `AC_LANG_COMPILER' with `C' as argument.
        !          1649: #
        !          1650: #   You could argue that `AC_LANG_COMPILER', when it receives an argument
        !          1651: #   such as `C' should dispatch the call to `AC_LANG_COMPILER(C)'.  But this
        !          1652: #   `extension' prevents `AC_LANG_COMPILER' from having actual arguments that
        !          1653: #   it passes to `AC_LANG_COMPILER(C)'.
        !          1654: #
        !          1655: # This is called frequently, so minimize the number of macro invocations
        !          1656: # by avoiding dnl and other overhead on the common path.
        !          1657: m4_define([m4_require],
        !          1658: m4_do([[m4_ifdef([_m4_expanding($1)],
        !          1659:                 [m4_fatal([$0: circular dependency of $1])])]],
        !          1660:       [[m4_ifdef([_m4_divert_dump], [],
        !          1661:                 [m4_fatal([$0($1): cannot be used outside of an ]dnl
        !          1662: m4_bmatch([$0], [^AC_], [[AC_DEFUN]], [[m4_defun]])['d macro])])]],
        !          1663:       [[m4_provide_if([$1],
        !          1664:                      [],
        !          1665:                      [_m4_require_call([$1], [$2])])]]))
        !          1666: 
        !          1667: 
        !          1668: # _m4_require_call(NAME-TO-CHECK, [BODY-TO-EXPAND = NAME-TO-CHECK])
        !          1669: # -----------------------------------------------------------------
        !          1670: # If m4_require decides to expand the body, it calls this macro.
        !          1671: #
        !          1672: # This is called frequently, so minimize the number of macro invocations
        !          1673: # by avoiding dnl and other overhead on the common path.
        !          1674: m4_define([_m4_require_call],
        !          1675: m4_do([[m4_define([_m4_divert_grow], m4_decr(_m4_divert_grow))]],
        !          1676:       [[m4_divert_push(_m4_divert_grow)]],
        !          1677:       [[m4_default([$2], [$1])
        !          1678: m4_provide_if([$1],
        !          1679:              [],
        !          1680:              [m4_warn([syntax],
        !          1681:                       [$1 is m4_require'd but not m4_defun'd])])]],
        !          1682:       [[m4_divert(_m4_defn([_m4_divert_dump]))]],
        !          1683:       [[m4_undivert(_m4_divert_grow)]],
        !          1684:       [[m4_divert_pop(_m4_divert_grow)]],
        !          1685:       [[m4_define([_m4_divert_grow], m4_incr(_m4_divert_grow))]]))
        !          1686: 
        !          1687: 
        !          1688: # _m4_divert_grow
        !          1689: # ---------------
        !          1690: # The counter for _m4_require_call.
        !          1691: m4_define([_m4_divert_grow], _m4_divert([GROW]))
        !          1692: 
        !          1693: 
        !          1694: # m4_expand_once(TEXT, [WITNESS = TEXT])
        !          1695: # --------------------------------------
        !          1696: # If TEXT has never been expanded, expand it *here*.  Use WITNESS as
        !          1697: # as a memory that TEXT has already been expanded.
        !          1698: m4_define([m4_expand_once],
        !          1699: [m4_provide_if(m4_ifval([$2], [[$2]], [[$1]]),
        !          1700:               [],
        !          1701:               [m4_provide(m4_ifval([$2], [[$2]], [[$1]]))[]$1])])
        !          1702: 
        !          1703: 
        !          1704: # m4_provide(MACRO-NAME)
        !          1705: # ----------------------
        !          1706: m4_define([m4_provide],
        !          1707: [m4_define([m4_provide($1)])])
        !          1708: 
        !          1709: 
        !          1710: # m4_provide_if(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
        !          1711: # -------------------------------------------------------
        !          1712: # If MACRO-NAME is provided do IF-PROVIDED, else IF-NOT-PROVIDED.
        !          1713: # The purpose of this macro is to provide the user with a means to
        !          1714: # check macros which are provided without letting her know how the
        !          1715: # information is coded.
        !          1716: m4_define([m4_provide_if],
        !          1717: [m4_ifdef([m4_provide($1)],
        !          1718:          [$2], [$3])])
        !          1719: 
        !          1720: 
        !          1721: ## --------------------- ##
        !          1722: ## 12. Text processing.  ##
        !          1723: ## --------------------- ##
        !          1724: 
        !          1725: 
        !          1726: # m4_cr_letters
        !          1727: # m4_cr_LETTERS
        !          1728: # m4_cr_Letters
        !          1729: # -------------
        !          1730: m4_define([m4_cr_letters], [abcdefghijklmnopqrstuvwxyz])
        !          1731: m4_define([m4_cr_LETTERS], [ABCDEFGHIJKLMNOPQRSTUVWXYZ])
        !          1732: m4_define([m4_cr_Letters],
        !          1733: m4_defn([m4_cr_letters])dnl
        !          1734: m4_defn([m4_cr_LETTERS])dnl
        !          1735: )
        !          1736: 
        !          1737: 
        !          1738: # m4_cr_digits
        !          1739: # ------------
        !          1740: m4_define([m4_cr_digits], [0123456789])
        !          1741: 
        !          1742: 
        !          1743: # m4_cr_alnum
        !          1744: # -----------
        !          1745: m4_define([m4_cr_alnum],
        !          1746: m4_defn([m4_cr_Letters])dnl
        !          1747: m4_defn([m4_cr_digits])dnl
        !          1748: )
        !          1749: 
        !          1750: 
        !          1751: # m4_cr_symbols1
        !          1752: # m4_cr_symbols2
        !          1753: # -------------------------------
        !          1754: m4_define([m4_cr_symbols1],
        !          1755: m4_defn([m4_cr_Letters])dnl
        !          1756: _)
        !          1757: 
        !          1758: m4_define([m4_cr_symbols2],
        !          1759: m4_defn([m4_cr_symbols1])dnl
        !          1760: m4_defn([m4_cr_digits])dnl
        !          1761: )
        !          1762: 
        !          1763: # m4_cr_all
        !          1764: # ---------
        !          1765: # The character range representing everything, with `-' as the last
        !          1766: # character, since it is special to m4_translit.  Use with care, because
        !          1767: # it contains characters special to M4 (fortunately, both ASCII and EBCDIC
        !          1768: # have [] in order, so m4_defn([m4_cr_all]) remains a valid string).  It
        !          1769: # also contains characters special to terminals, so it should never be
        !          1770: # displayed in an error message.  Also, attempts to map [ and ] to other
        !          1771: # characters via m4_translit must deal with the fact that m4_translit does
        !          1772: # not add quotes to the output.
        !          1773: #
        !          1774: # It is mainly useful in generating inverted character range maps, for use
        !          1775: # in places where m4_translit is faster than an equivalent m4_bpatsubst;
        !          1776: # the regex `[^a-z]' is equivalent to:
        !          1777: #  m4_translit(m4_dquote(m4_defn([m4_cr_all])), [a-z])
        !          1778: m4_define([m4_cr_all],
        !          1779: m4_translit(m4_dquote(m4_format(m4_dquote(m4_for(
        !          1780:   ,1,255,,[[%c]]))m4_for([i],1,255,,[,i]))), [-])-)
        !          1781: 
        !          1782: 
        !          1783: # _m4_define_cr_not(CATEGORY)
        !          1784: # ---------------------------
        !          1785: # Define m4_cr_not_CATEGORY as the inverse of m4_cr_CATEGORY.
        !          1786: m4_define([_m4_define_cr_not],
        !          1787: [m4_define([m4_cr_not_$1],
        !          1788:           m4_translit(m4_dquote(m4_defn([m4_cr_all])),
        !          1789:                       m4_defn([m4_cr_$1])))])
        !          1790: 
        !          1791: 
        !          1792: # m4_cr_not_letters
        !          1793: # m4_cr_not_LETTERS
        !          1794: # m4_cr_not_Letters
        !          1795: # m4_cr_not_digits
        !          1796: # m4_cr_not_alnum
        !          1797: # m4_cr_not_symbols1
        !          1798: # m4_cr_not_symbols2
        !          1799: # ------------------
        !          1800: # Inverse character sets
        !          1801: _m4_define_cr_not([letters])
        !          1802: _m4_define_cr_not([LETTERS])
        !          1803: _m4_define_cr_not([Letters])
        !          1804: _m4_define_cr_not([digits])
        !          1805: _m4_define_cr_not([alnum])
        !          1806: _m4_define_cr_not([symbols1])
        !          1807: _m4_define_cr_not([symbols2])
        !          1808: 
        !          1809: 
        !          1810: # m4_newline
        !          1811: # ----------
        !          1812: # Expands to a newline.  Exists for formatting reasons.
        !          1813: m4_define([m4_newline], [
        !          1814: ])
        !          1815: 
        !          1816: 
        !          1817: # m4_re_escape(STRING)
        !          1818: # --------------------
        !          1819: # Escape RE active characters in STRING.
        !          1820: m4_define([m4_re_escape],
        !          1821: [m4_bpatsubst([$1],
        !          1822:              [[][*+.?\^$]], [\\\&])])
        !          1823: 
        !          1824: 
        !          1825: # m4_re_string
        !          1826: # ------------
        !          1827: # Regexp for `[a-zA-Z_0-9]*'
        !          1828: # m4_dquote provides literal [] for the character class.
        !          1829: m4_define([m4_re_string],
        !          1830: m4_dquote(m4_defn([m4_cr_symbols2]))dnl
        !          1831: [*]dnl
        !          1832: )
        !          1833: 
        !          1834: 
        !          1835: # m4_re_word
        !          1836: # ----------
        !          1837: # Regexp for `[a-zA-Z_][a-zA-Z_0-9]*'
        !          1838: m4_define([m4_re_word],
        !          1839: m4_dquote(m4_defn([m4_cr_symbols1]))dnl
        !          1840: m4_defn([m4_re_string])dnl
        !          1841: )
        !          1842: 
        !          1843: 
        !          1844: # m4_tolower(STRING)
        !          1845: # m4_toupper(STRING)
        !          1846: # ------------------
        !          1847: # These macros convert STRING to lowercase or uppercase.
        !          1848: #
        !          1849: # Rather than expand the m4_defn each time, we inline them up front.
        !          1850: m4_define([m4_tolower],
        !          1851: [m4_translit([$1], ]m4_dquote(m4_defn([m4_cr_LETTERS]))[,
        !          1852:                   ]m4_dquote(m4_defn([m4_cr_letters]))[)])
        !          1853: m4_define([m4_toupper],
        !          1854: [m4_translit([$1], ]m4_dquote(m4_defn([m4_cr_letters]))[,
        !          1855:                   ]m4_dquote(m4_defn([m4_cr_LETTERS]))[)])
        !          1856: 
        !          1857: 
        !          1858: # m4_split(STRING, [REGEXP])
        !          1859: # --------------------------
        !          1860: #
        !          1861: # Split STRING into an m4 list of quoted elements.  The elements are
        !          1862: # quoted with [ and ].  Beginning spaces and end spaces *are kept*.
        !          1863: # Use m4_strip to remove them.
        !          1864: #
        !          1865: # REGEXP specifies where to split.  Default is [\t ]+.
        !          1866: #
        !          1867: # If STRING is empty, the result is an empty list.
        !          1868: #
        !          1869: # Pay attention to the m4_changequotes.  When m4 reads the definition of
        !          1870: # m4_split, it still has quotes set to [ and ].  Luckily, these are matched
        !          1871: # in the macro body, so the definition is stored correctly.  Use the same
        !          1872: # alternate quotes as m4_noquote; it must be unlikely to appear in $1.
        !          1873: #
        !          1874: # Also, notice that $1 is quoted twice, since we want the result to
        !          1875: # be quoted.  Then you should understand that the argument of
        !          1876: # patsubst is -=<{(STRING)}>=- (i.e., with additional -=<{( and )}>=-).
        !          1877: #
        !          1878: # This macro is safe on active symbols, i.e.:
        !          1879: #   m4_define(active, ACTIVE)
        !          1880: #   m4_split([active active ])end
        !          1881: #   => [active], [active], []end
        !          1882: #
        !          1883: # Optimize on regex of ` ' (space), since m4_foreach_w already guarantees
        !          1884: # that the list contains single space separators, and a common case is
        !          1885: # splitting a single-element list.  This macro is called frequently,
        !          1886: # so avoid unnecessary dnl inside the definition.
        !          1887: m4_define([m4_split],
        !          1888: [m4_if([$1], [], [],
        !          1889:        [$2], [ ], [m4_if(m4_index([$1], [ ]), [-1], [[[$1]]], [_$0($@)])],
        !          1890:        [$2], [], [_$0([$1], [[  ]+])],
        !          1891:        [_$0($@)])])
        !          1892: 
        !          1893: m4_define([_m4_split],
        !          1894: [m4_changequote([-=<{(],[)}>=-])]dnl
        !          1895: [[m4_bpatsubst(-=<{(-=<{($1)}>=-)}>=-, -=<{($2)}>=-,
        !          1896:               -=<{(], [)}>=-)]m4_changequote([, ])])
        !          1897: 
        !          1898: 
        !          1899: 
        !          1900: # m4_flatten(STRING)
        !          1901: # ------------------
        !          1902: # If STRING contains end of lines, replace them with spaces.  If there
        !          1903: # are backslashed end of lines, remove them.  This macro is safe with
        !          1904: # active symbols.
        !          1905: #    m4_define(active, ACTIVE)
        !          1906: #    m4_flatten([active
        !          1907: #    act\
        !          1908: #    ive])end
        !          1909: #    => active activeend
        !          1910: #
        !          1911: # In m4, m4_bpatsubst is expensive, so first check for a newline.
        !          1912: m4_define([m4_flatten],
        !          1913: [m4_if(m4_index([$1], [
        !          1914: ]), [-1], [[$1]],
        !          1915:        [m4_translit(m4_bpatsubst([[[$1]]], [\\
        !          1916: ]), [
        !          1917: ], [ ])])])
        !          1918: 
        !          1919: 
        !          1920: # m4_strip(STRING)
        !          1921: # ----------------
        !          1922: # Expands into STRING with tabs and spaces singled out into a single
        !          1923: # space, and removing leading and trailing spaces.
        !          1924: #
        !          1925: # This macro is robust to active symbols.
        !          1926: #    m4_define(active, ACTIVE)
        !          1927: #    m4_strip([  active <tab> <tab>active ])end
        !          1928: #    => active activeend
        !          1929: #
        !          1930: # First, notice that we guarantee trailing space.  Why?  Because regular
        !          1931: # expressions are greedy, and `.* ?' would always group the space into the
        !          1932: # .* portion.  The algorithm is simpler by avoiding `?' at the end.  The
        !          1933: # algorithm correctly strips everything if STRING is just ` '.
        !          1934: #
        !          1935: # Then notice the second pattern: it is in charge of removing the
        !          1936: # leading/trailing spaces.  Why not just `[^ ]'?  Because they are
        !          1937: # applied to over-quoted strings, i.e. more or less [STRING], due
        !          1938: # to the limitations of m4_bpatsubsts.  So the leading space in STRING
        !          1939: # is the *second* character; equally for the trailing space.
        !          1940: m4_define([m4_strip],
        !          1941: [m4_bpatsubsts([$1 ],
        !          1942:               [[        ]+], [ ],
        !          1943:               [^. ?\(.*\) .$], [[[\1]]])])
        !          1944: 
        !          1945: 
        !          1946: # m4_normalize(STRING)
        !          1947: # --------------------
        !          1948: # Apply m4_flatten and m4_strip to STRING.
        !          1949: #
        !          1950: # The argument is quoted, so that the macro is robust to active symbols:
        !          1951: #
        !          1952: #    m4_define(active, ACTIVE)
        !          1953: #    m4_normalize([  act\
        !          1954: #    ive
        !          1955: #    active ])end
        !          1956: #    => active activeend
        !          1957: 
        !          1958: m4_define([m4_normalize],
        !          1959: [m4_strip(m4_flatten([$1]))])
        !          1960: 
        !          1961: 
        !          1962: 
        !          1963: # m4_join(SEP, ARG1, ARG2...)
        !          1964: # ---------------------------
        !          1965: # Produce ARG1SEPARG2...SEPARGn.  Avoid back-to-back SEP when a given ARG
        !          1966: # is the empty string.  No expansion is performed on SEP or ARGs.
        !          1967: #
        !          1968: # Since the number of arguments to join can be arbitrarily long, we
        !          1969: # want to avoid having more than one $@ in the macro definition;
        !          1970: # otherwise, the expansion would require twice the memory of the already
        !          1971: # long list.  Hence, m4_join merely looks for the first non-empty element,
        !          1972: # and outputs just that element; while _m4_join looks for all non-empty
        !          1973: # elements, and outputs them following a separator.  The final trick to
        !          1974: # note is that we decide between recursing with $0 or _$0 based on the
        !          1975: # nested m4_if ending with `_'.
        !          1976: #
        !          1977: # Please keep foreach.m4 in sync with any adjustments made here.
        !          1978: m4_define([m4_join],
        !          1979: [m4_if([$#], [1], [],
        !          1980:        [$#], [2], [[$2]],
        !          1981:        [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift2($@))])])
        !          1982: m4_define([_m4_join],
        !          1983: [m4_if([$#$2], [2], [],
        !          1984:        [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift2($@))])])
        !          1985: 
        !          1986: # m4_joinall(SEP, ARG1, ARG2...)
        !          1987: # ------------------------------
        !          1988: # Produce ARG1SEPARG2...SEPARGn.  An empty ARG results in back-to-back SEP.
        !          1989: # No expansion is performed on SEP or ARGs.
        !          1990: #
        !          1991: # Please keep foreach.m4 in sync with any adjustments made here.
        !          1992: m4_define([m4_joinall], [[$2]_$0([$1], m4_shift($@))])
        !          1993: m4_define([_m4_joinall],
        !          1994: [m4_if([$#], [2], [], [[$1$3]$0([$1], m4_shift2($@))])])
        !          1995: 
        !          1996: # m4_combine([SEPARATOR], PREFIX-LIST, [INFIX], SUFFIX...)
        !          1997: # --------------------------------------------------------
        !          1998: # Produce the pairwise combination of every element in the quoted,
        !          1999: # comma-separated PREFIX-LIST with every element from the SUFFIX arguments.
        !          2000: # Each pair is joined with INFIX, and pairs are separated by SEPARATOR.
        !          2001: # No expansion occurs on SEPARATOR, INFIX, or elements of either list.
        !          2002: #
        !          2003: # For example:
        !          2004: #   m4_combine([, ], [[a], [b], [c]], [-], [1], [2], [3])
        !          2005: #   => a-1, a-2, a-3, b-1, b-2, b-3, c-1, c-2, c-3
        !          2006: #
        !          2007: # In order to have the correct number of SEPARATORs, we use a temporary
        !          2008: # variable that redefines itself after the first use.  We must use defn
        !          2009: # rather than overquoting in case PREFIX or SUFFIX contains $1, but use
        !          2010: # _m4_defn for speed.  Likewise, we compute the m4_shift3 only once,
        !          2011: # rather than in each iteration of the outer m4_foreach.
        !          2012: m4_define([m4_combine],
        !          2013: [m4_if(m4_eval([$# > 3]), [1],
        !          2014:        [m4_pushdef([m4_Separator], [m4_define([m4_Separator],
        !          2015:                                    _m4_defn([m4_echo]))])]]dnl
        !          2016: [[m4_foreach([m4_Prefix], [$2],
        !          2017:             [m4_foreach([m4_Suffix], ]m4_dquote(m4_dquote(m4_shift3($@)))[,
        !          2018:        [m4_Separator([$1])[]_m4_defn([m4_Prefix])[$3]_m4_defn(
        !          2019:                                                      [m4_Suffix])])])]]dnl
        !          2020: [[_m4_popdef([m4_Separator])])])
        !          2021: 
        !          2022: 
        !          2023: # m4_append(MACRO-NAME, STRING, [SEPARATOR])
        !          2024: # ------------------------------------------
        !          2025: # Redefine MACRO-NAME to hold its former content plus `SEPARATOR`'STRING'
        !          2026: # at the end.  It is valid to use this macro with MACRO-NAME undefined,
        !          2027: # in which case no SEPARATOR is added.  Be aware that the criterion is
        !          2028: # `not being defined', and not `not being empty'.
        !          2029: #
        !          2030: # Note that neither STRING nor SEPARATOR are expanded here; rather, when
        !          2031: # you expand MACRO-NAME, they will be expanded at that point in time.
        !          2032: #
        !          2033: # This macro is robust to active symbols.  It can be used to grow
        !          2034: # strings.
        !          2035: #
        !          2036: #    | m4_define(active, ACTIVE)dnl
        !          2037: #    | m4_append([sentence], [This is an])dnl
        !          2038: #    | m4_append([sentence], [ active ])dnl
        !          2039: #    | m4_append([sentence], [symbol.])dnl
        !          2040: #    | sentence
        !          2041: #    | m4_undefine([active])dnl
        !          2042: #    | sentence
        !          2043: #    => This is an ACTIVE symbol.
        !          2044: #    => This is an active symbol.
        !          2045: #
        !          2046: # It can be used to define hooks.
        !          2047: #
        !          2048: #    | m4_define(active, ACTIVE)dnl
        !          2049: #    | m4_append([hooks], [m4_define([act1], [act2])])dnl
        !          2050: #    | m4_append([hooks], [m4_define([act2], [active])])dnl
        !          2051: #    | m4_undefine([active])dnl
        !          2052: #    | act1
        !          2053: #    | hooks
        !          2054: #    | act1
        !          2055: #    => act1
        !          2056: #    =>
        !          2057: #    => active
        !          2058: #
        !          2059: # It can also be used to create lists, although this particular usage was
        !          2060: # broken prior to autoconf 2.62.
        !          2061: #    | m4_append([list], [one], [, ])dnl
        !          2062: #    | m4_append([list], [two], [, ])dnl
        !          2063: #    | m4_append([list], [three], [, ])dnl
        !          2064: #    | list
        !          2065: #    | m4_dquote(list)
        !          2066: #    => one, two, three
        !          2067: #    => [one],[two],[three]
        !          2068: #
        !          2069: # Note that m4_append can benefit from amortized O(n) m4 behavior, if
        !          2070: # the underlying m4 implementation is smart enough to avoid copying existing
        !          2071: # contents when enlarging a macro's definition into any pre-allocated storage
        !          2072: # (m4 1.4.x unfortunately does not implement this optimization).  We do
        !          2073: # not implement m4_prepend, since it is inherently O(n^2) (pre-allocated
        !          2074: # storage only occurs at the end of a macro, so the existing contents must
        !          2075: # always be moved).
        !          2076: #
        !          2077: # Use _m4_defn for speed.
        !          2078: m4_define([m4_append],
        !          2079: [m4_define([$1], m4_ifdef([$1], [_m4_defn([$1])[$3]])[$2])])
        !          2080: 
        !          2081: 
        !          2082: # m4_append_uniq(MACRO-NAME, STRING, [SEPARATOR], [IF-UNIQ], [IF-DUP])
        !          2083: # --------------------------------------------------------------------
        !          2084: # Like `m4_append', but append only if not yet present.  Additionally,
        !          2085: # expand IF-UNIQ if STRING was appended, or IF-DUP if STRING was already
        !          2086: # present.  Also, warn if SEPARATOR is not empty and occurs within STRING,
        !          2087: # as the algorithm no longer guarantees uniqueness.
        !          2088: #
        !          2089: # Note that while m4_append can be O(n) (depending on the quality of the
        !          2090: # underlying M4 implementation), m4_append_uniq is inherently O(n^2)
        !          2091: # because each append operation searches the entire string.
        !          2092: m4_define([m4_append_uniq],
        !          2093: [m4_ifval([$3], [m4_if(m4_index([$2], [$3]), [-1], [],
        !          2094:                       [m4_warn([syntax],
        !          2095:                                [$0: `$2' contains `$3'])])])_$0($@)])
        !          2096: m4_define([_m4_append_uniq],
        !          2097: [m4_ifdef([$1],
        !          2098:          [m4_if(m4_index([$3]_m4_defn([$1])[$3], [$3$2$3]), [-1],
        !          2099:                 [m4_append([$1], [$2], [$3])$4], [$5])],
        !          2100:          [m4_define([$1], [$2])$4])])
        !          2101: 
        !          2102: # m4_append_uniq_w(MACRO-NAME, STRINGS)
        !          2103: # -------------------------------------
        !          2104: # For each of the words in the whitespace separated list STRINGS, append
        !          2105: # only the unique strings to the definition of MACRO-NAME.
        !          2106: #
        !          2107: # Use _m4_defn for speed.
        !          2108: m4_define([m4_append_uniq_w],
        !          2109: [m4_foreach_w([m4_Word], [$2],
        !          2110:              [_m4_append_uniq([$1], _m4_defn([m4_Word]), [ ])])])
        !          2111: 
        !          2112: 
        !          2113: # m4_text_wrap(STRING, [PREFIX], [FIRST-PREFIX], [WIDTH])
        !          2114: # -------------------------------------------------------
        !          2115: # Expands into STRING wrapped to hold in WIDTH columns (default = 79).
        !          2116: # If PREFIX is given, each line is prefixed with it.  If FIRST-PREFIX is
        !          2117: # specified, then the first line is prefixed with it.  As a special case,
        !          2118: # if the length of FIRST-PREFIX is greater than that of PREFIX, then
        !          2119: # FIRST-PREFIX will be left alone on the first line.
        !          2120: #
        !          2121: # No expansion occurs on the contents STRING, PREFIX, or FIRST-PREFIX,
        !          2122: # although quadrigraphs are correctly recognized.
        !          2123: #
        !          2124: # Typical outputs are:
        !          2125: #
        !          2126: # m4_text_wrap([Short string */], [   ], [/* ], 20)
        !          2127: #  => /* Short string */
        !          2128: #
        !          2129: # m4_text_wrap([Much longer string */], [   ], [/* ], 20)
        !          2130: #  => /* Much longer
        !          2131: #  =>    string */
        !          2132: #
        !          2133: # m4_text_wrap([Short doc.], [          ], [  --short ], 30)
        !          2134: #  =>   --short Short doc.
        !          2135: #
        !          2136: # m4_text_wrap([Short doc.], [          ], [  --too-wide ], 30)
        !          2137: #  =>   --too-wide
        !          2138: #  =>           Short doc.
        !          2139: #
        !          2140: # m4_text_wrap([Super long documentation.], [          ], [  --too-wide ], 30)
        !          2141: #  =>   --too-wide
        !          2142: #  =>      Super long
        !          2143: #  =>      documentation.
        !          2144: #
        !          2145: # FIXME: there is no checking of a longer PREFIX than WIDTH, but do
        !          2146: # we really want to bother with people trying each single corner
        !          2147: # of a software?
        !          2148: #
        !          2149: # This macro does not leave a trailing space behind the last word of a line,
        !          2150: # which complicates it a bit.  The algorithm is otherwise stupid and simple:
        !          2151: # all the words are preceded by m4_Separator which is defined to empty for
        !          2152: # the first word, and then ` ' (single space) for all the others.
        !          2153: #
        !          2154: # The algorithm uses a helper that uses $2 through $4 directly, rather than
        !          2155: # using local variables, to avoid m4_defn overhead, or expansion swallowing
        !          2156: # any $.  It also bypasses m4_popdef overhead with _m4_popdef since no user
        !          2157: # macro expansion occurs in the meantime.  Also, the definition is written
        !          2158: # with m4_do, to avoid time wasted on dnl during expansion (since this is
        !          2159: # already a time-consuming macro).
        !          2160: m4_define([m4_text_wrap],
        !          2161: [_$0([$1], [$2], m4_if([$3], [], [[$2]], [[$3]]),
        !          2162:      m4_if([$4], [], [79], [[$4]]))])
        !          2163: m4_define([_m4_text_wrap],
        !          2164: m4_do(dnl set up local variables, to avoid repeated calculations
        !          2165: [[m4_pushdef([m4_Indent], m4_qlen([$2]))]],
        !          2166: [[m4_pushdef([m4_Cursor], m4_qlen([$3]))]],
        !          2167: [[m4_pushdef([m4_Separator], [m4_define([m4_Separator], [ ])])]],
        !          2168: dnl expand the first prefix, then check its length vs. regular prefix
        !          2169: dnl same length: nothing special
        !          2170: dnl prefix1 longer: output on line by itself, and reset cursor
        !          2171: dnl prefix1 shorter: pad to length of prefix, and reset cursor
        !          2172: [[[$3]m4_cond([m4_Cursor], m4_Indent, [],
        !          2173:              [m4_eval(m4_Cursor > m4_Indent)], [1], [
        !          2174: [$2]m4_define([m4_Cursor], m4_Indent)],
        !          2175:              [m4_format([%*s], m4_max([0],
        !          2176:   m4_eval(m4_Indent - m4_Cursor)), [])m4_define([m4_Cursor], m4_Indent)])]],
        !          2177: dnl now, for each word, compute the curser after the word is output, then
        !          2178: dnl check if the cursor would exceed the wrap column
        !          2179: dnl if so, reset cursor, and insert newline and prefix
        !          2180: dnl if not, insert the separator (usually a space)
        !          2181: dnl either way, insert the word
        !          2182: [[m4_foreach_w([m4_Word], [$1],
        !          2183:   [m4_define([m4_Cursor],
        !          2184:             m4_eval(m4_Cursor + m4_qlen(_m4_defn([m4_Word]))
        !          2185:                     + 1))m4_if(m4_eval(m4_Cursor > ([$4])),
        !          2186:       [1], [m4_define([m4_Cursor],
        !          2187:                      m4_eval(m4_Indent + m4_qlen(_m4_defn([m4_Word])) + 1))
        !          2188: [$2]],
        !          2189:       [m4_Separator[]])_m4_defn([m4_Word])])]],
        !          2190: dnl finally, clean up the local variabls
        !          2191: [[_m4_popdef([m4_Separator], [m4_Cursor], [m4_Indent])]]))
        !          2192: 
        !          2193: 
        !          2194: # m4_text_box(MESSAGE, [FRAME-CHARACTER = `-'])
        !          2195: # ---------------------------------------------
        !          2196: # Turn MESSAGE into:
        !          2197: #  ## ------- ##
        !          2198: #  ## MESSAGE ##
        !          2199: #  ## ------- ##
        !          2200: # using FRAME-CHARACTER in the border.
        !          2201: m4_define([m4_text_box],
        !          2202: [m4_pushdef([m4_Border],
        !          2203:            m4_translit(m4_format([%*s], m4_qlen(m4_expand([$1])), []),
        !          2204:                        [ ], m4_if([$2], [], [[-]], [[$2]])))dnl
        !          2205: @%:@@%:@ m4_Border @%:@@%:@
        !          2206: @%:@@%:@ $1 @%:@@%:@
        !          2207: @%:@@%:@ m4_Border @%:@@%:@_m4_popdef([m4_Border])dnl
        !          2208: ])
        !          2209: 
        !          2210: 
        !          2211: # m4_qlen(STRING)
        !          2212: # ---------------
        !          2213: # Expands to the length of STRING after autom4te converts all quadrigraphs.
        !          2214: #
        !          2215: # Avoid bpatsubsts for the common case of no quadrigraphs.
        !          2216: m4_define([m4_qlen],
        !          2217: [m4_if(m4_index([$1], [@]), [-1], [m4_len([$1])],
        !          2218:        [m4_len(m4_bpatsubst([[$1]],
        !          2219:                            [@\(\(<:\|:>\|S|\|%:\|\{:\|:\}\)\(@\)\|&t@\)],
        !          2220:                            [\3]))])])
        !          2221: 
        !          2222: 
        !          2223: # m4_qdelta(STRING)
        !          2224: # -----------------
        !          2225: # Expands to the net change in the length of STRING from autom4te converting the
        !          2226: # quadrigraphs in STRING.  This number is always negative or zero.
        !          2227: m4_define([m4_qdelta],
        !          2228: [m4_eval(m4_qlen([$1]) - m4_len([$1]))])
        !          2229: 
        !          2230: 
        !          2231: 
        !          2232: ## ----------------------- ##
        !          2233: ## 13. Number processing.  ##
        !          2234: ## ----------------------- ##
        !          2235: 
        !          2236: # m4_cmp(A, B)
        !          2237: # ------------
        !          2238: # Compare two integer expressions.
        !          2239: # A < B -> -1
        !          2240: # A = B ->  0
        !          2241: # A > B ->  1
        !          2242: m4_define([m4_cmp],
        !          2243: [m4_eval((([$1]) > ([$2])) - (([$1]) < ([$2])))])
        !          2244: 
        !          2245: 
        !          2246: # m4_list_cmp(A, B)
        !          2247: # -----------------
        !          2248: #
        !          2249: # Compare the two lists of integer expressions A and B.  For instance:
        !          2250: #   m4_list_cmp([1, 0],     [1])    ->  0
        !          2251: #   m4_list_cmp([1, 0],     [1, 0]) ->  0
        !          2252: #   m4_list_cmp([1, 2],     [1, 0]) ->  1
        !          2253: #   m4_list_cmp([1, 2, 3],  [1, 2]) ->  1
        !          2254: #   m4_list_cmp([1, 2, -3], [1, 2]) -> -1
        !          2255: #   m4_list_cmp([1, 0],     [1, 2]) -> -1
        !          2256: #   m4_list_cmp([1],        [1, 2]) -> -1
        !          2257: #   m4_define([xa], [oops])dnl
        !          2258: #   m4_list_cmp([[0xa]],    [5+5])  -> 0
        !          2259: #
        !          2260: # Rather than face the overhead of m4_case, we use a helper function whose
        !          2261: # expansion includes the name of the macro to invoke on the tail, either
        !          2262: # m4_ignore or m4_unquote.  This is particularly useful when comparing
        !          2263: # long lists, since less text is being expanded for deciding when to end
        !          2264: # recursion.  The recursion is between a pair of macros that alternate
        !          2265: # which list is trimmed by one element; this is more efficient than
        !          2266: # calling m4_cdr on both lists from a single macro.  Guarantee exactly
        !          2267: # one expansion of both lists' side effects.
        !          2268: #
        !          2269: # Please keep foreach.m4 in sync with any adjustments made here.
        !          2270: m4_define([m4_list_cmp],
        !          2271: [_$0_raw(m4_dquote($1), m4_dquote($2))])
        !          2272: 
        !          2273: m4_define([_m4_list_cmp_raw],
        !          2274: [m4_if([$1], [$2], [0], [_m4_list_cmp_1([$1], $2)])])
        !          2275: 
        !          2276: m4_define([_m4_list_cmp],
        !          2277: [m4_if([$1], [], [0m4_ignore], [$2], [0], [m4_unquote], [$2m4_ignore])])
        !          2278: 
        !          2279: m4_define([_m4_list_cmp_1],
        !          2280: [_m4_list_cmp_2([$2], [m4_shift2($@)], $1)])
        !          2281: 
        !          2282: m4_define([_m4_list_cmp_2],
        !          2283: [_m4_list_cmp([$1$3], m4_cmp([$3+0], [$1+0]))(
        !          2284:   [_m4_list_cmp_1(m4_dquote(m4_shift3($@)), $2)])])
        !          2285: 
        !          2286: # m4_max(EXPR, ...)
        !          2287: # m4_min(EXPR, ...)
        !          2288: # -----------------
        !          2289: # Return the decimal value of the maximum (or minimum) in a series of
        !          2290: # integer expressions.
        !          2291: #
        !          2292: # M4 1.4.x doesn't provide ?:.  Hence this huge m4_eval.  Avoid m4_eval
        !          2293: # if both arguments are identical, but be aware of m4_max(0xa, 10) (hence
        !          2294: # the use of <=, not just <, in the second multiply).
        !          2295: #
        !          2296: # Please keep foreach.m4 in sync with any adjustments made here.
        !          2297: m4_define([m4_max],
        !          2298: [m4_if([$#], [0], [m4_fatal([too few arguments to $0])],
        !          2299:        [$#], [1], [m4_eval([$1])],
        !          2300:        [$#$1], [2$2], [m4_eval([$1])],
        !          2301:        [$#], [2], [_$0($@)],
        !          2302:        [_m4_minmax([_$0], $@)])])
        !          2303: 
        !          2304: m4_define([_m4_max],
        !          2305: [m4_eval((([$1]) > ([$2])) * ([$1]) + (([$1]) <= ([$2])) * ([$2]))])
        !          2306: 
        !          2307: m4_define([m4_min],
        !          2308: [m4_if([$#], [0], [m4_fatal([too few arguments to $0])],
        !          2309:        [$#], [1], [m4_eval([$1])],
        !          2310:        [$#$1], [2$2], [m4_eval([$1])],
        !          2311:        [$#], [2], [_$0($@)],
        !          2312:        [_m4_minmax([_$0], $@)])])
        !          2313: 
        !          2314: m4_define([_m4_min],
        !          2315: [m4_eval((([$1]) < ([$2])) * ([$1]) + (([$1]) >= ([$2])) * ([$2]))])
        !          2316: 
        !          2317: # _m4_minmax(METHOD, ARG1, ARG2...)
        !          2318: # ---------------------------------
        !          2319: # Common recursion code for m4_max and m4_min.  METHOD must be _m4_max
        !          2320: # or _m4_min, and there must be at least two arguments to combine.
        !          2321: #
        !          2322: # Please keep foreach.m4 in sync with any adjustments made here.
        !          2323: m4_define([_m4_minmax],
        !          2324: [m4_if([$#], [3], [$1([$2], [$3])],
        !          2325:        [$0([$1], $1([$2], [$3]), m4_shift3($@))])])
        !          2326: 
        !          2327: 
        !          2328: # m4_sign(A)
        !          2329: # ----------
        !          2330: # The sign of the integer expression A.
        !          2331: m4_define([m4_sign],
        !          2332: [m4_eval((([$1]) > 0) - (([$1]) < 0))])
        !          2333: 
        !          2334: 
        !          2335: 
        !          2336: ## ------------------------ ##
        !          2337: ## 14. Version processing.  ##
        !          2338: ## ------------------------ ##
        !          2339: 
        !          2340: 
        !          2341: # m4_version_unletter(VERSION)
        !          2342: # ----------------------------
        !          2343: # Normalize beta version numbers with letters to numeric expressions, which
        !          2344: # can then be handed to m4_eval for the purpose of comparison.
        !          2345: #
        !          2346: #   Nl -> (N+1).-1.(l#)
        !          2347: #
        !          2348: # for example:
        !          2349: #   [2.14a] -> [2.14+1.-1.[0r36:a]] -> 2.15.-1.10
        !          2350: #   [2.14b] -> [2.15+1.-1.[0r36:b]] -> 2.15.-1.11
        !          2351: #   [2.61aa.b] -> [2.61+1.-1.[0r36:aa],+1.-1.[0r36:b]] -> 2.62.-1.370.1.-1.11
        !          2352: #
        !          2353: # This macro expects reasonable version numbers, but can handle double
        !          2354: # letters and does not expand any macros.  Original version strings can
        !          2355: # use both `.' and `-' separators.
        !          2356: #
        !          2357: # Inline constant expansions, to avoid m4_defn overhead.
        !          2358: # _m4_version_unletter is the real workhorse used by m4_version_compare,
        !          2359: # but since [0r36:a] is less readable than 10, we provide a wrapper for
        !          2360: # human use.
        !          2361: m4_define([m4_version_unletter],
        !          2362: [m4_map_sep([m4_eval], [.],
        !          2363:            m4_dquote(m4_dquote_elt(m4_unquote(_$0([$1])))))])
        !          2364: m4_define([_m4_version_unletter],
        !          2365: [m4_bpatsubst(m4_translit([[[$1]]], [.-], [,,]),]dnl
        !          2366: m4_dquote(m4_dquote(m4_defn([m4_cr_Letters])))[[+],
        !          2367:              [+1,-1,[0r36:\&]])])
        !          2368: 
        !          2369: 
        !          2370: # m4_version_compare(VERSION-1, VERSION-2)
        !          2371: # ----------------------------------------
        !          2372: # Compare the two version numbers and expand into
        !          2373: #  -1 if VERSION-1 < VERSION-2
        !          2374: #   0 if           =
        !          2375: #   1 if           >
        !          2376: #
        !          2377: # Since _m4_version_unletter does not output side effects, we can
        !          2378: # safely bypass the overhead of m4_version_cmp.
        !          2379: m4_define([m4_version_compare],
        !          2380: [_m4_list_cmp_raw(_m4_version_unletter([$1]), _m4_version_unletter([$2]))])
        !          2381: 
        !          2382: 
        !          2383: # m4_PACKAGE_NAME
        !          2384: # m4_PACKAGE_TARNAME
        !          2385: # m4_PACKAGE_VERSION
        !          2386: # m4_PACKAGE_STRING
        !          2387: # m4_PACKAGE_BUGREPORT
        !          2388: # --------------------
        !          2389: # If m4sugar/version.m4 is present, then define version strings.  This
        !          2390: # file is optional, provided by Autoconf but absent in Bison.
        !          2391: m4_sinclude([m4sugar/version.m4])
        !          2392: 
        !          2393: 
        !          2394: # m4_version_prereq(VERSION, [IF-OK], [IF-NOT = FAIL])
        !          2395: # ----------------------------------------------------
        !          2396: # Check this Autoconf version against VERSION.
        !          2397: m4_define([m4_version_prereq],
        !          2398: m4_ifdef([m4_PACKAGE_VERSION],
        !          2399: [[m4_if(m4_version_compare(]m4_dquote(m4_defn([m4_PACKAGE_VERSION]))[, [$1]),
        !          2400:        [-1],
        !          2401:        [m4_default([$3],
        !          2402:                    [m4_fatal([Autoconf version $1 or higher is required],
        !          2403:                              [63])])],
        !          2404:        [$2])]],
        !          2405: [[m4_fatal([m4sugar/version.m4 not found])]]))
        !          2406: 
        !          2407: 
        !          2408: ## ------------------ ##
        !          2409: ## 15. Set handling.  ##
        !          2410: ## ------------------ ##
        !          2411: 
        !          2412: # Autoconf likes to create arbitrarily large sets; for example, as of
        !          2413: # this writing, the configure.ac for coreutils tracks a set of more
        !          2414: # than 400 AC_SUBST.  How do we track all of these set members,
        !          2415: # without introducing duplicates?  We could use m4_append_uniq, with
        !          2416: # the set NAME residing in the contents of the macro NAME.
        !          2417: # Unfortunately, m4_append_uniq is quadratic for set creation, because
        !          2418: # it costs O(n) to search the string for each of O(n) insertions; not
        !          2419: # to mention that with m4 1.4.x, even using m4_append is slow, costing
        !          2420: # O(n) rather than O(1) per insertion.  Other set operations, not used
        !          2421: # by Autoconf but still possible by manipulation of the definition
        !          2422: # tracked in macro NAME, include O(n) deletion of one element and O(n)
        !          2423: # computation of set size.  Because the set is exposed to the user via
        !          2424: # the definition of a single macro, we cannot cache any data about the
        !          2425: # set without risking the cache being invalidated by the user
        !          2426: # redefining NAME.
        !          2427: #
        !          2428: # Can we do better?  Yes, because m4 gives us an O(1) search function
        !          2429: # for free: ifdef.  Additionally, even m4 1.4.x gives us an O(1)
        !          2430: # insert operation for free: pushdef.  But to use these, we must
        !          2431: # represent the set via a group of macros; to keep the set consistent,
        !          2432: # we must hide the set so that the user can only manipulate it through
        !          2433: # accessor macros.  The contents of the set are maintained through two
        !          2434: # access points; _m4_set([name]) is a pushdef stack of values in the
        !          2435: # set, useful for O(n) traversal of the set contents; while the
        !          2436: # existence of _m4_set([name],value) with no particular value is
        !          2437: # useful for O(1) querying of set membership.  And since the user
        !          2438: # cannot externally manipulate the set, we are free to add additional
        !          2439: # caching macros for other performance improvements.  Deletion can be
        !          2440: # O(1) per element rather than O(n), by reworking the definition of
        !          2441: # _m4_set([name],value) to be 0 or 1 based on current membership, and
        !          2442: # adding _m4_set_cleanup(name) to defer the O(n) cleanup of
        !          2443: # _m4_set([name]) until we have another reason to do an O(n)
        !          2444: # traversal.  The existence of _m4_set_cleanup(name) can then be used
        !          2445: # elsewhere to determine if we must dereference _m4_set([name],value),
        !          2446: # or assume that definition implies set membership.  Finally, size can
        !          2447: # be tracked in an O(1) fashion with _m4_set_size(name).
        !          2448: #
        !          2449: # The quoting in _m4_set([name],value) is chosen so that there is no
        !          2450: # ambiguity with a set whose name contains a comma, and so that we can
        !          2451: # supply the value via _m4_defn([_m4_set([name])]) without needing any
        !          2452: # quote manipulation.
        !          2453: 
        !          2454: # m4_set_add(SET, VALUE, [IF-UNIQ], [IF-DUP])
        !          2455: # -------------------------------------------
        !          2456: # Add VALUE as an element of SET.  Expand IF-UNIQ on the first
        !          2457: # addition, and IF-DUP if it is already in the set.  Addition of one
        !          2458: # element is O(1), such that overall set creation is O(n).
        !          2459: #
        !          2460: # We do not want to add a duplicate for a previously deleted but
        !          2461: # unpruned element, but it is just as easy to check existence directly
        !          2462: # as it is to query _m4_set_cleanup($1).
        !          2463: m4_define([m4_set_add],
        !          2464: [m4_ifdef([_m4_set([$1],$2)],
        !          2465:          [m4_if(m4_indir([_m4_set([$1],$2)]), [0],
        !          2466:                 [m4_define([_m4_set([$1],$2)],
        !          2467:                            [1])_m4_set_size([$1], [m4_incr])$3], [$4])],
        !          2468:          [m4_define([_m4_set([$1],$2)],
        !          2469:                     [1])m4_pushdef([_m4_set([$1])],
        !          2470:                                    [$2])_m4_set_size([$1], [m4_incr])$3])])
        !          2471: 
        !          2472: # m4_set_add_all(SET, VALUE...)
        !          2473: # -----------------------------
        !          2474: # Add each VALUE into SET.  This is O(n) in the number of VALUEs, and
        !          2475: # can be faster than calling m4_set_add for each VALUE.
        !          2476: #
        !          2477: # Implement two recursion helpers; the check variant is slower but
        !          2478: # handles the case where an element has previously been removed but
        !          2479: # not pruned.  The recursion helpers ignore their second argument, so
        !          2480: # that we can use the faster m4_shift2 and 2 arguments, rather than
        !          2481: # _m4_shift2 and one argument, as the signal to end recursion.
        !          2482: #
        !          2483: # Please keep foreach.m4 in sync with any adjustments made here.
        !          2484: m4_define([m4_set_add_all],
        !          2485: [m4_define([_m4_set_size($1)], m4_eval(m4_set_size([$1])
        !          2486:   + m4_len(m4_ifdef([_m4_set_cleanup($1)], [_$0_check], [_$0])([$1], $@))))])
        !          2487: 
        !          2488: m4_define([_m4_set_add_all],
        !          2489: [m4_if([$#], [2], [],
        !          2490:        [m4_ifdef([_m4_set([$1],$3)], [],
        !          2491:                 [m4_define([_m4_set([$1],$3)], [1])m4_pushdef([_m4_set([$1])],
        !          2492:           [$3])-])$0([$1], m4_shift2($@))])])
        !          2493: 
        !          2494: m4_define([_m4_set_add_all_check],
        !          2495: [m4_if([$#], [2], [],
        !          2496:        [m4_set_add([$1], [$3])$0([$1], m4_shift2($@))])])
        !          2497: 
        !          2498: # m4_set_contains(SET, VALUE, [IF-PRESENT], [IF-ABSENT])
        !          2499: # ------------------------------------------------------
        !          2500: # Expand IF-PRESENT if SET contains VALUE, otherwise expand IF-ABSENT.
        !          2501: # This is always O(1).
        !          2502: m4_define([m4_set_contains],
        !          2503: [m4_ifdef([_m4_set_cleanup($1)],
        !          2504:          [m4_if(m4_ifdef([_m4_set([$1],$2)],
        !          2505:                    [m4_indir([_m4_set([$1],$2)])], [0]), [1], [$3], [$4])],
        !          2506:          [m4_ifdef([_m4_set([$1],$2)], [$3], [$4])])])
        !          2507: 
        !          2508: # m4_set_contents(SET, [SEP])
        !          2509: # ---------------------------
        !          2510: # Expand to a single string containing all the elements in SET,
        !          2511: # separated by SEP, without modifying SET.  No provision is made for
        !          2512: # disambiguating set elements that contain non-empty SEP as a
        !          2513: # sub-string, or for recognizing a set that contains only the empty
        !          2514: # string.  Order of the output is not guaranteed.  If any elements
        !          2515: # have been previously removed from the set, this action will prune
        !          2516: # the unused memory.  This is O(n) in the size of the set before
        !          2517: # pruning.
        !          2518: #
        !          2519: # Use _m4_popdef for speed.  The existence of _m4_set_cleanup($1)
        !          2520: # determines which version of _1 helper we use.
        !          2521: m4_define([m4_set_contents],
        !          2522: [m4_ifdef([_m4_set_cleanup($1)], [_$0_1c], [_$0_1])([$1])_$0_2([$1],
        !          2523:     [_m4_defn([_m4_set_($1)])], [[$2]])])
        !          2524: 
        !          2525: # _m4_set_contents_1(SET)
        !          2526: # _m4_set_contents_1c(SET)
        !          2527: # _m4_set_contents_2(SET, SEP, PREP)
        !          2528: # ----------------------------------
        !          2529: # Expand to a list of quoted elements currently in the set, separated
        !          2530: # by SEP, and moving PREP in front of SEP on recursion.  To avoid
        !          2531: # nesting limit restrictions, the algorithm must be broken into two
        !          2532: # parts; _1 destructively copies the stack in reverse into
        !          2533: # _m4_set_($1), producing no output; then _2 destructively copies
        !          2534: # _m4_set_($1) back into the stack in reverse.  SEP is expanded while
        !          2535: # _m4_set_($1) contains the current element, so a SEP containing
        !          2536: # _m4_defn([_m4_set_($1)]) can produce output in the order the set was
        !          2537: # created.  Behavior is undefined if SEP tries to recursively list or
        !          2538: # modify SET in any way other than calling m4_set_remove on the
        !          2539: # current element.  Use _1 if all entries in the stack are guaranteed
        !          2540: # to be in the set, and _1c to prune removed entries.  Uses _m4_defn
        !          2541: # and _m4_popdef for speed.
        !          2542: m4_define([_m4_set_contents_1],
        !          2543: [m4_ifdef([_m4_set([$1])], [m4_pushdef([_m4_set_($1)],
        !          2544:     _m4_defn([_m4_set([$1])]))_m4_popdef([_m4_set([$1])])$0([$1])])])
        !          2545: 
        !          2546: m4_define([_m4_set_contents_1c],
        !          2547: [m4_ifdef([_m4_set([$1])],
        !          2548:          [m4_set_contains([$1], _m4_defn([_m4_set([$1])]),
        !          2549:                   [m4_pushdef([_m4_set_($1)], _m4_defn([_m4_set([$1])]))],
        !          2550:                   [_m4_popdef([_m4_set([$1],]_m4_defn(
        !          2551:       [_m4_set([$1])])[)])])_m4_popdef([_m4_set([$1])])$0([$1])],
        !          2552:          [_m4_popdef([_m4_set_cleanup($1)])])])
        !          2553: 
        !          2554: m4_define([_m4_set_contents_2],
        !          2555: [m4_ifdef([_m4_set_($1)], [m4_pushdef([_m4_set([$1])],
        !          2556:     _m4_defn([_m4_set_($1)]))$2[]_m4_popdef([_m4_set_($1)])$0([$1], [$3$2])])])
        !          2557: 
        !          2558: # m4_set_delete(SET)
        !          2559: # ------------------
        !          2560: # Delete all elements in SET, and reclaim any memory occupied by the
        !          2561: # set.  This is O(n) in the set size.
        !          2562: #
        !          2563: # Use _m4_defn and _m4_popdef for speed.
        !          2564: m4_define([m4_set_delete],
        !          2565: [m4_ifdef([_m4_set([$1])],
        !          2566:          [_m4_popdef([_m4_set([$1],]_m4_defn([_m4_set([$1])])[)],
        !          2567:                      [_m4_set([$1])])$0([$1])],
        !          2568:          [m4_ifdef([_m4_set_cleanup($1)],
        !          2569:                    [_m4_popdef([_m4_set_cleanup($1)])])m4_ifdef(
        !          2570:                    [_m4_set_size($1)],
        !          2571:                    [_m4_popdef([_m4_set_size($1)])])])])
        !          2572: 
        !          2573: # m4_set_difference(SET1, SET2)
        !          2574: # -----------------------------
        !          2575: # Produce a LIST of quoted elements that occur in SET1 but not SET2.
        !          2576: # Output a comma prior to any elements, to distinguish the empty
        !          2577: # string from no elements.  This can be directly used as a series of
        !          2578: # arguments, such as for m4_join, or wrapped inside quotes for use in
        !          2579: # m4_foreach.  Order of the output is not guaranteed.
        !          2580: #
        !          2581: # Short-circuit the idempotence relation.  Use _m4_defn for speed.
        !          2582: m4_define([m4_set_difference],
        !          2583: [m4_if([$1], [$2], [],
        !          2584:        [m4_set_foreach([$1], [_m4_element],
        !          2585:                       [m4_set_contains([$2], _m4_defn([_m4_element]), [],
        !          2586:                                        [,_m4_defn([_m4_element])])])])])
        !          2587: 
        !          2588: # m4_set_dump(SET, [SEP])
        !          2589: # -----------------------
        !          2590: # Expand to a single string containing all the elements in SET,
        !          2591: # separated by SEP, then delete SET.  In general, if you only need to
        !          2592: # list the contents once, this is faster than m4_set_contents.  No
        !          2593: # provision is made for disambiguating set elements that contain
        !          2594: # non-empty SEP as a sub-string.  Order of the output is not
        !          2595: # guaranteed.  This is O(n) in the size of the set before pruning.
        !          2596: #
        !          2597: # Use _m4_popdef for speed.  Use existence of _m4_set_cleanup($1) to
        !          2598: # decide if more expensive recursion is needed.
        !          2599: m4_define([m4_set_dump],
        !          2600: [m4_ifdef([_m4_set_size($1)],
        !          2601:          [_m4_popdef([_m4_set_size($1)])])m4_ifdef([_m4_set_cleanup($1)],
        !          2602:     [_$0_check], [_$0])([$1], [], [$2])])
        !          2603: 
        !          2604: # _m4_set_dump(SET, SEP, PREP)
        !          2605: # _m4_set_dump_check(SET, SEP, PREP)
        !          2606: # ----------------------------------
        !          2607: # Print SEP and the current element, then delete the element and
        !          2608: # recurse with empty SEP changed to PREP.  The check variant checks
        !          2609: # whether the element has been previously removed.  Use _m4_defn and
        !          2610: # _m4_popdef for speed.
        !          2611: m4_define([_m4_set_dump],
        !          2612: [m4_ifdef([_m4_set([$1])],
        !          2613:          [[$2]_m4_defn([_m4_set([$1])])_m4_popdef([_m4_set([$1],]_m4_defn(
        !          2614:                [_m4_set([$1])])[)], [_m4_set([$1])])$0([$1], [$2$3])])])
        !          2615: 
        !          2616: m4_define([_m4_set_dump_check],
        !          2617: [m4_ifdef([_m4_set([$1])],
        !          2618:          [m4_set_contains([$1], _m4_defn([_m4_set([$1])]),
        !          2619:                           [[$2]_m4_defn([_m4_set([$1])])])_m4_popdef(
        !          2620:     [_m4_set([$1],]_m4_defn([_m4_set([$1])])[)],
        !          2621:     [_m4_set([$1])])$0([$1], [$2$3])],
        !          2622:          [_m4_popdef([_m4_set_cleanup($1)])])])
        !          2623: 
        !          2624: # m4_set_empty(SET, [IF-EMPTY], [IF-ELEMENTS])
        !          2625: # --------------------------------------------
        !          2626: # Expand IF-EMPTY if SET has no elements, otherwise IF-ELEMENTS.
        !          2627: m4_define([m4_set_empty],
        !          2628: [m4_ifdef([_m4_set_size($1)],
        !          2629:          [m4_if(m4_indir([_m4_set_size($1)]), [0], [$2], [$3])], [$2])])
        !          2630: 
        !          2631: # m4_set_foreach(SET, VAR, ACTION)
        !          2632: # --------------------------------
        !          2633: # For each element of SET, define VAR to the element and expand
        !          2634: # ACTION.  ACTION should not recursively list SET's contents, add
        !          2635: # elements to SET, nor delete any element from SET except the one
        !          2636: # currently in VAR.  The order that the elements are visited in is not
        !          2637: # guaranteed.  This is faster than the corresponding m4_foreach([VAR],
        !          2638: #   m4_indir([m4_dquote]m4_set_listc([SET])), [ACTION])
        !          2639: m4_define([m4_set_foreach],
        !          2640: [m4_pushdef([$2])m4_ifdef([_m4_set_cleanup($1)],
        !          2641:     [_m4_set_contents_1c], [_m4_set_contents_1])([$1])_m4_set_contents_2([$1],
        !          2642:        [m4_define([$2], _m4_defn([_m4_set_($1)]))$3[]])m4_popdef([$2])])
        !          2643: 
        !          2644: # m4_set_intersection(SET1, SET2)
        !          2645: # -------------------------------
        !          2646: # Produce a LIST of quoted elements that occur in both SET1 or SET2.
        !          2647: # Output a comma prior to any elements, to distinguish the empty
        !          2648: # string from no elements.  This can be directly used as a series of
        !          2649: # arguments, such as for m4_join, or wrapped inside quotes for use in
        !          2650: # m4_foreach.  Order of the output is not guaranteed.
        !          2651: #
        !          2652: # Iterate over the smaller set, and short-circuit the idempotence
        !          2653: # relation.  Use _m4_defn for speed.
        !          2654: m4_define([m4_set_intersection],
        !          2655: [m4_if([$1], [$2], [m4_set_listc([$1])],
        !          2656:        m4_eval(m4_set_size([$2]) < m4_set_size([$1])), [1], [$0([$2], [$1])],
        !          2657:        [m4_set_foreach([$1], [_m4_element],
        !          2658:                       [m4_set_contains([$2], _m4_defn([_m4_element]),
        !          2659:                                        [,_m4_defn([_m4_element])])])])])
        !          2660: 
        !          2661: # m4_set_list(SET)
        !          2662: # m4_set_listc(SET)
        !          2663: # -----------------
        !          2664: # Produce a LIST of quoted elements of SET.  This can be directly used
        !          2665: # as a series of arguments, such as for m4_join or m4_set_add_all, or
        !          2666: # wrapped inside quotes for use in m4_foreach or m4_map.  With
        !          2667: # m4_set_list, there is no way to distinguish an empty set from a set
        !          2668: # containing only the empty string; with m4_set_listc, a leading comma
        !          2669: # is output if there are any elements.
        !          2670: m4_define([m4_set_list],
        !          2671: [m4_ifdef([_m4_set_cleanup($1)], [_m4_set_contents_1c],
        !          2672:          [_m4_set_contents_1])([$1])_m4_set_contents_2([$1],
        !          2673:               [_m4_defn([_m4_set_($1)])], [,])])
        !          2674: 
        !          2675: m4_define([m4_set_listc],
        !          2676: [m4_ifdef([_m4_set_cleanup($1)], [_m4_set_contents_1c],
        !          2677:          [_m4_set_contents_1])([$1])_m4_set_contents_2([$1],
        !          2678:               [,_m4_defn([_m4_set_($1)])])])
        !          2679: 
        !          2680: # m4_set_remove(SET, VALUE, [IF-PRESENT], [IF-ABSENT])
        !          2681: # ----------------------------------------------------
        !          2682: # If VALUE is an element of SET, delete it and expand IF-PRESENT.
        !          2683: # Otherwise expand IF-ABSENT.  Deleting a single value is O(1),
        !          2684: # although it leaves memory occupied until the next O(n) traversal of
        !          2685: # the set which will compact the set.
        !          2686: #
        !          2687: # Optimize if the element being removed is the most recently added,
        !          2688: # since defining _m4_set_cleanup($1) slows down so many other macros.
        !          2689: # In particular, this plays well with m4_set_foreach.
        !          2690: m4_define([m4_set_remove],
        !          2691: [m4_set_contains([$1], [$2], [_m4_set_size([$1],
        !          2692:     [m4_decr])m4_if(_m4_defn([_m4_set([$1])]), [$2],
        !          2693:                    [_m4_popdef([_m4_set([$1],$2)], [_m4_set([$1])])],
        !          2694:                    [m4_define([_m4_set_cleanup($1)])m4_define(
        !          2695:                      [_m4_set([$1],$2)], [0])])$3], [$4])])
        !          2696: 
        !          2697: # m4_set_size(SET)
        !          2698: # ----------------
        !          2699: # Expand to the number of elements currently in SET.  This operation
        !          2700: # is O(1), and thus more efficient than m4_count(m4_set_list([SET])).
        !          2701: m4_define([m4_set_size],
        !          2702: [m4_ifdef([_m4_set_size($1)], [m4_indir([_m4_set_size($1)])], [0])])
        !          2703: 
        !          2704: # _m4_set_size(SET, ACTION)
        !          2705: # -------------------------
        !          2706: # ACTION must be either m4_incr or m4_decr, and the size of SET is
        !          2707: # changed accordingly.  If the set is empty, ACTION must not be
        !          2708: # m4_decr.
        !          2709: m4_define([_m4_set_size],
        !          2710: [m4_define([_m4_set_size($1)],
        !          2711:           m4_ifdef([_m4_set_size($1)], [$2(m4_indir([_m4_set_size($1)]))],
        !          2712:                    [1]))])
        !          2713: 
        !          2714: # m4_set_union(SET1, SET2)
        !          2715: # ------------------------
        !          2716: # Produce a LIST of double quoted elements that occur in either SET1
        !          2717: # or SET2, without duplicates.  Output a comma prior to any elements,
        !          2718: # to distinguish the empty string from no elements.  This can be
        !          2719: # directly used as a series of arguments, such as for m4_join, or
        !          2720: # wrapped inside quotes for use in m4_foreach.  Order of the output is
        !          2721: # not guaranteed.
        !          2722: #
        !          2723: # We can rely on the fact that m4_set_listc prunes SET1, so we don't
        !          2724: # need to check _m4_set([$1],element) for 0.  Use _m4_defn for speed.
        !          2725: # Short-circuit the idempotence relation.
        !          2726: m4_define([m4_set_union],
        !          2727: [m4_set_listc([$1])m4_if([$1], [$2], [], [m4_set_foreach([$2], [_m4_element],
        !          2728:   [m4_ifdef([_m4_set([$1],]_m4_defn([_m4_element])[)], [],
        !          2729:            [,_m4_defn([_m4_element])])])])])
        !          2730: 
        !          2731: 
        !          2732: ## ------------------- ##
        !          2733: ## 16. File handling.  ##
        !          2734: ## ------------------- ##
        !          2735: 
        !          2736: 
        !          2737: # It is a real pity that M4 comes with no macros to bind a diversion
        !          2738: # to a file.  So we have to deal without, which makes us a lot more
        !          2739: # fragile than we should.
        !          2740: 
        !          2741: 
        !          2742: # m4_file_append(FILE-NAME, CONTENT)
        !          2743: # ----------------------------------
        !          2744: m4_define([m4_file_append],
        !          2745: [m4_syscmd([cat >>$1 <<_m4eof
        !          2746: $2
        !          2747: _m4eof
        !          2748: ])
        !          2749: m4_if(m4_sysval, [0], [],
        !          2750:       [m4_fatal([$0: cannot write: $1])])])
        !          2751: 
        !          2752: 
        !          2753: 
        !          2754: ## ------------------------ ##
        !          2755: ## 17. Setting M4sugar up.  ##
        !          2756: ## ------------------------ ##
        !          2757: 
        !          2758: 
        !          2759: # m4_init
        !          2760: # -------
        !          2761: # Initialize the m4sugar language.
        !          2762: m4_define([m4_init],
        !          2763: [# All the M4sugar macros start with `m4_', except `dnl' kept as is
        !          2764: # for sake of simplicity.
        !          2765: m4_pattern_forbid([^_?m4_])
        !          2766: m4_pattern_forbid([^dnl$])
        !          2767: 
        !          2768: # If __m4_version__ is defined, we assume that we are being run by M4
        !          2769: # 1.6 or newer, and thus that $@ recursion is linear and debugmode(d)
        !          2770: # is available for faster checks of dereferencing undefined macros.
        !          2771: # But if it is missing, we assume we are being run by M4 1.4.x, that
        !          2772: # $@ recursion is quadratic, and that we need foreach-based
        !          2773: # replacement macros.  Use the raw builtin to avoid tripping up
        !          2774: # include tracing.
        !          2775: m4_ifdef([__m4_version__],
        !          2776: [m4_debugmode([+d])
        !          2777: m4_copy([_m4_defn], [m4_defn])
        !          2778: m4_copy([_m4_popdef], [m4_popdef])
        !          2779: m4_copy([_m4_undefine], [m4_undefine])],
        !          2780: [m4_builtin([include], [m4sugar/foreach.m4])])
        !          2781: 
        !          2782: # _m4_divert_diversion should be defined:
        !          2783: m4_divert_push([KILL])
        !          2784: 
        !          2785: # Check the divert push/pop perfect balance.
        !          2786: m4_wrap([m4_divert_pop([])
        !          2787:         m4_ifdef([_m4_divert_diversion],
        !          2788:           [m4_fatal([$0: unbalanced m4_divert_push:]_m4_divert_n_stack)])[]])
        !          2789: ])

E-mail: