Annotation of win32/tools/m4sugar.m4, revision 1.1
1.1 ! paf 1: divert(-1)# -*- Autoconf -*-
! 2: # This file is part of Autoconf.
! 3: # Base M4 layer.
! 4: # Requires GNU M4.
! 5: # Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
! 6: #
! 7: # This program is free software; you can redistribute it and/or modify
! 8: # it under the terms of the GNU General Public License as published by
! 9: # the Free Software Foundation; either version 2, or (at your option)
! 10: # any later version.
! 11: #
! 12: # This program is distributed in the hope that it will be useful,
! 13: # but WITHOUT ANY WARRANTY; without even the implied warranty of
! 14: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 15: # GNU General Public License for more details.
! 16: #
! 17: # You should have received a copy of the GNU General Public License
! 18: # along with this program; if not, write to the Free Software
! 19: # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
! 20: # 02111-1307, USA.
! 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 path 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([from], [to($@)])
! 87: # Well, obviously 1 is more expansive in space. Maybe 2 is more expansive
! 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 will certainly prefer see `from'.
! 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 as 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 as 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 as 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'.
! 119: m4_rename_m4([builtin])
! 120: m4_rename_m4([changecom])
! 121: m4_rename_m4([changequote])
! 122: m4_rename_m4([debugfile])
! 123: m4_rename_m4([debugmode])
! 124: m4_rename_m4([decr])
! 125: m4_undefine([divert])
! 126: m4_rename_m4([divnum])
! 127: m4_rename_m4([dumpdef])
! 128: m4_rename_m4([errprint])
! 129: m4_rename_m4([esyscmd])
! 130: m4_rename_m4([eval])
! 131: m4_rename_m4([format])
! 132: m4_rename_m4([ifdef])
! 133: m4_rename([ifelse], [m4_if])
! 134: m4_rename_m4([include])
! 135: m4_rename_m4([incr])
! 136: m4_rename_m4([index])
! 137: m4_rename_m4([indir])
! 138: m4_rename_m4([len])
! 139: m4_rename([m4exit], [m4_exit])
! 140: m4_rename([m4wrap], [m4_wrap])
! 141: m4_rename_m4([maketemp])
! 142: m4_rename([patsubst], [m4_bpatsubst])
! 143: m4_undefine([popdef])
! 144: m4_rename_m4([pushdef])
! 145: m4_rename([regexp], [m4_bregexp])
! 146: m4_rename_m4([shift])
! 147: m4_rename_m4([sinclude])
! 148: m4_rename_m4([substr])
! 149: m4_rename_m4([symbols])
! 150: m4_rename_m4([syscmd])
! 151: m4_rename_m4([sysval])
! 152: m4_rename_m4([traceoff])
! 153: m4_rename_m4([traceon])
! 154: m4_rename_m4([translit])
! 155: m4_undefine([undivert])
! 156:
! 157:
! 158: ## ------------------- ##
! 159: ## 2. Error messages. ##
! 160: ## ------------------- ##
! 161:
! 162:
! 163: # m4_location
! 164: # -----------
! 165: m4_define([m4_location],
! 166: [__file__:__line__])
! 167:
! 168:
! 169: # m4_errprintn(MSG)
! 170: # -----------------
! 171: # Same as `errprint', but with the missing end of line.
! 172: m4_define([m4_errprintn],
! 173: [m4_errprint([$1
! 174: ])])
! 175:
! 176:
! 177: # m4_warning(MSG)
! 178: # ---------------
! 179: # Warn the user.
! 180: m4_define([m4_warning],
! 181: [m4_errprintn(m4_location[: warning: $1])])
! 182:
! 183:
! 184: # m4_fatal(MSG, [EXIT-STATUS])
! 185: # ----------------------------
! 186: # Fatal the user. :)
! 187: m4_define([m4_fatal],
! 188: [m4_errprintn(m4_location[: error: $1])dnl
! 189: m4_expansion_stack_dump()dnl
! 190: m4_exit(m4_if([$2],, 1, [$2]))])
! 191:
! 192:
! 193: # m4_assert(EXPRESSION, [EXIT-STATUS = 1])
! 194: # ----------------------------------------
! 195: # This macro ensures that EXPRESSION evaluates to true, and exits if
! 196: # EXPRESSION evaluates to false.
! 197: m4_define([m4_assert],
! 198: [m4_if(m4_eval([$1]), 0,
! 199: [m4_fatal([assert failed: $1], [$2])])])
! 200:
! 201:
! 202: ## ------------- ##
! 203: ## 3. Warnings. ##
! 204: ## ------------- ##
! 205:
! 206:
! 207: # m4_warning_ifelse(CATEGORY, IF-TRUE, IF-FALSE)
! 208: # ----------------------------------------------
! 209: # If the CATEGORY of warnings is enabled, expand IF_TRUE otherwise
! 210: # IF-FALSE.
! 211: #
! 212: # The variable `m4_warnings' contains a comma separated list of
! 213: # warnings which order is the converse from the one specified by
! 214: # the user, i.e., if she specified `-W error,none,obsolete',
! 215: # `m4_warnings' is `obsolete,none,error'. We read it from left to
! 216: # right, and:
! 217: # - if none or noCATEGORY is met, run IF-FALSE
! 218: # - if all or CATEGORY is met, run IF-TRUE
! 219: # - if there is nothing left, run IF-FALSE.
! 220: m4_define([m4_warning_ifelse],
! 221: [_m4_warning_ifelse([$1], [$2], [$3], m4_warnings)])
! 222:
! 223:
! 224: # _m4_warning_ifelse(CATEGORY, IF-TRUE, IF-FALSE, WARNING1, ...)
! 225: # --------------------------------------------------------------
! 226: # Implementation of the loop described above.
! 227: m4_define([_m4_warning_ifelse],
! 228: [m4_case([$4],
! 229: [$1], [$2],
! 230: [all], [$2],
! 231: [], [$3],
! 232: [none], [$3],
! 233: [no-$1], [$3],
! 234: [$0([$1], [$2], [$3], m4_shiftn(4, $@))])])
! 235:
! 236:
! 237: # _m4_warning_error_ifelse(IF-TRUE, IF-FALSE)
! 238: # -------------------------------------------
! 239: # The same as m4_warning_ifelse, but scan for `error' only.
! 240: m4_define([_m4_warning_error_ifelse],
! 241: [__m4_warning_error_ifelse([$1], [$2], m4_warnings)])
! 242:
! 243:
! 244: # __m4_warning_error_ifelse(IF-TRUE, IF-FALSE)
! 245: # --------------------------------------------
! 246: # The same as _m4_warning_ifelse, but scan for `error' only.
! 247: m4_define([__m4_warning_error_ifelse],
! 248: [m4_case([$3],
! 249: [error], [$1],
! 250: [], [$2],
! 251: [no-error], [$2],
! 252: [$0([$1], [$2], m4_shiftn(3, $@))])])
! 253:
! 254:
! 255:
! 256: # _m4_warn(MESSAGE)
! 257: # -----------------
! 258: # Report MESSAGE as a warning, unless the user requested -W error,
! 259: # in which case report a fatal error.
! 260: m4_define([_m4_warn],
! 261: [_m4_warning_error_ifelse([m4_fatal([$1])],
! 262: [m4_warning([$1])])])
! 263:
! 264:
! 265: # m4_warn(CATEGORY, MESSAGE)
! 266: # --------------------------
! 267: # Report a MESSAGE to the autoconf user if the CATEGORY of warnings
! 268: # is requested (in fact, not disabled).
! 269: m4_define([m4_warn],
! 270: [m4_warning_ifelse([$1], [_m4_warn([$2])])])
! 271:
! 272:
! 273:
! 274:
! 275: ## ------------------- ##
! 276: ## 4. File inclusion. ##
! 277: ## ------------------- ##
! 278:
! 279:
! 280: # We also want to neutralize include (and sinclude for symmetry),
! 281: # but we want to extend them slightly: warn when a file is included
! 282: # several times. This is in general a dangerous operation because
! 283: # quite nobody quotes the first argument of m4_define.
! 284: #
! 285: # For instance in the following case:
! 286: # m4_define(foo, [bar])
! 287: # then a second reading will turn into
! 288: # m4_define(bar, [bar])
! 289: # which is certainly not what was meant.
! 290:
! 291: # m4_include_unique(FILE)
! 292: # -----------------------
! 293: # Declare that the FILE was loading; and warn if it has already
! 294: # been included.
! 295: m4_define([m4_include_unique],
! 296: [m4_ifdef([m4_include($1)],
! 297: [m4_warn([syntax], [file `$1' included several times])])dnl
! 298: m4_define([m4_include($1)])])
! 299:
! 300:
! 301: # m4_include(FILE)
! 302: # ----------------
! 303: # As the builtin include, but warns against multiple inclusions.
! 304: m4_define([m4_include],
! 305: [m4_include_unique([$1])dnl
! 306: m4_builtin([include], [$1])])
! 307:
! 308:
! 309: # m4_sinclude(FILE)
! 310: # -----------------
! 311: # As the builtin sinclude, but warns against multiple inclusions.
! 312: m4_define([m4_sinclude],
! 313: [m4_include_unique([$1])dnl
! 314: m4_builtin([sinclude], [$1])])
! 315:
! 316:
! 317:
! 318: ## ------------------------------------ ##
! 319: ## 5. Additional branching constructs. ##
! 320: ## ------------------------------------ ##
! 321:
! 322: # Both `m4_ifval' and `m4_ifset' tests against the empty string. The
! 323: # difference is that `m4_ifset' is specialized on macros.
! 324: #
! 325: # In case of arguments of macros, eg $[1], it makes little difference.
! 326: # In the case of a macro `FOO', you don't want to check `m4_ifval(FOO,
! 327: # TRUE)', because if `FOO' expands with commas, there is a shifting of
! 328: # the arguments. So you want to run `m4_ifval([FOO])', but then you just
! 329: # compare the *string* `FOO' against `', which, of course fails.
! 330: #
! 331: # So you want a variation of `m4_ifset' that expects a macro name as $[1].
! 332: # If this macro is both defined and defined to a non empty value, then
! 333: # it runs TRUE etc.
! 334:
! 335:
! 336: # m4_ifval(COND, [IF-TRUE], [IF-FALSE])
! 337: # -------------------------------------
! 338: # If COND is not the empty string, expand IF-TRUE, otherwise IF-FALSE.
! 339: # Comparable to m4_ifdef.
! 340: m4_define([m4_ifval],
! 341: [m4_if([$1], [], [$3], [$2])])
! 342:
! 343:
! 344: # m4_n(TEXT)
! 345: # ----------
! 346: # If TEXT is not empty, return TEXT and a new line, otherwise nothing.
! 347: m4_define([m4_n],
! 348: [m4_if([$1],
! 349: [], [],
! 350: [$1
! 351: ])])
! 352:
! 353:
! 354: # m4_ifvaln(COND, [IF-TRUE], [IF-FALSE])
! 355: # --------------------------------------
! 356: # Same as `m4_ifval', but add an extra newline to IF-TRUE or IF-FALSE
! 357: # unless that argument is empty.
! 358: m4_define([m4_ifvaln],
! 359: [m4_if([$1],
! 360: [], [m4_n([$3])],
! 361: [m4_n([$2])])])
! 362:
! 363:
! 364: # m4_ifset(MACRO, [IF-TRUE], [IF-FALSE])
! 365: # --------------------------------------
! 366: # If MACRO has no definition, or of its definition is the empty string,
! 367: # expand IF-FALSE, otherwise IF-TRUE.
! 368: m4_define([m4_ifset],
! 369: [m4_ifdef([$1],
! 370: [m4_if(m4_defn([$1]), [], [$3], [$2])],
! 371: [$3])])
! 372:
! 373:
! 374: # m4_ifndef(NAME, [IF-NOT-DEFINED], [IF-DEFINED])
! 375: # -----------------------------------------------
! 376: m4_define([m4_ifndef],
! 377: [m4_ifdef([$1], [$3], [$2])])
! 378:
! 379:
! 380: # m4_case(SWITCH, VAL1, IF-VAL1, VAL2, IF-VAL2, ..., DEFAULT)
! 381: # -----------------------------------------------------------
! 382: # m4 equivalent of
! 383: # switch (SWITCH)
! 384: # {
! 385: # case VAL1:
! 386: # IF-VAL1;
! 387: # break;
! 388: # case VAL2:
! 389: # IF-VAL2;
! 390: # break;
! 391: # ...
! 392: # default:
! 393: # DEFAULT;
! 394: # break;
! 395: # }.
! 396: # All the values are optional, and the macro is robust to active
! 397: # symbols properly quoted.
! 398: m4_define([m4_case],
! 399: [m4_if([$#], 0, [],
! 400: [$#], 1, [],
! 401: [$#], 2, [$2],
! 402: [$1], [$2], [$3],
! 403: [$0([$1], m4_shiftn(3, $@))])])
! 404:
! 405:
! 406: # m4_bmatch(SWITCH, RE1, VAL1, RE2, VAL2, ..., DEFAULT)
! 407: # -----------------------------------------------------
! 408: # m4 equivalent of
! 409: #
! 410: # if (SWITCH =~ RE1)
! 411: # VAL1;
! 412: # elif (SWITCH =~ RE2)
! 413: # VAL2;
! 414: # elif ...
! 415: # ...
! 416: # else
! 417: # DEFAULT
! 418: #
! 419: # All the values are optional, and the macro is robust to active symbols
! 420: # properly quoted.
! 421: m4_define([m4_bmatch],
! 422: [m4_if([$#], 0, [],
! 423: [$#], 1, [],
! 424: [$#], 2, [$2],
! 425: [m4_if(m4_bregexp([$1], [$2]), -1, [$0([$1], m4_shiftn(3, $@))],
! 426: [$3])])])
! 427:
! 428:
! 429: # m4_map(MACRO, LIST)
! 430: # -------------------
! 431: # Invoke MACRO($1), MACRO($2) etc. where $1, $2... are the elements
! 432: # of LIST (which can be lists themselves, for multiple arguments MACROs).
! 433: m4_define([m4_fst], [$1])
! 434: m4_define([m4_map],
! 435: [m4_if([$2], [], [],
! 436: [$2], [[]], [],
! 437: [$1(m4_fst($2))[]dnl
! 438: m4_map([$1], m4_cdr($2))])])
! 439:
! 440:
! 441: # m4_map_sep(MACRO, SEPARATOR, LIST)
! 442: # ----------------------------------
! 443: # Invoke MACRO($1), SEPARATOR, MACRO($2), ..., MACRO($N) where $1, $2... $N
! 444: # are the elements of LIST (which can be lists themselves, for multiple
! 445: # arguments MACROs).
! 446: m4_define([m4_map_sep],
! 447: [m4_if([$3], [[]], [],
! 448: [$1(m4_fst($3))[]dnl
! 449: m4_if(m4_cdr($3),
! 450: [[]], [],
! 451: [$2])[]dnl
! 452: m4_map_sep([$1], [$2], m4_cdr($3))])])
! 453:
! 454:
! 455: ## ---------------------------------------- ##
! 456: ## 6. Enhanced version of some primitives. ##
! 457: ## ---------------------------------------- ##
! 458:
! 459: # m4_patsubsts(STRING, RE1, SUBST1, RE2, SUBST2, ...)
! 460: # ---------------------------------------------------
! 461: # m4 equivalent of
! 462: #
! 463: # $_ = STRING;
! 464: # s/RE1/SUBST1/g;
! 465: # s/RE2/SUBST2/g;
! 466: # ...
! 467: #
! 468: # All the values are optional, and the macro is robust to active symbols
! 469: # properly quoted.
! 470: #
! 471: # I would have liked to name this macro `m4_patsubst', unfortunately,
! 472: # due to quotation problems, I need to double quote $1 below, therefore
! 473: # the anchors are broken :( I can't let users be trapped by that.
! 474: m4_define([m4_bpatsubsts],
! 475: [m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])],
! 476: [$#], 1, [m4_fatal([$0: too few arguments: $#: $1])],
! 477: [$#], 2, [m4_builtin([patsubst], $@)],
! 478: [$0(m4_builtin([patsubst], [[$1]], [$2], [$3]),
! 479: m4_shiftn(3, $@))])])
! 480:
! 481:
! 482:
! 483: # m4_do(STRING, ...)
! 484: # ------------------
! 485: # This macro invokes all its arguments (in sequence, of course). It is
! 486: # useful for making your macros more structured and readable by dropping
! 487: # unnecessary dnl's and have the macros indented properly.
! 488: m4_define([m4_do],
! 489: [m4_if($#, 0, [],
! 490: $#, 1, [$1],
! 491: [$1[]m4_do(m4_shift($@))])])
! 492:
! 493:
! 494: # m4_define_default(MACRO, VALUE)
! 495: # -------------------------------
! 496: # If MACRO is undefined, set it to VALUE.
! 497: m4_define([m4_define_default],
! 498: [m4_ifndef([$1], [m4_define($@)])])
! 499:
! 500:
! 501: # m4_default(EXP1, EXP2)
! 502: # ----------------------
! 503: # Returns EXP1 if non empty, otherwise EXP2.
! 504: m4_define([m4_default],
! 505: [m4_ifval([$1], [$1], [$2])])
! 506:
! 507:
! 508: # m4_defn(NAME)
! 509: # -------------
! 510: # Unlike to the original, don't tolerate popping something which is
! 511: # undefined.
! 512: m4_define([m4_defn],
! 513: [m4_ifndef([$1],
! 514: [m4_fatal([$0: undefined macro: $1])])dnl
! 515: m4_builtin([defn], $@)])
! 516:
! 517:
! 518: # _m4_dumpdefs_up(NAME)
! 519: # ---------------------
! 520: m4_define([_m4_dumpdefs_up],
! 521: [m4_ifdef([$1],
! 522: [m4_pushdef([_m4_dumpdefs], m4_defn([$1]))dnl
! 523: m4_dumpdef([$1])dnl
! 524: m4_popdef([$1])dnl
! 525: _m4_dumpdefs_up([$1])])])
! 526:
! 527:
! 528: # _m4_dumpdefs_down(NAME)
! 529: # -----------------------
! 530: m4_define([_m4_dumpdefs_down],
! 531: [m4_ifdef([_m4_dumpdefs],
! 532: [m4_pushdef([$1], m4_defn([_m4_dumpdefs]))dnl
! 533: m4_popdef([_m4_dumpdefs])dnl
! 534: _m4_dumpdefs_down([$1])])])
! 535:
! 536:
! 537: # m4_dumpdefs(NAME)
! 538: # -----------------
! 539: # Similar to `m4_dumpdef(NAME)', but if NAME was m4_pushdef'ed, display its
! 540: # value stack (most recent displayed first).
! 541: m4_define([m4_dumpdefs],
! 542: [_m4_dumpdefs_up([$1])dnl
! 543: _m4_dumpdefs_down([$1])])
! 544:
! 545:
! 546: # m4_popdef(NAME)
! 547: # ---------------
! 548: # Unlike to the original, don't tolerate popping something which is
! 549: # undefined.
! 550: m4_define([m4_popdef],
! 551: [m4_ifndef([$1],
! 552: [m4_fatal([$0: undefined macro: $1])])dnl
! 553: m4_builtin([popdef], $@)])
! 554:
! 555:
! 556: # m4_quote(ARGS)
! 557: # --------------
! 558: # Return ARGS as a single arguments.
! 559: #
! 560: # It is important to realize the difference between `m4_quote(exp)' and
! 561: # `[exp]': in the first case you obtain the quoted *result* of the
! 562: # expansion of EXP, while in the latter you just obtain the string
! 563: # `exp'.
! 564: m4_define([m4_quote], [[$*]])
! 565: m4_define([m4_dquote], [[$@]])
! 566:
! 567:
! 568: # m4_noquote(STRING)
! 569: # ------------------
! 570: # Return the result of ignoring all quotes in STRING and invoking the
! 571: # macros it contains. Amongst other things useful for enabling macro
! 572: # invocations inside strings with [] blocks (for instance regexps and
! 573: # help-strings).
! 574: m4_define([m4_noquote],
! 575: [m4_changequote(-=<{,}>=-)$1-=<{}>=-m4_changequote([,])])
! 576:
! 577:
! 578: # m4_shiftn(N, ...)
! 579: # -----------------
! 580: # Returns ... shifted N times. Useful for recursive "varargs" constructs.
! 581: m4_define([m4_shiftn],
! 582: [m4_assert(($1 >= 0) && ($# > $1))dnl
! 583: _m4_shiftn($@)])
! 584:
! 585: m4_define([_m4_shiftn],
! 586: [m4_if([$1], 0,
! 587: [m4_shift($@)],
! 588: [_m4_shiftn(m4_eval([$1]-1), m4_shift(m4_shift($@)))])])
! 589:
! 590:
! 591: # m4_undefine(NAME)
! 592: # -----------------
! 593: # Unlike to the original, don't tolerate undefining something which is
! 594: # undefined.
! 595: m4_define([m4_undefine],
! 596: [m4_ifndef([$1],
! 597: [m4_fatal([$0: undefined macro: $1])])dnl
! 598: m4_builtin([undefine], $@)])
! 599:
! 600:
! 601: ## -------------------------- ##
! 602: ## 7. Implementing m4 loops. ##
! 603: ## -------------------------- ##
! 604:
! 605:
! 606: # m4_for(VARIABLE, FIRST, LAST, [STEP = +/-1], EXPRESSION)
! 607: # --------------------------------------------------------
! 608: # Expand EXPRESSION defining VARIABLE to FROM, FROM + 1, ..., TO.
! 609: # Both limits are included, and bounds are checked for consistency.
! 610: m4_define([m4_for],
! 611: [m4_case(m4_sign(m4_eval($3 - $2)),
! 612: 1, [m4_assert(m4_sign(m4_default($4, 1)) == 1)],
! 613: -1, [m4_assert(m4_sign(m4_default($4, -1)) == -1)])dnl
! 614: m4_pushdef([$1], [$2])dnl
! 615: m4_if(m4_eval([$3 > $2]), 1,
! 616: [_m4_for([$1], [$3], m4_default([$4], 1), [$5])],
! 617: [_m4_for([$1], [$3], m4_default([$4], -1), [$5])])dnl
! 618: m4_popdef([$1])])
! 619:
! 620:
! 621: # _m4_for(VARIABLE, FIRST, LAST, STEP, EXPRESSION)
! 622: # ------------------------------------------------
! 623: # Core of the loop, no consistency checks.
! 624: m4_define([_m4_for],
! 625: [$4[]dnl
! 626: m4_if($1, [$2], [],
! 627: [m4_define([$1], m4_eval($1+[$3]))_m4_for([$1], [$2], [$3], [$4])])])
! 628:
! 629:
! 630: # Implementing `foreach' loops in m4 is much more tricky than it may
! 631: # seem. Actually, the example of a `foreach' loop in the m4
! 632: # documentation is wrong: it does not quote the arguments properly,
! 633: # which leads to undesirable expansions.
! 634: #
! 635: # The example in the documentation is:
! 636: #
! 637: # | # foreach(VAR, (LIST), STMT)
! 638: # | m4_define([foreach],
! 639: # | [m4_pushdef([$1])_foreach([$1], [$2], [$3])m4_popdef([$1])])
! 640: # | m4_define([_arg1], [$1])
! 641: # | m4_define([_foreach],
! 642: # | [m4_if([$2], [()], ,
! 643: # | [m4_define([$1], _arg1$2)$3[]_foreach([$1],
! 644: # | (shift$2),
! 645: # | [$3])])])
! 646: #
! 647: # But then if you run
! 648: #
! 649: # | m4_define(a, 1)
! 650: # | m4_define(b, 2)
! 651: # | m4_define(c, 3)
! 652: # | foreach([f], [([a], [(b], [c)])], [echo f
! 653: # | ])
! 654: #
! 655: # it gives
! 656: #
! 657: # => echo 1
! 658: # => echo (2,3)
! 659: #
! 660: # which is not what is expected.
! 661: #
! 662: # Of course the problem is that many quotes are missing. So you add
! 663: # plenty of quotes at random places, until you reach the expected
! 664: # result. Alternatively, if you are a quoting wizard, you directly
! 665: # reach the following implementation (but if you really did, then
! 666: # apply to the maintenance of m4sugar!).
! 667: #
! 668: # | # foreach(VAR, (LIST), STMT)
! 669: # | m4_define([foreach], [m4_pushdef([$1])_foreach($@)m4_popdef([$1])])
! 670: # | m4_define([_arg1], [[$1]])
! 671: # | m4_define([_foreach],
! 672: # | [m4_if($2, [()], ,
! 673: # | [m4_define([$1], [_arg1$2])$3[]_foreach([$1],
! 674: # | [(shift$2)],
! 675: # | [$3])])])
! 676: #
! 677: # which this time answers
! 678: #
! 679: # => echo a
! 680: # => echo (b
! 681: # => echo c)
! 682: #
! 683: # Bingo!
! 684: #
! 685: # Well, not quite.
! 686: #
! 687: # With a better look, you realize that the parens are more a pain than
! 688: # a help: since anyway you need to quote properly the list, you end up
! 689: # with always using an outermost pair of parens and an outermost pair
! 690: # of quotes. Rejecting the parens both eases the implementation, and
! 691: # simplifies the use:
! 692: #
! 693: # | # foreach(VAR, (LIST), STMT)
! 694: # | m4_define([foreach], [m4_pushdef([$1])_foreach($@)m4_popdef([$1])])
! 695: # | m4_define([_arg1], [$1])
! 696: # | m4_define([_foreach],
! 697: # | [m4_if($2, [], ,
! 698: # | [m4_define([$1], [_arg1($2)])$3[]_foreach([$1],
! 699: # | [shift($2)],
! 700: # | [$3])])])
! 701: #
! 702: #
! 703: # Now, just replace the `$2' with `m4_quote($2)' in the outer `m4_if'
! 704: # to improve robustness, and you come up with a quite satisfactory
! 705: # implementation.
! 706:
! 707:
! 708: # m4_foreach(VARIABLE, LIST, EXPRESSION)
! 709: # --------------------------------------
! 710: #
! 711: # Expand EXPRESSION assigning each value of the LIST to VARIABLE.
! 712: # LIST should have the form `item_1, item_2, ..., item_n', i.e. the
! 713: # whole list must *quoted*. Quote members too if you don't want them
! 714: # to be expanded.
! 715: #
! 716: # This macro is robust to active symbols:
! 717: # | m4_define(active, [ACT, IVE])
! 718: # | m4_foreach(Var, [active, active], [-Var-])
! 719: # => -ACT--IVE--ACT--IVE-
! 720: #
! 721: # | m4_foreach(Var, [[active], [active]], [-Var-])
! 722: # => -ACT, IVE--ACT, IVE-
! 723: #
! 724: # | m4_foreach(Var, [[[active]], [[active]]], [-Var-])
! 725: # => -active--active-
! 726: m4_define([m4_foreach],
! 727: [m4_pushdef([$1])_m4_foreach($@)m4_popdef([$1])])
! 728:
! 729: # Low level macros used to define m4_foreach.
! 730: m4_define([m4_car], [[$1]])
! 731: m4_define([m4_cdr], [m4_dquote(m4_shift($@))])
! 732: m4_define([_m4_foreach],
! 733: [m4_if([$2], [[]], [],
! 734: [m4_define([$1], m4_car($2))$3[]_m4_foreach([$1],
! 735: m4_cdr($2),
! 736: [$3])])])
! 737:
! 738:
! 739:
! 740: ## --------------------------- ##
! 741: ## 8. More diversion support. ##
! 742: ## --------------------------- ##
! 743:
! 744:
! 745: # _m4_divert(DIVERSION-NAME or NUMBER)
! 746: # ------------------------------------
! 747: # If DIVERSION-NAME is the name of a diversion, return its number,
! 748: # otherwise if is a NUMBER return it.
! 749: m4_define([_m4_divert],
! 750: [m4_ifdef([_m4_divert($1)],
! 751: [m4_indir([_m4_divert($1)])],
! 752: [$1])])
! 753:
! 754: # KILL is only used to suppress output.
! 755: m4_define([_m4_divert(KILL)], -1)
! 756:
! 757:
! 758: # m4_divert(DIVERSION-NAME)
! 759: # -------------------------
! 760: # Change the diversion stream to DIVERSION-NAME.
! 761: m4_define([m4_divert],
! 762: [m4_define([m4_divert_stack],
! 763: m4_location[: $0: $1]m4_ifdef([m4_divert_stack], [
! 764: m4_defn([m4_divert_stack])]))dnl
! 765: m4_builtin([divert], _m4_divert([$1]))dnl
! 766: ])
! 767:
! 768:
! 769: # m4_divert_push(DIVERSION-NAME)
! 770: # ------------------------------
! 771: # Change the diversion stream to DIVERSION-NAME, while stacking old values.
! 772: m4_define([m4_divert_push],
! 773: [m4_pushdef([m4_divert_stack],
! 774: m4_location[: $0: $1]m4_ifdef([m4_divert_stack], [
! 775: m4_defn([m4_divert_stack])]))dnl
! 776: m4_pushdef([_m4_divert_diversion], [$1])dnl
! 777: m4_builtin([divert], _m4_divert(_m4_divert_diversion))dnl
! 778: ])
! 779:
! 780:
! 781: # m4_divert_pop([DIVERSION-NAME])
! 782: # -------------------------------
! 783: # Change the diversion stream to its previous value, unstacking it.
! 784: # If specified, verify we left DIVERSION-NAME.
! 785: m4_define([m4_divert_pop],
! 786: [m4_ifval([$1],
! 787: [m4_if(_m4_divert([$1]), m4_divnum, [],
! 788: [m4_fatal([$0($1): diversion mismatch: ]
! 789: m4_defn([m4_divert_stack]))])])dnl
! 790: m4_popdef([_m4_divert_diversion])dnl
! 791: dnl m4_ifndef([_m4_divert_diversion],
! 792: dnl [m4_fatal([too many m4_divert_pop])])dnl
! 793: m4_builtin([divert],
! 794: m4_ifdef([_m4_divert_diversion],
! 795: [_m4_divert(_m4_divert_diversion)], -1))dnl
! 796: m4_popdef([m4_divert_stack])dnl
! 797: ])
! 798:
! 799:
! 800: # m4_divert_text(DIVERSION-NAME, CONTENT)
! 801: # ---------------------------------------
! 802: # Output CONTENT into DIVERSION-NAME (which may be a number actually).
! 803: # An end of line is appended for free to CONTENT.
! 804: m4_define([m4_divert_text],
! 805: [m4_divert_push([$1])dnl
! 806: $2
! 807: m4_divert_pop([$1])dnl
! 808: ])
! 809:
! 810:
! 811: # m4_divert_once(DIVERSION-NAME, CONTENT)
! 812: # ---------------------------------------
! 813: # Output once CONTENT into DIVERSION-NAME (which may be a number
! 814: # actually). An end of line is appended for free to CONTENT.
! 815: m4_define([m4_divert_once],
! 816: [m4_expand_once([m4_divert_text([$1], [$2])])])
! 817:
! 818:
! 819: # m4_undivert(DIVERSION-NAME)
! 820: # ---------------------------
! 821: # Undivert DIVERSION-NAME.
! 822: m4_define([m4_undivert],
! 823: [m4_builtin([undivert], _m4_divert([$1]))])
! 824:
! 825:
! 826: ## -------------------------------------------- ##
! 827: ## 8. Defining macros with bells and whistles. ##
! 828: ## -------------------------------------------- ##
! 829:
! 830: # `m4_defun' is basically `m4_define' but it equips the macro with the
! 831: # needed machinery for `m4_require'. A macro must be m4_defun'd if
! 832: # either it is m4_require'd, or it m4_require's.
! 833: #
! 834: # Two things deserve attention and are detailed below:
! 835: # 1. Implementation of m4_require
! 836: # 2. Keeping track of the expansion stack
! 837: #
! 838: # 1. Implementation of m4_require
! 839: # ===============================
! 840: #
! 841: # Of course m4_defun AC_PROVIDE's the macro, so that a macro which has
! 842: # been expanded is not expanded again when m4_require'd, but the
! 843: # difficult part is the proper expansion of macros when they are
! 844: # m4_require'd.
! 845: #
! 846: # The implementation is based on two ideas, (i) using diversions to
! 847: # prepare the expansion of the macro and its dependencies (by Franc,ois
! 848: # Pinard), and (ii) expand the most recently m4_require'd macros _after_
! 849: # the previous macros (by Axel Thimm).
! 850: #
! 851: #
! 852: # The first idea: why using diversions?
! 853: # -------------------------------------
! 854: #
! 855: # When a macro requires another, the other macro is expanded in new
! 856: # diversion, GROW. When the outer macro is fully expanded, we first
! 857: # undivert the most nested diversions (GROW - 1...), and finally
! 858: # undivert GROW. To understand why we need several diversions,
! 859: # consider the following example:
! 860: #
! 861: # | m4_defun([TEST1], [Test...REQUIRE([TEST2])1])
! 862: # | m4_defun([TEST2], [Test...REQUIRE([TEST3])2])
! 863: # | m4_defun([TEST3], [Test...3])
! 864: #
! 865: # Because m4_require is not required to be first in the outer macros, we
! 866: # must keep the expansions of the various level of m4_require separated.
! 867: # Right before executing the epilogue of TEST1, we have:
! 868: #
! 869: # GROW - 2: Test...3
! 870: # GROW - 1: Test...2
! 871: # GROW: Test...1
! 872: # BODY:
! 873: #
! 874: # Finally the epilogue of TEST1 undiverts GROW - 2, GROW - 1, and
! 875: # GROW into the regular flow, BODY.
! 876: #
! 877: # GROW - 2:
! 878: # GROW - 1:
! 879: # GROW:
! 880: # BODY: Test...3; Test...2; Test...1
! 881: #
! 882: # (The semicolons are here for clarification, but of course are not
! 883: # emitted.) This is what Autoconf 2.0 (I think) to 2.13 (I'm sure)
! 884: # implement.
! 885: #
! 886: #
! 887: # The second idea: first required first out
! 888: # -----------------------------------------
! 889: #
! 890: # The natural implementation of the idea above is buggy and produces
! 891: # very surprising results in some situations. Let's consider the
! 892: # following example to explain the bug:
! 893: #
! 894: # | m4_defun([TEST1], [REQUIRE([TEST2a])REQUIRE([TEST2b])])
! 895: # | m4_defun([TEST2a], [])
! 896: # | m4_defun([TEST2b], [REQUIRE([TEST3])])
! 897: # | m4_defun([TEST3], [REQUIRE([TEST2a])])
! 898: # |
! 899: # | AC_INIT
! 900: # | TEST1
! 901: #
! 902: # The dependencies between the macros are:
! 903: #
! 904: # 3 --- 2b
! 905: # / \ is m4_require'd by
! 906: # / \ left -------------------- right
! 907: # 2a ------------ 1
! 908: #
! 909: # If you strictly apply the rules given in the previous section you get:
! 910: #
! 911: # GROW - 2: TEST3
! 912: # GROW - 1: TEST2a; TEST2b
! 913: # GROW: TEST1
! 914: # BODY:
! 915: #
! 916: # (TEST2a, although required by TEST3 is not expanded in GROW - 3
! 917: # because is has already been expanded before in GROW - 1, so it has
! 918: # been AC_PROVIDE'd, so it is not expanded again) so when you undivert
! 919: # the stack of diversions, you get:
! 920: #
! 921: # GROW - 2:
! 922: # GROW - 1:
! 923: # GROW:
! 924: # BODY: TEST3; TEST2a; TEST2b; TEST1
! 925: #
! 926: # i.e., TEST2a is expanded after TEST3 although the latter required the
! 927: # former.
! 928: #
! 929: # Starting from 2.50, uses an implementation provided by Axel Thimm.
! 930: # The idea is simple: the order in which macros are emitted must be the
! 931: # same as the one in which macro are expanded. (The bug above can
! 932: # indeed be described as: a macro has been AC_PROVIDE'd, but it is
! 933: # emitted after: the lack of correlation between emission and expansion
! 934: # order is guilty).
! 935: #
! 936: # How to do that? You keeping the stack of diversions to elaborate the
! 937: # macros, but each time a macro is fully expanded, emit it immediately.
! 938: #
! 939: # In the example above, when TEST2a is expanded, but it's epilogue is
! 940: # not run yet, you have:
! 941: #
! 942: # GROW - 2:
! 943: # GROW - 1: TEST2a
! 944: # GROW: Elaboration of TEST1
! 945: # BODY:
! 946: #
! 947: # The epilogue of TEST2a emits it immediately:
! 948: #
! 949: # GROW - 2:
! 950: # GROW - 1:
! 951: # GROW: Elaboration of TEST1
! 952: # BODY: TEST2a
! 953: #
! 954: # TEST2b then requires TEST3, so right before the epilogue of TEST3, you
! 955: # have:
! 956: #
! 957: # GROW - 2: TEST3
! 958: # GROW - 1: Elaboration of TEST2b
! 959: # GROW: Elaboration of TEST1
! 960: # BODY: TEST2a
! 961: #
! 962: # The epilogue of TEST3 emits it:
! 963: #
! 964: # GROW - 2:
! 965: # GROW - 1: Elaboration of TEST2b
! 966: # GROW: Elaboration of TEST1
! 967: # BODY: TEST2a; TEST3
! 968: #
! 969: # TEST2b is now completely expanded, and emitted:
! 970: #
! 971: # GROW - 2:
! 972: # GROW - 1:
! 973: # GROW: Elaboration of TEST1
! 974: # BODY: TEST2a; TEST3; TEST2b
! 975: #
! 976: # and finally, TEST1 is finished and emitted:
! 977: #
! 978: # GROW - 2:
! 979: # GROW - 1:
! 980: # GROW:
! 981: # BODY: TEST2a; TEST3; TEST2b: TEST1
! 982: #
! 983: # The idea, is simple, but the implementation is a bit evolved. If you
! 984: # are like me, you will want to see the actual functioning of this
! 985: # implementation to be convinced. The next section gives the full
! 986: # details.
! 987: #
! 988: #
! 989: # The Axel Thimm implementation at work
! 990: # -------------------------------------
! 991: #
! 992: # We consider the macros above, and this configure.ac:
! 993: #
! 994: # AC_INIT
! 995: # TEST1
! 996: #
! 997: # You should keep the definitions of _m4_defun_pro, _m4_defun_epi, and
! 998: # m4_require at hand to follow the steps.
! 999: #
! 1000: # This implements tries not to assume that of the current diversion is
! 1001: # BODY, so as soon as a macro (m4_defun'd) is expanded, we first
! 1002: # record the current diversion under the name _m4_divert_dump (denoted
! 1003: # DUMP below for short). This introduces an important difference with
! 1004: # the previous versions of Autoconf: you cannot use m4_require if you
! 1005: # were not inside an m4_defun'd macro, and especially, you cannot
! 1006: # m4_require directly from the top level.
! 1007: #
! 1008: # We have not tried to simulate the old behavior (better yet, we
! 1009: # diagnose it), because it is too dangerous: a macro m4_require'd from
! 1010: # the top level is expanded before the body of `configure', i.e., before
! 1011: # any other test was run. I let you imagine the result of requiring
! 1012: # AC_STDC_HEADERS for instance, before AC_PROG_CC was actually run....
! 1013: #
! 1014: # After AC_INIT was run, the current diversion is BODY.
! 1015: # * AC_INIT was run
! 1016: # DUMP: undefined
! 1017: # diversion stack: BODY |-
! 1018: #
! 1019: # * TEST1 is expanded
! 1020: # The prologue of TEST1 sets AC_DIVERSION_DUMP, which is the diversion
! 1021: # where the current elaboration will be dumped, to the current
! 1022: # diversion. It also m4_divert_push to GROW, where the full
! 1023: # expansion of TEST1 and its dependencies will be elaborated.
! 1024: # DUMP: BODY
! 1025: # BODY: empty
! 1026: # diversions: GROW, BODY |-
! 1027: #
! 1028: # * TEST1 requires TEST2a: prologue
! 1029: # m4_require m4_divert_pushes another temporary diversion GROW - 1 (in
! 1030: # fact, the diversion whose number is one less than the current
! 1031: # diversion), and expands TEST2a in there.
! 1032: # DUMP: BODY
! 1033: # BODY: empty
! 1034: # diversions: GROW-1, GROW, BODY |-
! 1035: #
! 1036: # * TEST2a is expanded.
! 1037: # Its prologue pushes the current diversion again.
! 1038: # DUMP: BODY
! 1039: # BODY: empty
! 1040: # diversions: GROW - 1, GROW - 1, GROW, BODY |-
! 1041: # It is expanded in GROW - 1, and GROW - 1 is popped by the epilogue
! 1042: # of TEST2a.
! 1043: # DUMP: BODY
! 1044: # BODY: nothing
! 1045: # GROW - 1: TEST2a
! 1046: # diversions: GROW - 1, GROW, BODY |-
! 1047: #
! 1048: # * TEST1 requires TEST2a: epilogue
! 1049: # The content of the current diversion is appended to DUMP (and removed
! 1050: # from the current diversion). A diversion is popped.
! 1051: # DUMP: BODY
! 1052: # BODY: TEST2a
! 1053: # diversions: GROW, BODY |-
! 1054: #
! 1055: # * TEST1 requires TEST2b: prologue
! 1056: # m4_require pushes GROW - 1 and expands TEST2b.
! 1057: # DUMP: BODY
! 1058: # BODY: TEST2a
! 1059: # diversions: GROW - 1, GROW, BODY |-
! 1060: #
! 1061: # * TEST2b is expanded.
! 1062: # Its prologue pushes the current diversion again.
! 1063: # DUMP: BODY
! 1064: # BODY: TEST2a
! 1065: # diversions: GROW - 1, GROW - 1, GROW, BODY |-
! 1066: # The body is expanded here.
! 1067: #
! 1068: # * TEST2b requires TEST3: prologue
! 1069: # m4_require pushes GROW - 2 and expands TEST3.
! 1070: # DUMP: BODY
! 1071: # BODY: TEST2a
! 1072: # diversions: GROW - 2, GROW - 1, GROW - 1, GROW, BODY |-
! 1073: #
! 1074: # * TEST3 is expanded.
! 1075: # Its prologue pushes the current diversion again.
! 1076: # DUMP: BODY
! 1077: # BODY: TEST2a
! 1078: # diversions: GROW-2, GROW-2, GROW-1, GROW-1, GROW, BODY |-
! 1079: # TEST3 requires TEST2a, but TEST2a has already been AC_PROVIDE'd, so
! 1080: # nothing happens. It's body is expanded here, and its epilogue pops a
! 1081: # diversion.
! 1082: # DUMP: BODY
! 1083: # BODY: TEST2a
! 1084: # GROW - 2: TEST3
! 1085: # diversions: GROW - 2, GROW - 1, GROW - 1, GROW, BODY |-
! 1086: #
! 1087: # * TEST2b requires TEST3: epilogue
! 1088: # The current diversion is appended to DUMP, and a diversion is popped.
! 1089: # DUMP: BODY
! 1090: # BODY: TEST2a; TEST3
! 1091: # diversions: GROW - 1, GROW - 1, GROW, BODY |-
! 1092: # The content of TEST2b is expanded here.
! 1093: # DUMP: BODY
! 1094: # BODY: TEST2a; TEST3
! 1095: # GROW - 1: TEST2b,
! 1096: # diversions: GROW - 1, GROW - 1, GROW, BODY |-
! 1097: # The epilogue of TEST2b pops a diversion.
! 1098: # DUMP: BODY
! 1099: # BODY: TEST2a; TEST3
! 1100: # GROW - 1: TEST2b,
! 1101: # diversions: GROW - 1, GROW, BODY |-
! 1102: #
! 1103: # * TEST1 requires TEST2b: epilogue
! 1104: # The current diversion is appended to DUMP, and a diversion is popped.
! 1105: # DUMP: BODY
! 1106: # BODY: TEST2a; TEST3; TEST2b
! 1107: # diversions: GROW, BODY |-
! 1108: #
! 1109: # * TEST1 is expanded: epilogue
! 1110: # TEST1's own content is in GROW, and it's epilogue pops a diversion.
! 1111: # DUMP: BODY
! 1112: # BODY: TEST2a; TEST3; TEST2b
! 1113: # GROW: TEST1
! 1114: # diversions: BODY |-
! 1115: # Here, the epilogue of TEST1 notices the elaboration is done because
! 1116: # DUMP and the current diversion are the same, it then undiverts
! 1117: # GROW by hand, and undefines DUMP.
! 1118: # DUMP: undefined
! 1119: # BODY: TEST2a; TEST3; TEST2b; TEST1
! 1120: # diversions: BODY |-
! 1121: #
! 1122: #
! 1123: # 2. Keeping track of the expansion stack
! 1124: # =======================================
! 1125: #
! 1126: # When M4 expansion goes wrong it is often extremely hard to find the
! 1127: # path amongst macros that drove to the failure. What is needed is
! 1128: # the stack of macro `calls'. One could imagine that GNU M4 would
! 1129: # maintain a stack of macro expansions, unfortunately it doesn't, so
! 1130: # we do it by hand. This is of course extremely costly, but the help
! 1131: # this stack provides is worth it. Nevertheless to limit the
! 1132: # performance penalty this is implemented only for m4_defun'd macros,
! 1133: # not for define'd macros.
! 1134: #
! 1135: # The scheme is simplistic: each time we enter an m4_defun'd macros,
! 1136: # we prepend its name in m4_expansion_stack, and when we exit the
! 1137: # macro, we remove it (thanks to pushdef/popdef).
! 1138: #
! 1139: # In addition, we want to use the expansion stack to detect circular
! 1140: # m4_require dependencies. This means we need to browse the stack to
! 1141: # check whether a macro being expanded is m4_require'd. For ease of
! 1142: # implementation, and certainly for the benefit of performances, we
! 1143: # don't browse the m4_expansion_stack, rather each time we expand a
! 1144: # macro FOO we define _m4_expanding(FOO). Then m4_require(BAR) simply
! 1145: # needs to check whether _m4_expanding(BAR) is defined to diagnose a
! 1146: # circular dependency.
! 1147: #
! 1148: # To improve the diagnostic, in addition to keeping track of the stack
! 1149: # of macro calls, m4_expansion_stack also records the m4_require
! 1150: # stack. Note that therefore an m4_defun'd macro being required will
! 1151: # appear twice in the stack: the first time because it is required,
! 1152: # the second because it is expanded. We can avoid this, but it has
! 1153: # two small drawbacks: (i) the implementation is slightly more
! 1154: # complex, and (ii) it hides the difference between define'd macros
! 1155: # (which don't appear in m4_expansion_stack) and m4_defun'd macros
! 1156: # (which do). The more debugging information, the better.
! 1157:
! 1158:
! 1159: # m4_expansion_stack_push(TEXT)
! 1160: # -----------------------------
! 1161: m4_define([m4_expansion_stack_push],
! 1162: [m4_pushdef([m4_expansion_stack],
! 1163: [$1]m4_ifdef([m4_expansion_stack], [
! 1164: m4_defn([m4_expansion_stack])]))])
! 1165:
! 1166:
! 1167: # m4_expansion_stack_pop
! 1168: # ----------------------
! 1169: # Dump the expansion stack.
! 1170: m4_define([m4_expansion_stack_pop],
! 1171: [m4_popdef([m4_expansion_stack])])
! 1172:
! 1173:
! 1174: # m4_expansion_stack_dump
! 1175: # -----------------------
! 1176: # Dump the expansion stack.
! 1177: m4_define([m4_expansion_stack_dump],
! 1178: [m4_ifdef([m4_expansion_stack],
! 1179: [m4_errprintn(m4_defn([m4_expansion_stack]))])dnl
! 1180: m4_errprintn(m4_location[: the top level])])
! 1181:
! 1182:
! 1183: # _m4_divert(GROW)
! 1184: # ----------------
! 1185: # This diversion is used by the m4_defun/m4_require machinery. It is
! 1186: # important to keep room before GROW because for each nested
! 1187: # AC_REQUIRE we use an additional diversion (i.e., two m4_require's
! 1188: # will use GROW - 2. More than 3 levels has never seemed to be
! 1189: # needed.)
! 1190: #
! 1191: # ...
! 1192: # - GROW - 2
! 1193: # m4_require'd code, 2 level deep
! 1194: # - GROW - 1
! 1195: # m4_require'd code, 1 level deep
! 1196: # - GROW
! 1197: # m4_defun'd macros are elaborated here.
! 1198:
! 1199: m4_define([_m4_divert(GROW)], 10000)
! 1200:
! 1201:
! 1202: # _m4_defun_pro(MACRO-NAME)
! 1203: # -------------------------
! 1204: # The prologue for Autoconf macros.
! 1205: m4_define([_m4_defun_pro],
! 1206: [m4_expansion_stack_push(m4_defn([m4_location($1)])[: $1 is expanded from...])dnl
! 1207: m4_pushdef([_m4_expanding($1)])dnl
! 1208: m4_ifdef([_m4_divert_dump],
! 1209: [m4_divert_push(m4_defn([_m4_divert_diversion]))],
! 1210: [m4_copy([_m4_divert_diversion], [_m4_divert_dump])dnl
! 1211: m4_divert_push([GROW])])dnl
! 1212: ])
! 1213:
! 1214:
! 1215: # _m4_defun_epi(MACRO-NAME)
! 1216: # -------------------------
! 1217: # The Epilogue for Autoconf macros. MACRO-NAME only helps tracing
! 1218: # the PRO/EPI pairs.
! 1219: m4_define([_m4_defun_epi],
! 1220: [m4_divert_pop()dnl
! 1221: m4_if(_m4_divert_dump, _m4_divert_diversion,
! 1222: [m4_undivert([GROW])dnl
! 1223: m4_undefine([_m4_divert_dump])])dnl
! 1224: m4_expansion_stack_pop()dnl
! 1225: m4_popdef([_m4_expanding($1)])dnl
! 1226: m4_provide([$1])dnl
! 1227: ])
! 1228:
! 1229:
! 1230: # m4_defun(NAME, EXPANSION)
! 1231: # -------------------------
! 1232: # Define a macro which automatically provides itself. Add machinery
! 1233: # so the macro automatically switches expansion to the diversion
! 1234: # stack if it is not already using it. In this case, once finished,
! 1235: # it will bring back all the code accumulated in the diversion stack.
! 1236: # This, combined with m4_require, achieves the topological ordering of
! 1237: # macros. We don't use this macro to define some frequently called
! 1238: # macros that are not involved in ordering constraints, to save m4
! 1239: # processing.
! 1240: m4_define([m4_defun],
! 1241: [m4_define([m4_location($1)], m4_location)dnl
! 1242: m4_define([$1],
! 1243: [_m4_defun_pro([$1])$2[]_m4_defun_epi([$1])])])
! 1244:
! 1245:
! 1246: # m4_defun_once(NAME, EXPANSION)
! 1247: # ------------------------------
! 1248: # As m4_defun, but issues the EXPANSION only once, and warns if used
! 1249: # several times.
! 1250: m4_define([m4_defun_once],
! 1251: [m4_define([m4_location($1)], m4_location)dnl
! 1252: m4_define([$1],
! 1253: [m4_provide_if([$1],
! 1254: [m4_warn([syntax], [$1 invoked multiple times])],
! 1255: [_m4_defun_pro([$1])$2[]_m4_defun_epi([$1])])])])
! 1256:
! 1257:
! 1258: # m4_pattern_forbid(ERE, [WHY])
! 1259: # -----------------------------
! 1260: # Declare that no token matching the extended regular expression ERE
! 1261: # should be seen in the output but if...
! 1262: m4_define([m4_pattern_forbid], [])
! 1263:
! 1264:
! 1265: # m4_pattern_allow(ERE)
! 1266: # ---------------------
! 1267: # ... but if that token matches the extended regular expression ERE.
! 1268: # Both used via traces.
! 1269: m4_define([m4_pattern_allow], [])
! 1270:
! 1271:
! 1272: ## ----------------------------- ##
! 1273: ## Dependencies between macros. ##
! 1274: ## ----------------------------- ##
! 1275:
! 1276:
! 1277: # m4_before(THIS-MACRO-NAME, CALLED-MACRO-NAME)
! 1278: # ---------------------------------------------
! 1279: m4_define([m4_before],
! 1280: [m4_provide_if([$2],
! 1281: [m4_warn([syntax], [$2 was called before $1])])])
! 1282:
! 1283:
! 1284: # m4_require(NAME-TO-CHECK, [BODY-TO-EXPAND = NAME-TO-CHECK])
! 1285: # -----------------------------------------------------------
! 1286: # If NAME-TO-CHECK has never been expanded (actually, if it is not
! 1287: # m4_provide'd), expand BODY-TO-EXPAND *before* the current macro
! 1288: # expansion. Once expanded, emit it in _m4_divert_dump. Keep track
! 1289: # of the m4_require chain in m4_expansion_stack.
! 1290: #
! 1291: # The normal cases are:
! 1292: #
! 1293: # - NAME-TO-CHECK == BODY-TO-EXPAND
! 1294: # Which you can use for regular macros with or without arguments, e.g.,
! 1295: # m4_require([AC_PROG_CC], [AC_PROG_CC])
! 1296: # m4_require([AC_CHECK_HEADERS(limits.h)], [AC_CHECK_HEADERS(limits.h)])
! 1297: # which is just the same as
! 1298: # m4_require([AC_PROG_CC])
! 1299: # m4_require([AC_CHECK_HEADERS(limits.h)])
! 1300: #
! 1301: # - BODY-TO-EXPAND == m4_indir([NAME-TO-CHECK])
! 1302: # In the case of macros with irregular names. For instance:
! 1303: # m4_require([AC_LANG_COMPILER(C)], [indir([AC_LANG_COMPILER(C)])])
! 1304: # which means `if the macro named `AC_LANG_COMPILER(C)' (the parens are
! 1305: # part of the name, it is not an argument) has not been run, then
! 1306: # call it.'
! 1307: # Had you used
! 1308: # m4_require([AC_LANG_COMPILER(C)], [AC_LANG_COMPILER(C)])
! 1309: # then m4_require would have tried to expand `AC_LANG_COMPILER(C)', i.e.,
! 1310: # call the macro `AC_LANG_COMPILER' with `C' as argument.
! 1311: #
! 1312: # You could argue that `AC_LANG_COMPILER', when it receives an argument
! 1313: # such as `C' should dispatch the call to `AC_LANG_COMPILER(C)'. But this
! 1314: # `extension' prevents `AC_LANG_COMPILER' from having actual arguments that
! 1315: # it passes to `AC_LANG_COMPILER(C)'.
! 1316: m4_define([m4_require],
! 1317: [m4_expansion_stack_push(m4_location[: $1 is required by...])dnl
! 1318: m4_ifdef([_m4_expanding($1)],
! 1319: [m4_fatal([$0: circular dependency of $1])])dnl
! 1320: m4_ifndef([_m4_divert_dump],
! 1321: [m4_fatal([$0: cannot be used outside of an m4_defun'd macro])])dnl
! 1322: m4_provide_if([$1],
! 1323: [],
! 1324: [m4_divert_push(m4_eval(m4_divnum - 1))dnl
! 1325: m4_default([$2], [$1])
! 1326: m4_divert(m4_defn([_m4_divert_dump]))dnl
! 1327: m4_undivert(m4_defn([_m4_divert_diversion]))dnl
! 1328: m4_divert_pop(m4_defn([_m4_divert_dump]))])dnl
! 1329: m4_provide_if([$1],
! 1330: [],
! 1331: [m4_warn([syntax],
! 1332: [$1 is m4_require'd but is not m4_defun'd])])dnl
! 1333: m4_expansion_stack_pop()dnl
! 1334: ])
! 1335:
! 1336:
! 1337: # m4_expand_once(TEXT, [WITNESS = TEXT])
! 1338: # --------------------------------------
! 1339: # If TEXT has never been expanded, expand it *here*. Use WITNESS as
! 1340: # as a memory that TEXT has already been expanded.
! 1341: m4_define([m4_expand_once],
! 1342: [m4_provide_if(m4_ifval([$2], [[$2]], [[$1]]),
! 1343: [],
! 1344: [m4_provide(m4_ifval([$2], [[$2]], [[$1]]))[]$1])])
! 1345:
! 1346:
! 1347: # m4_provide(MACRO-NAME)
! 1348: # ----------------------
! 1349: m4_define([m4_provide],
! 1350: [m4_define([m4_provide($1)])])
! 1351:
! 1352:
! 1353: # m4_provide_if(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
! 1354: # -------------------------------------------------------
! 1355: # If MACRO-NAME is provided do IF-PROVIDED, else IF-NOT-PROVIDED.
! 1356: # The purpose of this macro is to provide the user with a means to
! 1357: # check macros which are provided without letting her know how the
! 1358: # information is coded.
! 1359: m4_define([m4_provide_if],
! 1360: [m4_ifdef([m4_provide($1)],
! 1361: [$2], [$3])])
! 1362:
! 1363:
! 1364: ## -------------------- ##
! 1365: ## 9. Text processing. ##
! 1366: ## -------------------- ##
! 1367:
! 1368:
! 1369: # m4_cr_letters
! 1370: # m4_cr_LETTERS
! 1371: # m4_cr_Letters
! 1372: # -------------
! 1373: m4_define([m4_cr_letters], [abcdefghijklmnopqrstuvwxyz])
! 1374: m4_define([m4_cr_LETTERS], [ABCDEFGHIJKLMNOPQRSTUVWXYZ])
! 1375: m4_define([m4_cr_Letters],
! 1376: m4_defn([m4_cr_letters])dnl
! 1377: m4_defn([m4_cr_LETTERS])dnl
! 1378: )
! 1379:
! 1380:
! 1381: # m4_cr_digits
! 1382: # ------------
! 1383: m4_define([m4_cr_digits], [0123456789])
! 1384:
! 1385:
! 1386: # m4_cr_symbols1 & m4_cr_symbols2
! 1387: # -------------------------------
! 1388: m4_define([m4_cr_symbols1],
! 1389: m4_defn([m4_cr_Letters])dnl
! 1390: _)
! 1391:
! 1392: m4_define([m4_cr_symbols2],
! 1393: m4_defn([m4_cr_symbols1])dnl
! 1394: m4_defn([m4_cr_digits])dnl
! 1395: )
! 1396:
! 1397:
! 1398: # m4_re_escape(STRING)
! 1399: # --------------------
! 1400: # Escape BRE active characters in STRING.
! 1401: m4_define([m4_re_escape],
! 1402: [m4_bpatsubst([$1],
! 1403: [[][+*.]], [\\\&])])
! 1404:
! 1405:
! 1406: # m4_re_string
! 1407: # ------------
! 1408: # Regexp for `[a-zA-Z_0-9]*'
! 1409: m4_define([m4_re_string],
! 1410: m4_defn([m4_cr_symbols2])dnl
! 1411: [*]dnl
! 1412: )
! 1413:
! 1414:
! 1415: # m4_re_word
! 1416: # ----------
! 1417: # Regexp for `[a-zA-Z_][a-zA-Z_0-9]*'
! 1418: m4_define([m4_re_word],
! 1419: m4_defn([m4_cr_symbols1])dnl
! 1420: m4_defn([m4_re_string])dnl
! 1421: )
! 1422:
! 1423:
! 1424: # m4_tolower(STRING)
! 1425: # m4_toupper(STRING)
! 1426: # ------------------
! 1427: # These macros lowercase and uppercase strings.
! 1428: m4_define([m4_tolower],
! 1429: [m4_translit([$1], m4_defn([m4_cr_LETTERS]), m4_defn([m4_cr_letters]))])
! 1430: m4_define([m4_toupper],
! 1431: [m4_translit([$1], m4_defn([m4_cr_letters]), m4_defn([m4_cr_LETTERS]))])
! 1432:
! 1433:
! 1434: # m4_split(STRING, [REGEXP])
! 1435: # --------------------------
! 1436: #
! 1437: # Split STRING into an m4 list of quoted elements. The elements are
! 1438: # quoted with [ and ]. Beginning spaces and end spaces *are kept*.
! 1439: # Use m4_strip to remove them.
! 1440: #
! 1441: # REGEXP specifies where to split. Default is [\t ]+.
! 1442: #
! 1443: # Pay attention to the m4_changequotes. Inner m4_changequotes exist for
! 1444: # obvious reasons (we want to insert square brackets). Outer
! 1445: # m4_changequotes are needed because otherwise the m4 parser, when it
! 1446: # sees the closing bracket we add to the result, believes it is the
! 1447: # end of the body of the macro we define.
! 1448: #
! 1449: # Also, notice that $1 is quoted twice, since we want the result to
! 1450: # be quoted. Then you should understand that the argument of
! 1451: # patsubst is ``STRING'' (i.e., with additional `` and '').
! 1452: #
! 1453: # This macro is safe on active symbols, i.e.:
! 1454: # m4_define(active, ACTIVE)
! 1455: # m4_split([active active ])end
! 1456: # => [active], [active], []end
! 1457:
! 1458: m4_changequote(<<, >>)
! 1459: m4_define(<<m4_split>>,
! 1460: <<m4_changequote(``, '')dnl
! 1461: [dnl Can't use m4_default here instead of m4_if, because m4_default uses
! 1462: dnl [ and ] as quotes.
! 1463: m4_bpatsubst(````$1'''',
! 1464: m4_if(``$2'',, ``[ ]+'', ``$2''),
! 1465: ``], ['')]dnl
! 1466: m4_changequote([, ])>>)
! 1467: m4_changequote([, ])
! 1468:
! 1469:
! 1470:
! 1471: # m4_flatten(STRING)
! 1472: # ------------------
! 1473: # If STRING contains end of lines, replace them with spaces. If there
! 1474: # are backslashed end of lines, remove them. This macro is safe with
! 1475: # active symbols.
! 1476: # m4_define(active, ACTIVE)
! 1477: # m4_flatten([active
! 1478: # act\
! 1479: # ive])end
! 1480: # => active activeend
! 1481: m4_define([m4_flatten],
! 1482: [m4_translit(m4_bpatsubst([[[$1]]], [\\
! 1483: ]), [
! 1484: ], [ ])])
! 1485:
! 1486:
! 1487: # m4_strip(STRING)
! 1488: # ----------------
! 1489: # Expands into STRING with tabs and spaces singled out into a single
! 1490: # space, and removing leading and trailing spaces.
! 1491: #
! 1492: # This macro is robust to active symbols.
! 1493: # m4_define(active, ACTIVE)
! 1494: # m4_strip([ active active ])end
! 1495: # => active activeend
! 1496: #
! 1497: # This macro is fun! Because we want to preserve active symbols, STRING
! 1498: # must be quoted for each evaluation, which explains there are 4 levels
! 1499: # of brackets around $1 (don't forget that the result must be quoted
! 1500: # too, hence one more quoting than applications).
! 1501: #
! 1502: # Then notice the 2 last patterns: they are in charge of removing the
! 1503: # leading/trailing spaces. Why not just `[^ ]'? Because they are
! 1504: # applied to doubly quoted strings, i.e. more or less [[STRING]]. So
! 1505: # if there is a leading space in STRING, then it is the *third*
! 1506: # character, since there are two leading `['; equally for the last pattern.
! 1507: m4_define([m4_strip],
! 1508: [m4_bpatsubsts([[$1]],
! 1509: [[ ]+], [ ],
! 1510: [^\(..\) ], [\1],
! 1511: [ \(..\)$], [\1])])
! 1512:
! 1513:
! 1514: # m4_normalize(STRING)
! 1515: # --------------------
! 1516: # Apply m4_flatten and m4_strip to STRING.
! 1517: #
! 1518: # The argument is quoted, so that the macro is robust to active symbols:
! 1519: #
! 1520: # m4_define(active, ACTIVE)
! 1521: # m4_normalize([ act\
! 1522: # ive
! 1523: # active ])end
! 1524: # => active activeend
! 1525:
! 1526: m4_define([m4_normalize],
! 1527: [m4_strip(m4_flatten([$1]))])
! 1528:
! 1529:
! 1530:
! 1531: # m4_join(SEP, ARG1, ARG2...)
! 1532: # ---------------------------
! 1533: # Produce ARG1SEPARG2...SEPARGn.
! 1534: m4_defun([m4_join],
! 1535: [m4_case([$#],
! 1536: [1], [],
! 1537: [2], [[$2]],
! 1538: [[$2][$1]$0([$1], m4_shiftn(2, $@))])])
! 1539:
! 1540:
! 1541:
! 1542: # m4_append(MACRO-NAME, STRING, [SEPARATOR])
! 1543: # ------------------------------------------
! 1544: # Redefine MACRO-NAME to hold its former content plus `SEPARATOR`'STRING'
! 1545: # at the end. It is valid to use this macro with MACRO-NAME undefined,
! 1546: # in which case no SEPARATOR is added. Be aware that the criterion is
! 1547: # `not being defined', and not `not being empty'.
! 1548: #
! 1549: # This macro is robust to active symbols. It can be used to grow
! 1550: # strings.
! 1551: #
! 1552: # | m4_define(active, ACTIVE)
! 1553: # | m4_append([sentence], [This is an])
! 1554: # | m4_append([sentence], [ active ])
! 1555: # | m4_append([sentence], [symbol.])
! 1556: # | sentence
! 1557: # | m4_undefine([active])dnl
! 1558: # | sentence
! 1559: # => This is an ACTIVE symbol.
! 1560: # => This is an active symbol.
! 1561: #
! 1562: # It can be used to define hooks.
! 1563: #
! 1564: # | m4_define(active, ACTIVE)
! 1565: # | m4_append([hooks], [m4_define([act1], [act2])])
! 1566: # | m4_append([hooks], [m4_define([act2], [active])])
! 1567: # | m4_undefine([active])
! 1568: # | act1
! 1569: # | hooks
! 1570: # | act1
! 1571: # => act1
! 1572: # =>
! 1573: # => active
! 1574: m4_define([m4_append],
! 1575: [m4_define([$1],
! 1576: m4_ifdef([$1], [m4_defn([$1])$3])[$2])])
! 1577:
! 1578:
! 1579: # m4_append_uniq(MACRO-NAME, STRING, [SEPARATOR])
! 1580: # -----------------------------------------------
! 1581: # As `m4_append', but append only if not yet present.
! 1582: m4_define([m4_append_uniq],
! 1583: [m4_ifdef([$1],
! 1584: [m4_bmatch([$3]m4_defn([$1])[$3], m4_re_escape([$3$2$3]), [],
! 1585: [m4_append($@)])],
! 1586: [m4_append($@)])])
! 1587:
! 1588:
! 1589: # m4_text_wrap(STRING, [PREFIX], [FIRST-PREFIX], [WIDTH])
! 1590: # -------------------------------------------------------
! 1591: # Expands into STRING wrapped to hold in WIDTH columns (default = 79).
! 1592: # If prefix is set, each line is prefixed with it. If FIRST-PREFIX is
! 1593: # specified, then the first line is prefixed with it. As a special
! 1594: # case, if the length of the first prefix is greater than that of
! 1595: # PREFIX, then FIRST-PREFIX will be left alone on the first line.
! 1596: #
! 1597: # Typical outputs are:
! 1598: #
! 1599: # m4_text_wrap([Short string */], [ ], [/* ], 20)
! 1600: # => /* Short string */
! 1601: #
! 1602: # m4_text_wrap([Much longer string */], [ ], [/* ], 20)
! 1603: # => /* Much longer
! 1604: # => string */
! 1605: #
! 1606: # m4_text_wrap([Short doc.], [ ], [ --short ], 30)
! 1607: # => --short Short doc.
! 1608: #
! 1609: # m4_text_wrap([Short doc.], [ ], [ --too-wide ], 30)
! 1610: # => --too-wide
! 1611: # => Short doc.
! 1612: #
! 1613: # m4_text_wrap([Super long documentation.], [ ], [ --too-wide ], 30)
! 1614: # => --too-wide
! 1615: # => Super long
! 1616: # => documentation.
! 1617: #
! 1618: # FIXME: there is no checking of a longer PREFIX than WIDTH, but do
! 1619: # we really want to bother with people trying each single corner
! 1620: # of a software?
! 1621: #
! 1622: # This macro does not leave a trailing space behind the last word,
! 1623: # what complicates it a bit. The algorithm is stupid simple: all the
! 1624: # words are preceded by m4_Separator which is defined to empty for the
! 1625: # first word, and then ` ' (single space) for all the others.
! 1626: m4_define([m4_text_wrap],
! 1627: [m4_pushdef([m4_Prefix], m4_default([$2], []))dnl
! 1628: m4_pushdef([m4_Prefix1], m4_default([$3], [m4_Prefix]))dnl
! 1629: m4_pushdef([m4_Width], m4_default([$4], 79))dnl
! 1630: m4_pushdef([m4_Cursor], m4_len(m4_Prefix1))dnl
! 1631: m4_pushdef([m4_Separator], [])dnl
! 1632: m4_Prefix1[]dnl
! 1633: m4_if(m4_eval(m4_Cursor > m4_len(m4_Prefix)),
! 1634: 1, [m4_define([m4_Cursor], m4_len(m4_Prefix))
! 1635: m4_Prefix])[]dnl
! 1636: m4_foreach([m4_Word], m4_quote(m4_split(m4_normalize([$1]))),
! 1637: [m4_define([m4_Cursor], m4_eval(m4_Cursor + m4_len(m4_defn([m4_Word])) + 1))dnl
! 1638: dnl New line if too long, else insert a space unless it is the first
! 1639: dnl of the words.
! 1640: m4_if(m4_eval(m4_Cursor > m4_Width),
! 1641: 1, [m4_define([m4_Cursor],
! 1642: m4_eval(m4_len(m4_Prefix) + m4_len(m4_defn([m4_Word])) + 1))]
! 1643: m4_Prefix,
! 1644: [m4_Separator])[]dnl
! 1645: m4_defn([m4_Word])[]dnl
! 1646: m4_define([m4_Separator], [ ])])dnl
! 1647: m4_popdef([m4_Separator])dnl
! 1648: m4_popdef([m4_Cursor])dnl
! 1649: m4_popdef([m4_Width])dnl
! 1650: m4_popdef([m4_Prefix1])dnl
! 1651: m4_popdef([m4_Prefix])dnl
! 1652: ])
! 1653:
! 1654:
! 1655: # m4_text_box(MESSAGE, [FRAME-CHARACTER = `-'])
! 1656: # ---------------------------------------------
! 1657: m4_define([m4_text_box],
! 1658: [@%:@@%:@ m4_bpatsubst([$1], [.], m4_if([$2], [], [[-]], [[$2]])) @%:@@%:@
! 1659: @%:@@%:@ $1 @%:@@%:@
! 1660: @%:@@%:@ m4_bpatsubst([$1], [.], m4_if([$2], [], [[-]], [[$2]])) @%:@@%:@[]dnl
! 1661: ])
! 1662:
! 1663:
! 1664:
! 1665: ## ----------------------- ##
! 1666: ## 10. Number processing. ##
! 1667: ## ----------------------- ##
! 1668:
! 1669: # m4_sign(A)
! 1670: # ----------
! 1671: #
! 1672: # The sign of the integer A.
! 1673: m4_define([m4_sign],
! 1674: [m4_bmatch([$1],
! 1675: [^-], -1,
! 1676: [^0+], 0,
! 1677: 1)])
! 1678:
! 1679: # m4_cmp(A, B)
! 1680: # ------------
! 1681: #
! 1682: # Compare two integers.
! 1683: # A < B -> -1
! 1684: # A = B -> 0
! 1685: # A > B -> 1
! 1686: m4_define([m4_cmp],
! 1687: [m4_sign(m4_eval([$1 - $2]))])
! 1688:
! 1689:
! 1690: # m4_list_cmp(A, B)
! 1691: # -----------------
! 1692: #
! 1693: # Compare the two lists of integers A and B. For instance:
! 1694: # m4_list_cmp((1, 0), (1)) -> 0
! 1695: # m4_list_cmp((1, 0), (1, 0)) -> 0
! 1696: # m4_list_cmp((1, 2), (1, 0)) -> 1
! 1697: # m4_list_cmp((1, 2, 3), (1, 2)) -> 1
! 1698: # m4_list_cmp((1, 2, -3), (1, 2)) -> -1
! 1699: # m4_list_cmp((1, 0), (1, 2)) -> -1
! 1700: # m4_list_cmp((1), (1, 2)) -> -1
! 1701: m4_define([m4_list_cmp],
! 1702: [m4_if([$1$2], [()()], 0,
! 1703: [$1], [()], [$0((0), [$2])],
! 1704: [$2], [()], [$0([$1], (0))],
! 1705: [m4_case(m4_cmp(m4_car$1, m4_car$2),
! 1706: -1, -1,
! 1707: 1, 1,
! 1708: 0, [$0((m4_shift$1), (m4_shift$2))])])])
! 1709:
! 1710:
! 1711:
! 1712: ## ------------------------ ##
! 1713: ## 11. Version processing. ##
! 1714: ## ------------------------ ##
! 1715:
! 1716:
! 1717: # m4_version_unletter(VERSION)
! 1718: # ----------------------------
! 1719: # Normalize beta version numbers with letters to numbers only for comparison.
! 1720: #
! 1721: # Nl -> (N+1).-1.(l#)
! 1722: #
! 1723: #i.e., 2.14a -> 2.15.-1.1, 2.14b -> 2.15.-1.2, etc.
! 1724: # This macro is absolutely not robust to active macro, it expects
! 1725: # reasonable version numbers and is valid up to `z', no double letters.
! 1726: m4_define([m4_version_unletter],
! 1727: [m4_translit(m4_bpatsubsts([$1],
! 1728: [\([0-9]+\)\([abcdefghi]\)],
! 1729: [m4_eval(\1 + 1).-1.\2],
! 1730: [\([0-9]+\)\([jklmnopqrs]\)],
! 1731: [m4_eval(\1 + 1).-1.1\2],
! 1732: [\([0-9]+\)\([tuvwxyz]\)],
! 1733: [m4_eval(\1 + 1).-1.2\2]),
! 1734: [abcdefghijklmnopqrstuvwxyz],
! 1735: [12345678901234567890123456])])
! 1736:
! 1737:
! 1738: # m4_version_compare(VERSION-1, VERSION-2)
! 1739: # ----------------------------------------
! 1740: # Compare the two version numbers and expand into
! 1741: # -1 if VERSION-1 < VERSION-2
! 1742: # 0 if =
! 1743: # 1 if >
! 1744: m4_define([m4_version_compare],
! 1745: [m4_list_cmp((m4_split(m4_version_unletter([$1]), [\.])),
! 1746: (m4_split(m4_version_unletter([$2]), [\.])))])
! 1747:
! 1748:
! 1749: # m4_version_prereq(VERSION, [IF-OK], [IF-NOT = FAIL])
! 1750: # ----------------------------------------------------
! 1751: # Check this Autoconf version against VERSION.
! 1752: m4_define([m4_version_prereq],
! 1753: [m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]), [$1]), -1,
! 1754: [m4_default([$3],
! 1755: [m4_fatal([Autoconf version $1 or higher is required])])],
! 1756: [$2])[]dnl
! 1757: ])
! 1758:
! 1759:
! 1760:
! 1761: ## ------------------- ##
! 1762: ## 12. File handling. ##
! 1763: ## ------------------- ##
! 1764:
! 1765:
! 1766: # It is a real pity that M4 comes with no macros to bind a diversion
! 1767: # to a file. So we have to deal without, which makes us a lot more
! 1768: # fragile that we should.
! 1769:
! 1770:
! 1771: # m4_file_append(FILE-NAME, CONTENT)
! 1772: # ----------------------------------
! 1773: m4_define([m4_file_append],
! 1774: [m4_syscmd([cat >>$1 <<_m4eof
! 1775: $2
! 1776: _m4eof
! 1777: ])
! 1778: m4_if(m4_sysval, [0], [],
! 1779: [m4_fatal([$0: cannot write: $1])])])
! 1780:
! 1781:
! 1782:
! 1783: ## ------------------------ ##
! 1784: ## 13. Setting M4sugar up. ##
! 1785: ## ------------------------ ##
! 1786:
! 1787:
! 1788: # m4_init
! 1789: # -------
! 1790: m4_define([m4_init],
! 1791: [# All the M4sugar macros start with `m4_', except `dnl' kept as is
! 1792: # for sake of simplicity.
! 1793: m4_pattern_forbid([^_?m4_])
! 1794: m4_pattern_forbid([^dnl$])
! 1795:
! 1796: # Check the divert push/pop perfect balance.
! 1797: m4_wrap([m4_ifdef([_m4_divert_diversion],
! 1798: [m4_fatal([$0: unbalanced m4_divert_push:]
! 1799: m4_defn([m4_divert_stack]))])[]])
! 1800:
! 1801: m4_divert_push([KILL])
! 1802: m4_wrap([m4_divert_pop([KILL])[]])
! 1803: ])
E-mail: