Home | History | Annotate | Line # | Download | only in tests
      1 #							-*- Autotest -*-
      2 
      3 AT_BANNER([M4sugar.])
      4 
      5 # Copyright (C) 2000-2002, 2005-2012 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 3 of the License, or
     10 # (at your option) 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, see <http://www.gnu.org/licenses/>.
     19 
     20 
     21 # AT_CHECK_M4SUGAR_TEXT(CODE, STDOUT, STDERR)
     22 # -------------------------------------------
     23 # Check that m4sugar CODE expands to STDOUT and emits STDERR.
     24 m4_define([AT_CHECK_M4SUGAR_TEXT],
     25 [
     26 AT_DATA_M4SUGAR([script.4s],
     27 [[m4_init
     28 m4_divert_push([])[]dnl
     29 ]$1[[]dnl
     30 m4_divert_pop([])
     31 ]])
     32 
     33 AT_CHECK_M4SUGAR([-o-],, [$2], [$3])
     34 ])# AT_CHECK_M4SUGAR_TEXT
     35 
     36 
     37 ## ------------------ ##
     38 ## m4_stack_foreach.  ##
     39 ## ------------------ ##
     40 
     41 AT_SETUP([m4@&t@_stack])
     42 
     43 AT_KEYWORDS([m4@&t@_stack_foreach m4@&t@_stack_foreach_lifo])
     44 AT_KEYWORDS([m4@&t@_stack_foreach_sep m4@&t@_stack_foreach_sep_lifo])
     45 AT_KEYWORDS([m4@&t@_copy m4@&t@_n])
     46 
     47 # Test the semantics of macros to walk stacked macro definitions.
     48 AT_CHECK_M4SUGAR_TEXT([[dnl
     49 m4_pushdef([abc], [def])dnl
     50 m4_pushdef([abc], [ghi])dnl
     51 m4_pushdef([abc], [jkl])dnl
     52 m4_stack_foreach([abc], [m4_n])
     53 abc
     54 m4_stack_foreach_lifo([abc], [m4_n])
     55 m4_stack_foreach([abc], [m4_n])
     56 m4_copy([abc], [foo])dnl
     57 m4_stack_foreach([foo], [m4_n])
     58 m4_stack_foreach_lifo([foo], [m4_n])
     59 m4_stack_foreach_sep([abc], [ m4_index([abcdefghijkl],], [)])
     60 m4_define([colon], [:])m4_define([lt], [<])m4_define([gt], [>])dnl
     61 m4_stack_foreach_sep_lifo([abc], [lt], [gt], [colon])
     62 m4_pushdef([xyz], [123])dnl
     63 m4_pushdef([xyz], [456])dnl
     64 m4_define([doit], [[$1](m4_stack_foreach_sep([xyz], [m4_dquote(], [)], [,]))
     65 ])dnl
     66 m4_stack_foreach([abc], [doit])]],
     67 [[def
     68 ghi
     69 jkl
     70 
     71 jkl
     72 jkl
     73 ghi
     74 def
     75 
     76 def
     77 ghi
     78 jkl
     79 
     80 def
     81 ghi
     82 jkl
     83 
     84 jkl
     85 ghi
     86 def
     87 
     88  3 6 9
     89 <jkl>:<ghi>:<def>
     90 def([123],[456])
     91 ghi([123],[456])
     92 jkl([123],[456])
     93 ]])
     94 
     95 AT_CLEANUP
     96 
     97 
     98 ## --------- ##
     99 ## m4_defn.  ##
    100 ## --------- ##
    101 
    102 AT_SETUP([m4@&t@_defn])
    103 
    104 AT_KEYWORDS([m4@&t@_popdef m4@&t@_undefine m4@&t@_copy m4@&t@_rename
    105 m4@&t@_copy_force m4@&t@_rename_force])
    106 
    107 # Ensure that m4sugar dies when dereferencing undefined macros, whether
    108 # this is provided by m4 natively or faked by wrappers in m4sugar.
    109 
    110 AT_DATA_M4SUGAR([script.4s],
    111 [[m4_define([good])
    112 m4_defn([good], [oops])
    113 ]])
    114 
    115 AT_CHECK_M4SUGAR([-o-], 1, [], [stderr])
    116 AT_CHECK([grep good stderr], [1])
    117 AT_CHECK([grep 'm4@&t@_defn: undefined.*oops' stderr], [0], [ignore])
    118 
    119 AT_DATA_M4SUGAR([script.4s],
    120 [[m4_define([good])
    121 m4_popdef([good], [oops])
    122 ]])
    123 
    124 AT_CHECK_M4SUGAR([-o-], 1, [], [stderr])
    125 AT_CHECK([grep good stderr], [1])
    126 AT_CHECK([grep 'm4@&t@_popdef: undefined.*oops' stderr], [0], [ignore])
    127 
    128 AT_DATA_M4SUGAR([script.4s],
    129 [[m4_define([good])
    130 m4_undefine([good], [oops])
    131 ]])
    132 
    133 AT_CHECK_M4SUGAR([-o-], 1, [], [stderr])
    134 AT_CHECK([grep good stderr], [1])
    135 AT_CHECK([grep 'm4@&t@_undefine: undefined.*oops' stderr], [0], [ignore])
    136 
    137 # Cannot rename an undefined macro.
    138 AT_DATA_M4SUGAR([script.4s],
    139 [[m4_rename([oops], [good])
    140 ]])
    141 
    142 AT_CHECK_M4SUGAR([-o-], 1, [], [stderr])
    143 AT_CHECK([grep 'm4@&t@_undefine: undefined.*oops' stderr], [0], [ignore])
    144 
    145 # Check that pushdef stacks can be renamed.
    146 AT_CHECK_M4SUGAR_TEXT([[m4_pushdef([a], [1])dnl
    147 m4_pushdef([a], [2])dnl
    148 m4_pushdef([a], m4_defn([m4_divnum]))dnl
    149 a b c
    150 m4_rename([a], [b])dnl
    151 a b c
    152 m4_copy([b], [c])dnl
    153 a b c
    154 m4_popdef([b], [c])dnl
    155 a b c
    156 m4_popdef([b], [c])dnl
    157 a b c
    158 m4_popdef([b], [c])dnl
    159 a b c
    160 dnl m4_copy is intentionally a no-op on undefined source
    161 m4_copy([oops], [dummy])m4_ifdef([dummy], [[oops]])dnl
    162 dnl allow forceful overwrites
    163 m4_define([d], [4])m4_define([e], [5])m4_define([f], [6])dnl
    164 m4_copy_force([d], [e])dnl
    165 m4_rename_force([d], [f])dnl
    166 d e f
    167 m4_popdef([e], [f])dnl
    168 d e f
    169 ]], [[0 b c
    170 a 0 c
    171 a 0 0
    172 a 2 2
    173 a 1 1
    174 a b c
    175 d 4 4
    176 d e f
    177 ]])
    178 
    179 AT_CLEANUP
    180 
    181 
    182 ## ------------ ##
    183 ## m4_dumpdef.  ##
    184 ## ------------ ##
    185 
    186 AT_SETUP([m4@&t@_dumpdef])
    187 
    188 AT_KEYWORDS([m4@&t@_dumpdefs])
    189 
    190 # Ensure that m4sugar dies when dereferencing undefined macros.
    191 
    192 AT_DATA_M4SUGAR([script.4s],
    193 [[m4_define([good], [yep])
    194 m4_dumpdef([good], [oops])
    195 ]])
    196 
    197 AT_CHECK_M4SUGAR([-o-], 1, [], [stderr])
    198 AT_CHECK([grep '^good:	\[[yep\]]$' stderr], [0], [ignore])
    199 AT_CHECK([grep 'm4@&t@_dumpdef: undefined.*oops' stderr], [0], [ignore])
    200 
    201 # Check that pushdef stacks can be dumped.
    202 AT_CHECK_M4SUGAR_TEXT([[m4_divert_push([KILL])
    203 m4_pushdef([a], [1])
    204 m4_pushdef([a], [2])
    205 m4_dumpdef([a])
    206 m4_dumpdefs([oops], [a])
    207 m4_divert_pop([KILL])dnl
    208 ]], [],
    209 [[a:	[2]
    210 a:	[2]
    211 a:	[1]
    212 ]])
    213 
    214 # Check behavior when dumping builtins.  Unfortunately, when using M4 1.4.x
    215 # (or more precisely, when __m4_version__ is undefined), builtins get
    216 # flattened to an empty string.  It takes M4 1.6 to work around this.
    217 AT_DATA_M4SUGAR([script.4s],
    218 [[m4_ifdef([__m4_version__], [_m4_undefine([__m4_version__])])
    219 m4_init
    220 m4_dumpdef([m4_define])
    221 ]])
    222 
    223 AT_CHECK_M4SUGAR([-o-], [0], [],
    224 [[m4_define:	[]
    225 ]])
    226 
    227 AT_DATA_M4SUGAR([script.4s],
    228 [[m4_init
    229 m4_ifdef([__m4_version__],
    230 [m4_dumpdef([m4_define])],
    231 [m4_errprintn([m4_define:	<define>])])
    232 ]])
    233 
    234 AT_CHECK_M4SUGAR([-o-], [0], [],
    235 [[m4_define:	<define>
    236 ]])
    237 
    238 AT_CLEANUP
    239 
    240 
    241 ## --------- ##
    242 ## m4_warn.  ##
    243 ## --------- ##
    244 
    245 AT_SETUP([m4@&t@_warn])
    246 
    247 AT_DATA_M4SUGAR([script.4s],
    248 [[m4_init
    249 m4_defun([cross_warning], [m4_warn([cross], [cross])])
    250 
    251 m4_divert([0])dnl
    252 m4_warn([obsolete], [obsolete])dnl
    253 cross_warning[]dnl
    254 m4_warn([syntax], [syntax])dnl
    255 cross_warning[]dnl
    256 m4_warn([syntax], [syntax])dnl
    257 ]])
    258 
    259 AT_CHECK_M4SUGAR([-o-], 0, [],
    260 [script.4s:4: warning: prefer named diversions
    261 script.4s:7: warning: syntax
    262 script.4s:9: warning: syntax
    263 ])
    264 
    265 AT_CHECK_M4SUGAR([-o- -Wall], 0, [],
    266 [script.4s:4: warning: prefer named diversions
    267 script.4s:5: warning: obsolete
    268 script.4s:6: warning: cross
    269 script.4s:2: cross_warning is expanded from...
    270 script.4s:6: the top level
    271 script.4s:7: warning: syntax
    272 script.4s:8: warning: cross
    273 script.4s:2: cross_warning is expanded from...
    274 script.4s:8: the top level
    275 script.4s:9: warning: syntax
    276 ])
    277 
    278 AT_CHECK_M4SUGAR([-o- -Wnone,cross], 0, [],
    279 [script.4s:6: warning: cross
    280 script.4s:2: cross_warning is expanded from...
    281 script.4s:6: the top level
    282 script.4s:8: warning: cross
    283 script.4s:2: cross_warning is expanded from...
    284 script.4s:8: the top level
    285 ])
    286 
    287 AT_CHECK_M4SUGAR([-o- -Wnone,cross,error], 1, [],
    288 [[script.4s:6: warning: cross
    289 script.4s:2: cross_warning is expanded from...
    290 script.4s:6: the top level
    291 script.4s:8: warning: cross
    292 script.4s:2: cross_warning is expanded from...
    293 script.4s:8: the top level
    294 ]])
    295 
    296 AT_CLEANUP
    297 
    298 
    299 ## ----------------- ##
    300 ## m4_divert_stack.  ##
    301 ## ----------------- ##
    302 
    303 AT_SETUP([m4@&t@_divert_stack])
    304 AT_KEYWORDS([m4@&t@_divert m4@&t@_divert_push m4@&t@_divert_pop
    305 m4@&t@_undivert m4@&t@_cleardivert m4@&t@_divert_text])
    306 
    307 dnl This test names some diversions to avoid a warning.
    308 AT_CHECK_M4SUGAR_TEXT([[m4_define([_m4_divert(ten)], [10])dnl
    309 m4_define([_m4_divert(twenty)], [20])dnl
    310 m4_define([_m4_divert(thirty)], [30])dnl
    311 1.m4_divert_stack
    312 m4_divert_push([ten])2.m4_divert_stack
    313 m4_divert_text([twenty], [3.m4_divert_stack])dnl
    314 m4_divert([thirty])4.m4_divert_stack
    315 m4_divert_pop([thirty])dnl
    316 5.m4_undivert([twenty], [thirty])
    317 m4_pattern_allow([^m4_divert])dnl
    318 ]], [[1.script.4s:2: m4@&t@_divert_push:
    319 script.4s:1: m4@&t@_divert: KILL
    320 5.3.script.4s:8: m4@&t@_divert_push: twenty
    321 script.4s:7: m4@&t@_divert_push: ten
    322 script.4s:2: m4@&t@_divert_push:
    323 script.4s:1: m4@&t@_divert: KILL
    324 4.script.4s:9: m4@&t@_divert: thirty
    325 script.4s:2: m4@&t@_divert_push:
    326 script.4s:1: m4@&t@_divert: KILL
    327 
    328 2.script.4s:7: m4@&t@_divert_push: ten
    329 script.4s:2: m4@&t@_divert_push:
    330 script.4s:1: m4@&t@_divert: KILL
    331 ]])
    332 
    333 AT_CHECK_M4SUGAR_TEXT([[dnl
    334 m4_divert_text([3], [three])dnl
    335 m4_divert_text([4], [four])dnl
    336 m4_divert_text([1], [one])dnl
    337 m4_divert_text([2], [two])dnl
    338 m4_cleardivert([2], [3])dnl
    339 ]],
    340 [[one
    341 four
    342 ]],
    343 [[script.4s:4: warning: prefer named diversions
    344 script.4s:5: warning: prefer named diversions
    345 script.4s:6: warning: prefer named diversions
    346 script.4s:7: warning: prefer named diversions
    347 script.4s:8: warning: prefer named diversions
    348 ]])
    349 
    350 AT_DATA_M4SUGAR([script.4s],
    351 [[m4_divert_pop
    352 ]])
    353 AT_CHECK_M4SUGAR([-o-], [1], [],
    354 [[script.4s:1: error: too many m4@&t@_divert_pop
    355 script.4s:1: the top level
    356 autom4te: m4 failed with exit status: 1
    357 ]])
    358 
    359 AT_DATA_M4SUGAR([script.4s],
    360 [[m4_init
    361 m4_divert_push([1])
    362 m4_divert_pop([2])
    363 ]])
    364 AT_CHECK_M4SUGAR([-o-], [1], [],
    365 [[script.4s:3: error: m4@&t@_divert_pop(2): diversion mismatch:
    366 script.4s:2: m4@&t@_divert_push: 1
    367 script.4s:1: m4@&t@_divert: KILL
    368 script.4s:3: the top level
    369 autom4te: m4 failed with exit status: 1
    370 ]])
    371 
    372 AT_DATA_M4SUGAR([script.4s],
    373 [[m4_divert([1])
    374 m4_init
    375 m4_divert_push([2])
    376 ]])
    377 AT_CHECK_M4SUGAR([-o-], [1], [],
    378 [[script.4s:2: error: m4@&t@_init: unbalanced m4@&t@_divert_push:
    379 script.4s:3: m4@&t@_divert_push: 2
    380 script.4s:2: m4@&t@_divert: KILL
    381 script.4s:2: the top level
    382 autom4te: m4 failed with exit status: 1
    383 ]])
    384 
    385 AT_CLEANUP
    386 
    387 
    388 ## -------------------- ##
    389 ## m4_expansion_stack.  ##
    390 ## -------------------- ##
    391 
    392 AT_SETUP([m4@&t@_expansion_stack])
    393 
    394 AT_CHECK_M4SUGAR_TEXT([[1.m4_expansion_stack
    395 m4_defun([a], [b])dnl
    396 m4_define([c], [d])dnl
    397 m4_defun([d], [2.m4_expansion_stack])dnl
    398 m4_defun([b], [c])dnl
    399 a
    400 3.m4_ifdef([_m4_expansion_stack], [m4_expansion_stack])
    401 ]], [[1.script.4s:3: the top level
    402 2.script.4s:6: d is expanded from...
    403 script.4s:7: b is expanded from...
    404 script.4s:4: a is expanded from...
    405 script.4s:8: the top level
    406 3.
    407 ]])
    408 
    409 AT_CLEANUP
    410 
    411 
    412 ## --------------------------- ##
    413 ## m4_require: error message.  ##
    414 ## --------------------------- ##
    415 
    416 AT_SETUP([m4@&t@_require: error message])
    417 AT_KEYWORDS([m4@&t@_require])
    418 
    419 AT_DATA_M4SUGAR([script.4s],
    420 [[m4_defun([foo], [FOO])
    421 m4_require([foo])
    422 ]])
    423 
    424 AT_CHECK_M4SUGAR([], 1, [],
    425 [[script.4s:2: error: m4@&t@_require(foo): cannot be used outside of an m4_defun'd macro
    426 script.4s:2: the top level
    427 autom4te: m4 failed with exit status: 1
    428 ]])
    429 AT_CLEANUP
    430 
    431 
    432 ## ----------------------------------- ##
    433 ## m4_require: circular dependencies.  ##
    434 ## ----------------------------------- ##
    435 
    436 AT_SETUP([m4@&t@_require: circular dependencies])
    437 AT_KEYWORDS([m4@&t@_require])
    438 
    439 AT_DATA_M4SUGAR([script.4s],
    440 [[m4_defun([foo], [m4_require([bar])])
    441 
    442 m4_defun([bar], [m4_require([foo])])
    443 
    444 m4_defun([baz], [m4_require([foo])])
    445 
    446 m4_init
    447 m4_divert([0])dnl
    448 baz
    449 ]])
    450 
    451 AT_CHECK_M4SUGAR([], 1, [],
    452 [[script.4s:9: error: m4@&t@_require: circular dependency of foo
    453 script.4s:3: bar is expanded from...
    454 script.4s:1: foo is expanded from...
    455 script.4s:5: baz is expanded from...
    456 script.4s:9: the top level
    457 autom4te: m4 failed with exit status: 1
    458 ]])
    459 AT_CLEANUP
    460 
    461 
    462 ## ---------------------- ##
    463 ## m4_require: one-shot.  ##
    464 ## ---------------------- ##
    465 
    466 AT_SETUP([m4@&t@_require: one-shot initialization])
    467 AT_KEYWORDS([m4@&t@_require])
    468 AT_KEYWORDS([m4@&t@_defun_init m4@&t@_copy m4@&t@_defun_once])
    469 
    470 dnl check out m4_defun_init, m4_copy, and odd macro names
    471 AT_CHECK_M4SUGAR_TEXT([[
    472 m4_define([t], [text])dnl
    473 m4_defun_init([a], [[init a
    474 ]], [[common a] t])dnl
    475 m4_defun([b], [[b]m4_require([a])])dnl
    476 m4_defun([c], [[c]m4_require([a])])dnl
    477 b
    478 c
    479 a()dnl
    480 
    481 m4_defun_init([-], [hello, ], [m4_if([$#], [0], [world], [[$1]])])dnl
    482 m4_copy([-], [.])dnl
    483 m4_indir([.])
    484 m4_indir([.], [goodbye])
    485 m4_indir([-], [again])
    486 ]], [[
    487 init a
    488 common a text
    489 b
    490 c
    491 common a text
    492 hello, world
    493 goodbye
    494 hello, again
    495 ]])
    496 
    497 dnl Check m4_defun_once behavior
    498 AT_CHECK_M4SUGAR_TEXT([[
    499 m4_defun_once([a], [[a]])dnl
    500 m4_defun([b], [[b]m4_require([a])])dnl
    501 m4_defun([c], [[c]a[]m4_require([b])])dnl
    502 c
    503 a
    504 m4_defun_once([d], [[d]m4_require([a])])dnl
    505 d
    506 m4_defun_once([e], [[e]])dnl
    507 m4_defun([f], [[f]m4_require([e])e])dnl
    508 f
    509 ]], [[
    510 a
    511 b
    512 c
    513 
    514 d
    515 e
    516 f
    517 ]])
    518 
    519 
    520 AT_CLEANUP
    521 
    522 
    523 ## -------------------- ##
    524 ## m4_require: nested.  ##
    525 ## -------------------- ##
    526 
    527 AT_SETUP([m4@&t@_require: nested])
    528 AT_KEYWORDS([m4@&t@_require m4@&t@_defun])
    529 
    530 dnl From the m4sugar.m4 discourse: Require chains, top level
    531 AT_CHECK_M4SUGAR_TEXT([[dnl
    532 m4_defun([a], [[a]])dnl aka TEST2a
    533 m4_defun([b], [[b]m4_require([a])])dnl aka TEST3
    534 m4_defun([c], [[c]m4_require([b])])dnl aka TEST2b
    535 m4_defun([d], [[d]m4_require([a])m4_require([c])])dnl aka TEST1
    536 pre
    537 d
    538 d
    539 post
    540 ]],
    541 [[pre
    542 a
    543 b
    544 c
    545 d
    546 d
    547 post
    548 ]])
    549 
    550 dnl From the m4sugar.m4 discourse: Require chains, nested
    551 AT_CHECK_M4SUGAR_TEXT([[dnl
    552 m4_defun([a], [[a]])dnl aka TEST2a
    553 m4_defun([b], [[b]m4_require([a])])dnl aka TEST3
    554 m4_defun([c], [[c]m4_require([b])])dnl aka TEST2b
    555 m4_defun([d], [[d]m4_require([a])m4_require([c])])dnl aka TEST1
    556 m4_defun([wrap],
    557 [pre
    558 d
    559 d
    560 post])dnl
    561 wrap
    562 ]],
    563 [[a
    564 b
    565 c
    566 pre
    567 d
    568 d
    569 post
    570 ]])
    571 
    572 dnl Direct invocation, nested requires, top level
    573 AT_CHECK_M4SUGAR_TEXT([[dnl
    574 m4_defun([a], [[a]])dnl
    575 m4_defun([b], [[b]m4_require([a])])dnl
    576 m4_defun([c], [[c]m4_require([b])])dnl
    577 pre
    578 a
    579 c
    580 a
    581 c
    582 post
    583 ]],
    584 [[pre
    585 a
    586 b
    587 c
    588 a
    589 c
    590 post
    591 ]])
    592 
    593 dnl Direct invocation, nested requires, nested defun.  This is an example
    594 dnl of expansion before requirement, such that b occurs before its
    595 dnl prerequisite a.  This indicates a bug in the macros (but not in
    596 dnl autoconf), so we should be emitting a warning.
    597 AT_CHECK_M4SUGAR_TEXT([[dnl
    598 m4_defun([a], [[a]])dnl
    599 m4_defun([b], [[b]m4_require([a])])dnl
    600 m4_defun([c], [[c]m4_require([b])])dnl
    601 dnl the extra macro layer works around line number differences in older m4
    602 m4_define([foo], [m4_defun([outer],
    603 [pre
    604 a
    605 c
    606 a
    607 c
    608 post])])foo[]dnl
    609 outer
    610 ]],
    611 [[a
    612 b
    613 pre
    614 a
    615 c
    616 a
    617 c
    618 post
    619 ]],
    620 [[script.4s:15: warning: m4@&t@_require: `a' was expanded before it was required
    621 script.4s:15: http://www.gnu.org/software/autoconf/manual/autoconf.html#Expanded-Before-Required
    622 script.4s:5: b is expanded from...
    623 script.4s:6: c is expanded from...
    624 script.4s:14: outer is expanded from...
    625 script.4s:15: the top level
    626 ]])
    627 
    628 dnl Direct invocation, expand-before-require but no nested require.  As this
    629 dnl is common in real life, but does not result in out-of-order expansion,
    630 dnl we silently permit this.
    631 AT_CHECK_M4SUGAR_TEXT([[dnl
    632 m4_defun([a], [[a]])dnl
    633 m4_defun([b], [[b]m4_require([a])])dnl
    634 m4_defun([c], [[c]])dnl
    635 m4_defun([d], [[d]m4_require([c])])dnl
    636 pre1
    637 a
    638 b
    639 a
    640 b
    641 post1
    642 m4_defun([outer],
    643 [pre2
    644 c
    645 d
    646 c
    647 d
    648 post2])dnl
    649 outer
    650 m4_defun([e], [[e]])dnl
    651 m4_defun([f], [[f]m4_require([e])])dnl
    652 m4_defun([g], [[g]
    653 e
    654 f])dnl
    655 m4_defun([h], [[h]m4_require([g])])dnl
    656 h
    657 m4_defun([i], [[i]])dnl
    658 m4_defun([j], [[j]
    659 i])dnl
    660 m4_defun([k], [[k]m4_require([i])])dnl
    661 m4_defun([l], [[l]m4_require([k])])dnl
    662 m4_defun([m], [[m]m4_require([j])m4_require([l])])dnl
    663 m
    664 ]],
    665 [[pre1
    666 a
    667 b
    668 a
    669 b
    670 post1
    671 pre2
    672 c
    673 d
    674 c
    675 d
    676 post2
    677 g
    678 e
    679 f
    680 h
    681 j
    682 i
    683 k
    684 l
    685 m
    686 ]])
    687 
    688 AT_CLEANUP
    689 
    690 
    691 ## ------------------------------------------------- ##
    692 ## m4_ifval, m4_ifblank, m4_ifset, m4_default, etc.  ##
    693 ## ------------------------------------------------- ##
    694 
    695 AT_SETUP([m4sugar shorthand conditionals])
    696 AT_KEYWORDS([m4@&t@_ifval m4@&t@_ifblank m4@&t@_ifnblank m4@&t@_ifset
    697 m4@&t@_default m4@&t@_default_quoted m4@&t@_default_nblank
    698 m4@&t@_default_nblank_quoted])
    699 
    700 AT_CHECK_M4SUGAR_TEXT([[m4_define([active], [ACTIVE])m4_define([empty])
    701 m4_ifval([active], [yes], [no])
    702 m4_ifval([empty], [yes], [no])
    703 m4_ifval([ ], [yes], [no])
    704 m4_ifval([], [yes], [no])
    705 m4_ifblank([active], [yes], [no])
    706 m4_ifblank([empty], [yes], [no])
    707 m4_ifblank([ ], [yes], [no])
    708 m4_ifblank([], [yes], [no])
    709 m4_ifnblank([active], [yes], [no])
    710 m4_ifnblank([empty], [yes], [no])
    711 m4_ifnblank([ ], [yes], [no])
    712 m4_ifnblank([], [yes], [no])
    713 m4_ifset([active], [yes], [no])
    714 m4_ifset([empty], [yes], [no])
    715 m4_ifset([ ], [yes], [no])
    716 m4_ifset([], [yes], [no])
    717 ---
    718 m4_define([demo1], [m4_default([$1], [$2])])dnl
    719 m4_define([demo2], [m4_default_quoted([$1], [$2])])dnl
    720 m4_define([demo3], [m4_default_nblank([$1], [$2])])dnl
    721 m4_define([demo4], [m4_default_nblank_quoted([$1], [$2])])dnl
    722 demo1([active], [default])
    723 demo1([], [active])
    724 demo1([empty], [text])
    725 -demo1([ ], [active])-
    726 demo2([active], [default])
    727 demo2([], [active])
    728 demo2([empty], [text])
    729 -demo2([ ], [active])-
    730 demo3([active], [default])
    731 demo3([], [active])
    732 demo3([empty], [text])
    733 -demo3([ ], [active])-
    734 demo4([active], [default])
    735 demo4([], [active])
    736 demo4([empty], [text])
    737 -demo4([ ], [active])-
    738 ]], [[
    739 yes
    740 yes
    741 yes
    742 no
    743 no
    744 no
    745 yes
    746 yes
    747 yes
    748 yes
    749 no
    750 no
    751 yes
    752 no
    753 no
    754 no
    755 ---
    756 ACTIVE
    757 ACTIVE
    758 
    759 - -
    760 active
    761 active
    762 empty
    763 - -
    764 ACTIVE
    765 ACTIVE
    766 
    767 -ACTIVE-
    768 active
    769 active
    770 empty
    771 -active-
    772 ]])
    773 
    774 AT_CLEANUP
    775 
    776 ## --------- ##
    777 ## m4_cond.  ##
    778 ## --------- ##
    779 
    780 AT_SETUP([m4@&t@_cond])
    781 
    782 AT_CHECK_M4SUGAR_TEXT([[m4_define([side], [m4_errprintn([$1])$1])
    783 m4_cond([side(1)], [1], [a],
    784         [side(1)], [1], [b],
    785         [side(1)], [2], [c])
    786 m4_cond([side(2)], [1], [a],
    787         [side(2)], [1], [b],
    788         [side(2)], [2], [c],
    789         [side(2)])
    790 m4_cond([side(3)], [1], [a],
    791         [side(3)], [1], [b],
    792         [side(3)], [2], [c],
    793         [side(3)])
    794 m4_cond([a,a], [a,a], [yes], [no])
    795 m4_cond([[a,a]], [a,a], [yes])
    796 m4_cond([a,a], [a,b], [yes], [no])
    797 m4_cond([a,a], [a,b], [yes])
    798 m4_cond([m4_eval([0xa])])
    799 m4_define([ab], [AB])dnl
    800 m4_cond([a])b
    801 m4_cond([1], [1], [a])b
    802 m4_cond([1], [2], [3], [a])b
    803 ]], [[
    804 a
    805 c
    806 3
    807 yes
    808 yes
    809 no
    810 
    811 10
    812 AB
    813 AB
    814 AB
    815 ]], [[1
    816 2
    817 2
    818 2
    819 3
    820 3
    821 3
    822 3
    823 ]])
    824 
    825 AT_CLEANUP
    826 
    827 
    828 ## ---------- ##
    829 ## m4 lists.  ##
    830 ## ---------- ##
    831 
    832 AT_SETUP([m4 lists])
    833 
    834 AT_KEYWORDS([m4@&t@_car m4@&t@_cdr m4@&t@_argn _m4@&t_cdr])
    835 
    836 AT_CHECK_M4SUGAR_TEXT([[dnl
    837 m4_define([a], [A])m4_define([b], [B])m4_define([c], [C])
    838 m4_argn([1], [a], [b], [c])
    839 m4_argn([2], [a], [b], [c])
    840 m4_argn([3], [a], [b], [c])
    841 m4_argn([4], [a], [b], [c])
    842 m4_car([a], [b], [c])
    843 m4_cdr([a], [b], [c])
    844 m4_cdr([a], [b])
    845 m4_cdr([a])
    846 _m4_cdr([a], [b], [c])
    847 _m4_cdr([a], [b])
    848 _m4_cdr([a])
    849 m4_if(m4_cdr([], []), [[]], [good], [bad])
    850 m4_if(m4_cdr([]), [], [good], [bad])
    851 ]], [[
    852 a
    853 b
    854 c
    855 
    856 a
    857 [b],[c]
    858 [b]
    859 
    860 , [b],[c]
    861 , [b]
    862 
    863 good
    864 good
    865 ]])
    866 
    867 AT_DATA_M4SUGAR([script.4s],
    868 [[m4_init
    869 m4_argn([0], [a], [b], [c])
    870 ]])
    871 AT_CHECK_M4SUGAR([-o-], [1], [],
    872 [[script.4s:2: error: assert failed: 0 < 0
    873 script.4s:2: the top level
    874 autom4te: m4 failed with exit status: 1
    875 ]])
    876 
    877 AT_CLEANUP
    878 
    879 
    880 ## ---------- ##
    881 ## m4_split.  ##
    882 ## ---------- ##
    883 
    884 AT_SETUP([m4@&t@_split])
    885 
    886 AT_CHECK_M4SUGAR_TEXT(
    887 [[m4_define([active], [ACT, IVE])m4_define([bd], [oops])
    888 m4_split
    889 m4_split([[]])
    890 m4_split([ ])
    891 m4_split([active])
    892 m4_split([ active	active ])end
    893 m4_split([ ], [ ])
    894 m4_split([active], [ ])
    895 m4_split([ active	active ], [ ])end
    896 m4_split([abcde], [bd])
    897 m4_split([abcde], [[bd]])
    898 m4_split([foo=`` bar=''])
    899 m4_split([foo='' bar=``])
    900 dnl these next two are from the manual; keep this in sync if the internal
    901 dnl quoting strings in m4_split are changed
    902 m4_define([a], [A])m4_define([b], [B])m4_define([c], [C])dnl
    903 m4_split([a )}>=- b -=<{( c])
    904 m4_split([a )}@&t@>=- b -=<@&t@{( c])
    905 ]],
    906 [[
    907 
    908 [[]]
    909 [], []
    910 [active]
    911 [], [active], [active], []end
    912 [], []
    913 [active]
    914 [], [active	active], []end
    915 [abcde]
    916 [a], [c], [e]
    917 [foo=``], [bar='']
    918 [foo=''], [bar=``]
    919 [a], [], [B], [], [c]
    920 [a], [)}>=@&t@-], [b], [-@&t@=<{(], [c]
    921 ]])
    922 
    923 AT_CLEANUP
    924 
    925 
    926 ## ------- ##
    927 ## m4_do.  ##
    928 ## ------- ##
    929 
    930 AT_SETUP([m4@&t@_do])
    931 
    932 AT_CHECK_M4SUGAR_TEXT(
    933 [[m4_define([ab], [1])m4_define([bc], [2])m4_define([abc], [3])dnl
    934 m4_define([AB], [4])m4_define([BC], [5])m4_define([ABC], [6])dnl
    935 m4_do
    936 m4_do([a])
    937 m4_do([a], [b])c
    938 m4_unquote(m4_join([], [a], [b]))c
    939 m4_define([a], [A])m4_define([b], [B])m4_define([c], [C])dnl
    940 m4_do([a], [b])c
    941 m4_unquote(m4_join([], [a], [b]))c
    942 ]],
    943 [[
    944 a
    945 abc
    946 3
    947 ABC
    948 3
    949 ]])
    950 
    951 AT_CLEANUP
    952 
    953 
    954 ## ----------- ##
    955 ## m4_append.  ##
    956 ## ----------- ##
    957 
    958 AT_SETUP([m4@&t@_append])
    959 AT_KEYWORDS([m4@&t@_append_uniq m4@&t@_append_uniq_w])
    960 
    961 AT_CHECK_M4SUGAR_TEXT(
    962 [[m4_define([active], [ACTIVE])dnl
    963 m4_append([sentence], [This is an])dnl
    964 m4_append([sentence], [ active ])dnl
    965 m4_append([sentence], [symbol.])dnl
    966 sentence
    967 m4_undefine([active])dnl
    968 sentence
    969 m4_define([active], [ACTIVE])dnl
    970 m4_append([hooks], [m4_define([act1], [act2])])dnl
    971 m4_append([hooks], [m4_define([act2], [active])])dnl
    972 m4_undefine([active])dnl
    973 act1
    974 hooks
    975 act1
    976 dnl Test for bug fixed in 2.62 when separator is active.
    977 m4_define([a], [A])dnl
    978 m4_append_uniq([foo], [-], [a])dnl
    979 m4_append_uniq([foo], [-], [a])dnl
    980 m4_append_uniq([bar], [-], [a])dnl
    981 m4_append_uniq([bar], [~], [a])dnl
    982 m4_append_uniq([bar], [-], [a])dnl
    983 m4_defn([foo])
    984 m4_defn([bar])
    985 foo
    986 bar
    987 m4_append_uniq([blah], [one], [, ], [new], [existing])
    988 m4_append_uniq([blah], [two], [, ], [new], [existing])
    989 m4_append_uniq([blah], [two], [, ], [new], [existing])
    990 m4_append_uniq([blah], [three], [, ], [new], [existing])
    991 m4_append([blah], [two], [, ])dnl
    992 blah
    993 m4_dquote(blah)
    994 m4_append([list], [one], [[, ]])dnl
    995 m4_append([list], [two], [[, ]])dnl
    996 m4_append([list], [three], [[, ]])dnl
    997 list
    998 m4_dquote(list)
    999 m4_append_uniq_w([numbers], [1 1 2])dnl
   1000 m4_append_uniq_w([numbers], [ 2 3 ])dnl
   1001 numbers
   1002 ]],
   1003 [[This is an ACTIVE symbol.
   1004 This is an active symbol.
   1005 act1
   1006 
   1007 active
   1008 -
   1009 -a~
   1010 -
   1011 -A~
   1012 new
   1013 new
   1014 existing
   1015 new
   1016 one, two, three, two
   1017 [one],[two],[three],[two]
   1018 one, two, three
   1019 [one, two, three]
   1020 1 2 3
   1021 ]])
   1022 
   1023 AT_DATA_M4SUGAR([script.4s],
   1024 [[m4_init[]dnl
   1025 m4_append_uniq([str], [a], [ ])
   1026 m4_append_uniq([str], [a b], [ ])
   1027 m4_divert([])dnl
   1028 str
   1029 ]])
   1030 
   1031 AT_CHECK_M4SUGAR([-o-], 0, [[a a b
   1032 ]], [[script.4s:3: warning: m4@&t@_append_uniq: `a b' contains ` '
   1033 ]])
   1034 
   1035 AT_CLEANUP
   1036 
   1037 
   1038 ## --------- ##
   1039 ## m4_join.  ##
   1040 ## --------- ##
   1041 
   1042 AT_SETUP([m4@&t@_join])
   1043 
   1044 AT_KEYWORDS([m4@&t@_joinall])
   1045 
   1046 AT_CHECK_M4SUGAR_TEXT(
   1047 [[m4_define([active], [ACTIVE])
   1048 m4_join
   1049 m4_join([|])
   1050 m4_join([, ], [one], [two])
   1051 m4_dquote(m4_join([, ], [one], [two]))
   1052 m4_join([|], [active], [active])
   1053 m4_join([|], ,,,[one])
   1054 m4_join([|], [one],,,)
   1055 m4_join([], ,,,[two])
   1056 m4_join([], [two],,,)
   1057 m4_join([ active ], [one], , [two])
   1058 m4_join([], [one], [two])
   1059 m4_joinall([-], [one], [], [two])
   1060 m4_joinall([-], [], [], [three], [], [])
   1061 m4_joinall([], [one], [], [two])
   1062 m4_joinall
   1063 m4_joinall([-])
   1064 m4_joinall([-], [one])
   1065 ]],
   1066 [[
   1067 
   1068 
   1069 one, two
   1070 [one, two]
   1071 active|active
   1072 one
   1073 one
   1074 two
   1075 two
   1076 one active two
   1077 onetwo
   1078 one--two
   1079 --three--
   1080 onetwo
   1081 
   1082 
   1083 one
   1084 ]])
   1085 
   1086 AT_CLEANUP
   1087 
   1088 
   1089 ## ----------- ##
   1090 ## m4_expand.  ##
   1091 ## ----------- ##
   1092 
   1093 AT_SETUP([m4@&t@_expand])
   1094 
   1095 AT_CHECK_M4SUGAR_TEXT(
   1096 [[m4_define([active], [ACTIVE])dnl
   1097 m4_expand([#active
   1098 active])
   1099 m4_expand([[active]])
   1100 dnl properly quoted case statements
   1101 m4_expand([case a in @%:@(
   1102   *) echo active, ;;
   1103 esac
   1104 case b in
   1105   *[)] echo active, ;;
   1106 esac])
   1107 dnl unbalanced underquoted `)', but we manage anyway (gasp!)
   1108 m4_expand([case c in #(
   1109   *) echo active, ;;
   1110 esac
   1111 case d in
   1112   *) echo active, ;;
   1113 esac])
   1114 dnl unterminated comment/dnl
   1115 m4_expand([active # active])
   1116 m4_expand([a
   1117 dnl])
   1118 m4_expand([a
   1119 -dnl])
   1120 ]],
   1121 [[#active
   1122 ACTIVE
   1123 active
   1124 case a in #(
   1125   *) echo ACTIVE, ;;
   1126 esac
   1127 case b in
   1128   *) echo ACTIVE, ;;
   1129 esac
   1130 case c in #(
   1131   *) echo ACTIVE, ;;
   1132 esac
   1133 case d in
   1134   *) echo ACTIVE, ;;
   1135 esac
   1136 ACTIVE # active
   1137 a
   1138 a
   1139 -
   1140 ]])
   1141 
   1142 AT_CLEANUP
   1143 
   1144 
   1145 ## ------------- ##
   1146 ## m4_text_box.  ##
   1147 ## ------------- ##
   1148 
   1149 AT_SETUP([m4@&t@_text_box])
   1150 
   1151 AT_CHECK_M4SUGAR_TEXT([[
   1152 m4_text_box([a $1 @&t@b])
   1153 m4_text_box([a $1 @&t@b], [$])
   1154 m4_text_box([a $1 @&t@b], [,])
   1155 ]], [[
   1156 ## ------ ##
   1157 ## a $1 b ##
   1158 ## ------ ##
   1159 ## $$$$$$ ##
   1160 ## a $1 b ##
   1161 ## $$$$$$ ##
   1162 ## ,,,,,, ##
   1163 ## a $1 b ##
   1164 ## ,,,,,, ##
   1165 ]])
   1166 
   1167 AT_CLEANUP
   1168 
   1169 ## -------------- ##
   1170 ## m4_text_wrap.  ##
   1171 ## -------------- ##
   1172 
   1173 AT_SETUP([m4@&t@_text_wrap])
   1174 AT_KEYWORDS([m4@&t@_escape])
   1175 
   1176 # m4_text_wrap is used to display the help strings.  Also, check that
   1177 # commas and $ are not swallowed.  This can easily happen because of
   1178 # m4-listification.
   1179 
   1180 AT_DATA_M4SUGAR([script.4s],
   1181 [[m4_init[]m4_divert([])dnl
   1182 m4_define([a], [OOPS])dnl
   1183 m4_escape([a[b $c#]d])
   1184 m4_if(m4_escape([a[b $c#]d]), [a[b $c#]d], [oops],
   1185       m4_escape([a[b $c#]d]), [a@<:@b @S|@c@%:@@:>@d], [pass], [oops])
   1186 
   1187 m4_text_wrap([Short string */], [   ], [/* ], 20)
   1188 
   1189 m4_text_wrap([Much longer string */], [   ], [/* ], 20)
   1190 
   1191 m4_text_wrap([Short doc.], [          ], [  --short ], 30)
   1192 
   1193 m4_text_wrap([Short doc.], [          ], [  --too-wide], 30)
   1194 
   1195 m4_text_wrap([Super long documentation.], [          ], [  --too-wide], 30)
   1196 
   1197 m4_text_wrap([First, second  , third, [,quoted  space]])
   1198 m4_define([xfff], [oops])
   1199 m4_text_wrap([Some $1 $2 $3 $4 embedded dollars.], [ $* ], [ $@ ], [0xfff & 20])
   1200 ]])
   1201 
   1202 AT_DATA([expout],
   1203 [[a[b $c#]d
   1204 pass
   1205 
   1206 /* Short string */
   1207 
   1208 /* Much longer
   1209    string */
   1210 
   1211   --short Short doc.
   1212 
   1213   --too-wide
   1214           Short doc.
   1215 
   1216   --too-wide
   1217           Super long
   1218           documentation.
   1219 
   1220 First, second , third, [,quoted space]
   1221 
   1222  $@ Some $1 $2 $3
   1223  $* $4 embedded
   1224  $* dollars.
   1225 ]])
   1226 
   1227 AT_CHECK_M4SUGAR([-o-], 0, [expout])
   1228 
   1229 AT_CLEANUP
   1230 
   1231 ## -------------------- ##
   1232 ## m4_version_compare.  ##
   1233 ## -------------------- ##
   1234 
   1235 AT_SETUP([m4@&t@_version_compare])
   1236 
   1237 AT_KEYWORDS([m4@&t@_list_cmp])
   1238 
   1239 AT_CHECK_M4SUGAR_TEXT(
   1240 [[m4_version_compare([1.1], [2.0])
   1241 m4_version_compare([2.0b], [2.0a])
   1242 m4_version_compare([2.0z], [2.0y])
   1243 m4_version_compare([1.1.1], [1.1.1a])
   1244 m4_version_compare([1.2], [1.1.1a])
   1245 m4_version_compare([1.0], [1])
   1246 m4_version_compare([1.0a], [1.0a])
   1247 m4_version_compare([1.1a], [1.1a.1])
   1248 m4_version_compare([1.10], [1.1a])
   1249 m4_version_compare([1-1a], [1,1A])
   1250 m4_define([a], [oops])dnl
   1251 m4_version_compare([1.1a], [1.1A])
   1252 m4_version_compare([1z], [1aa])
   1253 m4_version_compare([2.61a], [2.61a-248-dc51])
   1254 m4_version_compare([2.61b], [2.61a-248-dc51])
   1255 m4_version_compare([08], [09])
   1256 m4_version_compare([010], [8])
   1257 dnl Test that side effects to m4_list_cmp occur exactly once
   1258 m4_list_cmp([[0], [0], [0]m4_errprintn([hi])],
   1259             [[0], [0], [0]m4_errprintn([hi])])
   1260 m4_list_cmp([[0], [0], [0]m4_errprintn([hi])],
   1261             [[0], [0], [0]m4_errprintn([bye])])
   1262 ]],
   1263 [[-1
   1264 1
   1265 1
   1266 -1
   1267 1
   1268 0
   1269 0
   1270 -1
   1271 1
   1272 0
   1273 0
   1274 -1
   1275 -1
   1276 1
   1277 -1
   1278 1
   1279 0
   1280 0
   1281 ]], [[hi
   1282 hi
   1283 hi
   1284 bye
   1285 ]])
   1286 
   1287 AT_CLEANUP
   1288 
   1289 ## ------------------------------ ##
   1290 ## Standard regular expressions.  ##
   1291 ## ------------------------------ ##
   1292 
   1293 AT_SETUP([Standard regular expressions])
   1294 
   1295 # AT_CHECK_M4RE(RE-NAME, TEXT, INTENT = `ok' | `')
   1296 # ------------------------------------------------
   1297 # Check whether RE-NAME (a macro whose definition is a regular expression)
   1298 # matches TEXT.  INTENT = `ok' if the match should succeed or else empty.
   1299 m4_define([AT_CHECK_M4RE],
   1300 [AT_CHECK_M4SUGAR_TEXT(
   1301 [[m4_bregexp([$2], ^m4_defn([$1])$, [ok])
   1302 ]], [$3
   1303 ])])
   1304 
   1305 AT_CHECK_M4RE([m4_re_word], [ab9_c], [ok])
   1306 AT_CHECK_M4RE([m4_re_word], [_9abc], [ok])
   1307 AT_CHECK_M4RE([m4_re_word], [9ab_c])
   1308 
   1309 AT_CHECK_M4RE([m4_re_string], [ab9_c], [ok])
   1310 AT_CHECK_M4RE([m4_re_string], [_9abc], [ok])
   1311 AT_CHECK_M4RE([m4_re_string], [9ab_c], [ok])
   1312 AT_CHECK_M4RE([m4_re_string], [9a@_c])
   1313 
   1314 AT_CLEANUP
   1315 
   1316 ## ----------- ##
   1317 ## m4_bmatch.  ##
   1318 ## ----------- ##
   1319 
   1320 AT_SETUP([m4@&t@_bmatch])
   1321 
   1322 AT_CHECK_M4SUGAR_TEXT(
   1323 [[m4_bmatch([abc], [default\])
   1324 m4_bmatch([abc], [^a], [yes])
   1325 m4_bmatch([abc], [^a], [yes], [no])
   1326 m4_bmatch([abc], [^.a], [yes])
   1327 m4_bmatch([abc], [^.a], [yes], [no\])
   1328 m4_bmatch([abc], [a], [1], [b], [2])
   1329 m4_bmatch([abc], [A], [1], [b], [2])
   1330 m4_define([ab], [AB])dnl
   1331 m4_bmatch([$*], [a])b
   1332 m4_bmatch([$*], [\*], [a])b
   1333 m4_bmatch([$*], [1], [2], [a])b
   1334 ]], [[default\
   1335 yes
   1336 yes
   1337 
   1338 no\
   1339 1
   1340 2
   1341 AB
   1342 AB
   1343 AB
   1344 ]])
   1345 
   1346 AT_CLEANUP
   1347 
   1348 ## ------------------------ ##
   1349 ## m4_toupper, m4_tolower.  ##
   1350 ## ------------------------ ##
   1351 
   1352 AT_SETUP([m4@&t@_toupper and m4@&t@_tolower])
   1353 
   1354 AT_CHECK_M4SUGAR_TEXT(
   1355 [[m4_define([abc], [hI])m4_define([ABC], [Hi])
   1356 m4_toupper(abc aBc ABC)
   1357 m4_tolower(abc aBc ABC)
   1358 m4_toupper([abc aBc ABC])
   1359 m4_tolower([abc aBc ABC])
   1360 m4_echo(m4_toupper(abc aBc ABC))
   1361 m4_echo(m4_tolower(abc aBc ABC))
   1362 m4_echo(m4_toupper([abc aBc ABC]))
   1363 m4_echo(m4_tolower([abc aBc ABC]))
   1364 m4_do(m4_toupper(abc aBc ABC))
   1365 m4_do(m4_tolower(abc aBc ABC))
   1366 m4_do(m4_toupper([abc aBc ABC]))
   1367 m4_do(m4_tolower([abc aBc ABC]))
   1368 ]], [[
   1369 HI ABC HI
   1370 hi abc hi
   1371 ABC ABC ABC
   1372 abc abc abc
   1373 HI ABC HI
   1374 hi abc hi
   1375 ABC ABC ABC
   1376 abc abc abc
   1377 HI Hi HI
   1378 hi hI hi
   1379 Hi Hi Hi
   1380 hI hI hI
   1381 ]])
   1382 
   1383 AT_CLEANUP
   1384 
   1385 ## --------------- ##
   1386 ## m4_bpatsubsts.  ##
   1387 ## --------------- ##
   1388 
   1389 AT_SETUP([m4@&t@_bpatsubsts])
   1390 
   1391 AT_CHECK_M4SUGAR_TEXT(
   1392 [[m4_bpatsubsts([11], [^..$])
   1393 m4_bpatsubsts([11], [\(.\)1], [\12])
   1394 m4_bpatsubsts([11], [^..$], [], [1], [2])
   1395 m4_bpatsubsts([11], [\(.\)1], [\12], [1], [3])
   1396 m4_define([a], [oops])m4_define([c], [oops])dnl
   1397 m4_define([AB], [good])m4_define([bc], [good])dnl
   1398 m4_bpatsubsts([abc], [a], [A], [b], [B], [c])
   1399 m4_bpatsubsts([ab], [a])c
   1400 m4_bpatsubsts([ab], [c], [C], [a])c
   1401 m4_bpatsubsts([$1$*$@], [\$\*], [$#])
   1402 ]], [[11
   1403 21
   1404 22
   1405 23
   1406 good
   1407 good
   1408 good
   1409 $1$#$@
   1410 ]])
   1411 
   1412 AT_CLEANUP
   1413 
   1414 ## -------------- ##
   1415 ## m4_esyscmd_s.  ##
   1416 ## -------------- ##
   1417 
   1418 AT_SETUP([m4@&t@_esyscmd_s])
   1419 AT_KEYWORDS([m4@&t@_chomp m4@&t@_chomp_all])
   1420 
   1421 AT_CHECK_M4SUGAR_TEXT(
   1422 [[m4_define([world], [WORLD])dnl
   1423 m4_chomp([abc])
   1424 m4_chomp([world
   1425 
   1426 ])
   1427 m4_esyscmd_s([echo hello world])
   1428 m4_esyscmd_s([echo '[goodbye,
   1429 cruel world
   1430 
   1431 ]'])
   1432 ]], [[abc
   1433 world
   1434 
   1435 hello WORLD
   1436 goodbye,
   1437 cruel world
   1438 ]])
   1439 
   1440 AT_CLEANUP
   1441 
   1442 ## ---------- ##
   1443 ## M4 Loops.  ##
   1444 ## ---------- ##
   1445 
   1446 AT_SETUP([M4 loops])
   1447 
   1448 AT_KEYWORDS([m4@&t@_for m4@&t@_foreach m4@&t@_foreach_w m4@&t@_map_args_w])
   1449 
   1450 AT_CHECK_M4SUGAR_TEXT([[dnl
   1451 m4_define([myvar], [outer value])dnl
   1452 m4_for([myvar], 1, 3, 1, [ myvar])
   1453 m4_for([myvar], 1, 3,  , [ myvar])
   1454 m4_for([myvar], 3, 1,-1, [ myvar])
   1455 m4_for([myvar], 3, 1,  , [ myvar])
   1456 m4_for([myvar], 1, 3, 2, [ myvar])
   1457 m4_for([myvar], 3, 1,-2, [ myvar])
   1458 m4_for([myvar],-1,-3,-2, [ myvar])
   1459 m4_for([myvar],-3,-1, 2, [ myvar])
   1460 dnl Make sure we recalculate the bounds correctly:
   1461 m4_for([myvar], 1, 3, 3, [ myvar])
   1462 m4_for([myvar], 1, 6, 3, [ myvar])
   1463 m4_for([myvar],22,-7,-5, [ myvar])
   1464 m4_for([myvar],-2,-7,-4, [ myvar])
   1465 m4_for([myvar],-7,-2, 4, [ myvar])
   1466 dnl Make sure we are not exposed to division truncation:
   1467 m4_for([myvar], 2, 5, 2, [ myvar])
   1468 m4_for([myvar],-5,-2, 2, [ myvar])
   1469 m4_for([myvar], 5, 2,-2, [ myvar])
   1470 m4_for([myvar],-2,-5,-2, [ myvar])
   1471 dnl Make sure we do not divide by zero:
   1472 m4_for([myvar], 1, 1,  , [ myvar])
   1473 m4_for([myvar], 1, 1,+2, [ myvar])
   1474 m4_for([myvar], 1, 1,-2, [ myvar])
   1475 dnl Make sure we do not loop endlessly
   1476 m4_for([myval], 1, 1, 0, [ myval])
   1477 dnl Make sure to properly parenthesize
   1478 m4_for([myvar], 3-5, -2+8, , [ myvar])
   1479 m4_for([myvar], -2+8, 3-5, , [ myvar])
   1480 m4_for([myvar], 8, 16, 3 * 2, [ myvar])
   1481 m4_for([myvar], 8, 16, -3 * -2, [ myvar])
   1482 m4_for([myvar], [2<<2], [2<<3], [-3 * (-2)], [ myvar])
   1483 dnl Modifying var does not affect the number of iterations
   1484 m4_for([myvar], 1, 5, , [ myvar[]m4_define([myvar], 5)])
   1485 dnl Make sure we can do nameless iteration
   1486 m4_for(, 1, 10, , -)
   1487 dnl foreach tests
   1488 m4_foreach([myvar], [[a], [b, c], [d], [e
   1489 ],[f]], [ myvar|])
   1490 m4_foreach_w([myvar], [a  b c, d,e f
   1491 g], [ myvar|])
   1492 myvar
   1493 m4_map_args_w([a  b c, d,e f
   1494 g], [ ], [|])
   1495 m4_map_args_w([a b], [\1], [/])
   1496 m4_define([dashes], [--])dnl
   1497 m4_map_args_w([a b c], [/], [\1], [dashes])
   1498 dnl only one side effect expansion, prior to visiting list elements
   1499 m4_foreach([i], [[1], [2], [3]m4_errprintn([hi])], [m4_errprintn(i)])dnl
   1500 dnl shifting forms an important part of loops
   1501 m4_shift3:m4_shift3(1,2,3):m4_shift3(1,2,3,4)
   1502 m4_shiftn(3,1,2,3):m4_shiftn(3,1,2,3,4)
   1503 ]],
   1504 [[ 1 2 3
   1505  1 2 3
   1506  3 2 1
   1507  3 2 1
   1508  1 3
   1509  3 1
   1510  -1 -3
   1511  -3 -1
   1512  1
   1513  1 4
   1514  22 17 12 7 2 -3
   1515  -2 -6
   1516  -7 -3
   1517  2 4
   1518  -5 -3
   1519  5 3
   1520  -2 -4
   1521  1
   1522  1
   1523  1
   1524  1
   1525  -2 -1 0 1 2 3 4 5 6
   1526  6 5 4 3 2 1 0 -1 -2
   1527  8 14
   1528  8 14
   1529  8 14
   1530  1 2 3 4 5
   1531 ----------
   1532  a| b, c| d| e
   1533 | f|
   1534  a| b| c,| d,e| f| g|
   1535 outer value
   1536  a| b| c,| d,e| f| g|
   1537 \1a/\1b/
   1538 /a\1--/b\1--/c\1
   1539 ::4
   1540 :4
   1541 ]], [[hi
   1542 1
   1543 2
   1544 3
   1545 ]])
   1546 
   1547 dnl bounds checking in m4_for
   1548 AT_DATA_M4SUGAR([script.4s],
   1549 [[m4_init
   1550 m4_divert([0])dnl
   1551 m4_for([myvar], 1, 3,-1, [ myvar])
   1552 ]])
   1553 AT_CHECK_M4SUGAR([], 1, [],
   1554 [[script.4s:3: error: assert failed: -1 > 0
   1555 script.4s:3: the top level
   1556 autom4te: m4 failed with exit status: 1
   1557 ]])
   1558 
   1559 AT_DATA_M4SUGAR([script.4s],
   1560 [[m4_init
   1561 m4_divert([0])dnl
   1562 m4_for([myvar], 1, 2, 0, [ myvar])
   1563 ]])
   1564 AT_CHECK_M4SUGAR([], 1, [],
   1565 [[script.4s:3: error: assert failed: 0 > 0
   1566 script.4s:3: the top level
   1567 autom4te: m4 failed with exit status: 1
   1568 ]])
   1569 
   1570 AT_DATA_M4SUGAR([script.4s],
   1571 [[m4_init
   1572 m4_divert([0])dnl
   1573 m4_for([myvar], 2, 1, 0, [ myvar])
   1574 ]])
   1575 AT_CHECK_M4SUGAR([], 1, [],
   1576 [[script.4s:3: error: assert failed: 0 < 0
   1577 script.4s:3: the top level
   1578 autom4te: m4 failed with exit status: 1
   1579 ]])
   1580 
   1581 dnl m4_shiftn also does bounds checking
   1582 AT_DATA_M4SUGAR([script.4s],
   1583 [[m4_init
   1584 m4_divert([0])dnl
   1585 m4_shiftn(3,1,2)
   1586 ]])
   1587 AT_CHECK_M4SUGAR([], 1, [],
   1588 [[script.4s:3: error: assert failed: 0 < 3 && 3 < 3
   1589 script.4s:3: the top level
   1590 autom4te: m4 failed with exit status: 1
   1591 ]])
   1592 
   1593 AT_CLEANUP
   1594 
   1595 
   1596 ## --------------------- ##
   1597 ## m4_map{,all}{,_sep}.  ##
   1598 ## --------------------- ##
   1599 
   1600 AT_SETUP([m4@&t@_map])
   1601 AT_KEYWORDS([m4@&t@_apply m4@&t@_map_sep m4@&t@_mapall m4@&t@_mapall_sep])
   1602 AT_KEYWORDS([m4@&t@_count])
   1603 
   1604 AT_CHECK_M4SUGAR_TEXT([[dnl
   1605 m4_map([m4_count], [])
   1606 m4_map([ m4_count], [[],
   1607                      [[1]],
   1608                      [[1], [2]]])
   1609 m4_mapall([ m4_count], [[],
   1610                         [[1]],
   1611                         [[1], [2]]])
   1612 m4_map_sep([m4_eval], [,], [[[1+2]],
   1613                             [[10], [16]]])
   1614 m4_count(m4_map_sep([m4_echo], [,], [[], [[1]], [[2]]]))
   1615 m4_count(m4_mapall_sep([m4_echo], [,], [[], [[1]], [[2]]]))
   1616 m4_map_sep([m4_eval], [[,]], [[[1+2]],
   1617                               [[10], [16]]])
   1618 m4_count(m4_map_sep([m4_echo], [[,]], [[], [[1]], [[2]]]))
   1619 m4_count(m4_mapall_sep([m4_echo], [[,]], [[], [[1]], [[2]]]))
   1620 m4_map([-], [[]])
   1621 m4_mapall([-], [[]])
   1622 m4_map_sep([-], [:], [[]])
   1623 m4_mapall_sep([-], [:], [[]])
   1624 m4_define([a], [m4_if([$#], [0], [oops], [$1], [a], [pass], [oops])])dnl
   1625 m4_define([a1], [oops])dnl
   1626 m4_define([pass1], [oops])dnl
   1627 m4_map([a], [[[a]]])1
   1628 m4_map([m4_unquote([a])], [m4_dquote([a])])
   1629 dnl only one side effect expansion, prior to visiting list elements
   1630 m4_map([m4_errprintn], [[[1]], [[2]], [[3]]m4_errprintn([hi])])dnl
   1631 m4_map_sep([m4_errprintn], [], [[[1]], [[2]], [[3]]m4_errprintn([hi])])dnl
   1632 m4_mapall([m4_errprintn], [[[1]], [[2]], [[3]]m4_errprintn([hi])])dnl
   1633 m4_mapall_sep([m4_errprintn], [], [[[1]], [[2]], [[3]]m4_errprintn([hi])])dnl
   1634 ]],
   1635 [[
   1636  1 2
   1637  0 1 2
   1638 3,a
   1639 2
   1640 3
   1641 3,a
   1642 1
   1643 1
   1644 
   1645 -
   1646 
   1647 -
   1648 pass1
   1649 pass
   1650 ]], [[hi
   1651 1
   1652 2
   1653 3
   1654 hi
   1655 1
   1656 2
   1657 3
   1658 hi
   1659 1
   1660 2
   1661 3
   1662 hi
   1663 1
   1664 2
   1665 3
   1666 ]])
   1667 
   1668 AT_CLEANUP
   1669 
   1670 
   1671 ## --------------------------------------- ##
   1672 ## m4_map_args{,_sep,_pair} and m4_curry.  ##
   1673 ## --------------------------------------- ##
   1674 
   1675 AT_SETUP([m4@&t@_map_args and m4@&t@_curry])
   1676 AT_KEYWORDS([m4@&t@_map_args_sep m4@&t@_map_args_pair m4@&t@_reverse
   1677 m4@&t@_map])
   1678 
   1679 dnl First, make sure we can curry in isolation.
   1680 AT_CHECK_M4SUGAR_TEXT(
   1681 [[m4_curry([m4_echo])([1])
   1682 m4_curry([m4_curry], [m4_reverse], [1])([2])([3])
   1683 m4_define([add], [m4_eval(([$1]) + ([$2]))])dnl
   1684 m4_define([add_one], [m4_curry([add], [1])])dnl
   1685 add_one()([4])
   1686 ]],
   1687 [[1
   1688 3, 2, 1
   1689 5
   1690 ]])
   1691 
   1692 dnl Now, check that we can map a list of arguments.
   1693 AT_CHECK_M4SUGAR_TEXT([[m4_define([active], [ACTIVE])dnl
   1694 m4_map_args([ m4_echo])
   1695 m4_map_args([ m4_echo], [plain], [active])
   1696 m4_map_args([m4_unquote], [plain], [active])
   1697 m4_map_args_pair([, m4_reverse], [])
   1698 m4_map_args_pair([, m4_reverse], [], [1])
   1699 m4_map_args_pair([, m4_reverse], [], [1], [2])
   1700 m4_map_args_pair([, m4_reverse], [], [1], [2], [3])
   1701 m4_map_args_pair([, m4_reverse], [], [1], [2], [3], [4])
   1702 m4_map_args_pair([, m4_reverse], [, m4_dquote], [1])
   1703 m4_map_args_pair([, m4_reverse], [, m4_dquote], [1], [2])
   1704 m4_map_args_pair([, m4_reverse], [, m4_dquote], [1], [2], [3])
   1705 m4_map_args_pair([, m4_reverse], [, m4_dquote], [1], [2], [3], [4])
   1706 m4_map_args_sep([<], [>], [:], [1], [2], [3])
   1707 m4_map_args_sep([m4_echo(], [)], [ ], [plain], [active])
   1708 ]],
   1709 [[
   1710  plain active
   1711 plainACTIVE
   1712 
   1713 , 1
   1714 , 2, 1
   1715 , 2, 1, 3
   1716 , 2, 1, 4, 3
   1717 , [1]
   1718 , 2, 1
   1719 , 2, 1, [3]
   1720 , 2, 1, 4, 3
   1721 <1>:<2>:<3>
   1722 plain active
   1723 ]])
   1724 
   1725 dnl Finally, put the two concepts together, to show the real power of the API.
   1726 AT_CHECK_M4SUGAR_TEXT(
   1727 [[m4_define([add], [m4_eval(([$1]) + ([$2]))])dnl
   1728 m4_define([list], [[-1], [0], [1]])dnl
   1729 dnl list_add_n(value, arg...)
   1730 dnl add VALUE to each ARG and output the resulting list
   1731 m4_define([list_add_n],
   1732   [m4_shift(m4_map_args([,m4_curry([add], [$1])], m4_shift($@)))])
   1733 list_add_n([1], list)
   1734 list_add_n([2], list)
   1735 ]], [[
   1736 0,1,2
   1737 1,2,3
   1738 ]])
   1739 
   1740 AT_CLEANUP
   1741 
   1742 
   1743 ## ------------ ##
   1744 ## m4_combine.  ##
   1745 ## ------------ ##
   1746 
   1747 AT_SETUP([m4@&t@_combine])
   1748 
   1749 AT_CHECK_M4SUGAR_TEXT([[m4_define([a], [oops])dnl
   1750 m4_combine([, ], [[a], [b], [c]], [-], [1], [2], [3])
   1751 m4_combine([, ], [[a], [b]], [-])
   1752 m4_combine([, ], [[a], [b]], [-], [])
   1753 m4_combine([, ], [], [-], [a], [b])
   1754 m4_combine([, ], [[]], [-], [a], [b])
   1755 m4_combine([ a ], [[-], [+]], [a], [-], [+])
   1756 m4_combine([$* ], [[$1], [$2]], [$#], [$@])
   1757 ]],
   1758 [[a-1, a-2, a-3, b-1, b-2, b-3, c-1, c-2, c-3
   1759 
   1760 a-, b-
   1761 
   1762 -a, -b
   1763 -a- a -a+ a +a- a +a+
   1764 $1$#$@$* $2$#$@
   1765 ]], [])
   1766 
   1767 AT_CLEANUP
   1768 
   1769 
   1770 ## -------------- ##
   1771 ## m4_{max,min}.  ##
   1772 ## -------------- ##
   1773 
   1774 AT_SETUP([m4@&t@_max and m4@&t@_min])
   1775 
   1776 AT_DATA_M4SUGAR([script.4s],
   1777 [[m4_max
   1778 ]])
   1779 
   1780 AT_CHECK_M4SUGAR([], 1, [],
   1781 [[script.4s:1: error: too few arguments to m4@&t@_max
   1782 script.4s:1: the top level
   1783 autom4te: m4 failed with exit status: 1
   1784 ]])
   1785 
   1786 AT_DATA_M4SUGAR([script.4s],
   1787 [[m4_min
   1788 ]])
   1789 
   1790 AT_CHECK_M4SUGAR([], 1, [],
   1791 [[script.4s:1: error: too few arguments to m4@&t@_min
   1792 script.4s:1: the top level
   1793 autom4te: m4 failed with exit status: 1
   1794 ]])
   1795 
   1796 AT_CHECK_M4SUGAR_TEXT([[dnl
   1797 m4_min(0)
   1798 m4_min(0xa)
   1799 m4_min(0, 0)
   1800 m4_min(0, 1)
   1801 m4_min(1, 0)
   1802 m4_min(0+1, 1+1)
   1803 m4_min(0+1, 1+0)
   1804 m4_min(0, 1, 2)
   1805 m4_min(2, 1, 0)
   1806 m4_min(1m4_for([i], 2, 100, , [,i]))
   1807 m4_min(m4_for([i], 100, 2, , [i,])1)
   1808 ----
   1809 m4_max(0)
   1810 m4_max(0xa)
   1811 m4_max(0, 0)
   1812 m4_max(0, 1)
   1813 m4_max(1, 0)
   1814 m4_max(1+0, 1+1)
   1815 m4_max(1+0, 1+0)
   1816 m4_max(0, 1, 2)
   1817 m4_max(2, 1, 0)
   1818 m4_max(1m4_for([i], 2, 100, , [,i]))
   1819 m4_max(m4_for([i], 100, 2, , [i,])1)
   1820 ]],
   1821 [[0
   1822 10
   1823 0
   1824 0
   1825 0
   1826 1
   1827 1
   1828 0
   1829 0
   1830 1
   1831 1
   1832 ----
   1833 0
   1834 10
   1835 0
   1836 1
   1837 1
   1838 2
   1839 1
   1840 2
   1841 2
   1842 100
   1843 100
   1844 ]], [])
   1845 
   1846 AT_CLEANUP
   1847 
   1848 
   1849 ## ----------- ##
   1850 ## Recursion.  ##
   1851 ## ----------- ##
   1852 
   1853 AT_SETUP([recursion])
   1854 
   1855 AT_KEYWORDS([m4@&t@_foreach m4@&t@_foreach_w m4@&t@_case m4@&t@_cond
   1856 m4@&t@_bpatsubsts m4@&t@_shiftn m4@&t@_do m4@&t@_dquote_elt m4@&t@_reverse
   1857 m4@&t@_map m4@&t@_join m4@&t@_joinall m4@&t@_list_cmp m4@&t@_max m4@&t@_min
   1858 m4@&t@_bmatch m4@&t@_map_args m4@&t@_map_args_pair])
   1859 
   1860 dnl This test completes in a reasonable time if m4_foreach is linear,
   1861 dnl but thrashes if it is quadratic.  If we are testing with m4 1.4.x,
   1862 dnl only the slower foreach.m4 implementation will work.  But if we
   1863 dnl are testing with m4 1.6, we can rerun the test with __m4_version__
   1864 dnl undefined to exercise the alternate code path.
   1865 AT_DATA_M4SUGAR([script.4s],
   1866 [[m4_init
   1867 m4_divert_push([])[]dnl
   1868 m4_len(m4_foreach_w([j], m4_do(m4_for([i], [1], [10000], [], [,i ])), [j ]))
   1869 m4_shiftn(9998m4_for([i], [1], [10000], [], [,i]))
   1870 m4_len(m4_join([--],, m4_dquote_elt(m4_for([i], [1], [10000], [], [,i])),))
   1871 m4_len(m4_joinall([--], m4_map([, m4_echo],
   1872   m4_dquote([1]m4_for([i], [2], [10000], [], [,i])))))
   1873 m4_max(m4_min([1]m4_for([i], [2], [10000], [],
   1874   [,i]))m4_for([i], [2], [10000], [], [,i]))
   1875 m4_case([10000]m4_for([i], [1], [10000], [], [,i]),[end])
   1876 m4_list_cmp(m4_dquote(1m4_for([i], [2], [10000], [], [,i])),
   1877   m4_dquote(m4_reverse(10000m4_for([i], [9999], [1], [], [,i])), [0]))
   1878 m4_list_cmp([0], [0m4_for([i], [1], [10000], [], [,0])])
   1879 m4_list_cmp([0m4_for([i], [1], [10000], [], [,0])], [0])
   1880 m4_for([i], [1], [10000], [], [m4_define(i)])dnl
   1881 m4_undefine(1m4_for([i], [2], [10000], [], [,i]))dnl
   1882 m4_bpatsubsts([a1]m4_for([i], [1], [10000], [], [,i]), [a2], [A])
   1883 m4_bmatch([9997]m4_for([i], [1], [10000], [], [,^i$]))
   1884 m4_define([up], [m4_define([$1], m4_incr($1))$1])m4_define([j], 0)dnl
   1885 m4_cond(m4_for([i], [1], [10000], [], [[up([j])], [9990], i,]) [oops]) j
   1886 m4_count(m4_map_args_pair([,m4_quote], []m4_map_args([,m4_echo]m4_for([i],
   1887   [1], [10000], [], [,i]))))
   1888 m4_divert_pop([])
   1889 ]])
   1890 
   1891 AT_CHECK_M4SUGAR([-o-], [0], [[48894
   1892 9999,10000
   1893 78896
   1894 58894
   1895 10000
   1896 end
   1897 0
   1898 0
   1899 0
   1900 A
   1901 ^9998$
   1902 9990 9990
   1903 5001
   1904 ]])
   1905 
   1906 AT_DATA_M4SUGAR([script.4s],
   1907 [[m4_ifdef([__m4_version__],
   1908 [m4_undefine([__m4_version__])],
   1909 [m4_divert_push([])48894
   1910 9999,10000
   1911 78896
   1912 58894
   1913 10000
   1914 end
   1915 0
   1916 0
   1917 0
   1918 A
   1919 ^9998$
   1920 9990 9990
   1921 5001
   1922 m4_exit([0])])
   1923 m4_init
   1924 m4_divert_push([])[]dnl
   1925 m4_len(m4_foreach_w([j], m4_do(m4_for([i], [1], [10000], [], [,i ])), [j ]))
   1926 m4_shiftn(9998m4_for([i], [1], [10000], [], [,i]))
   1927 m4_len(m4_join([--],, m4_dquote_elt(m4_for([i], [1], [10000], [], [,i])),))
   1928 m4_len(m4_joinall([--], m4_map([, m4_echo],
   1929   m4_dquote([1]m4_for([i], [2], [10000], [], [,i])))))
   1930 m4_max(m4_min([1]m4_for([i], [2], [10000], [],
   1931   [,i]))m4_for([i], [2], [10000], [], [,i]))
   1932 m4_case([10000]m4_for([i], [1], [10000], [], [,i]),[end])
   1933 m4_list_cmp(m4_dquote(1m4_for([i], [2], [10000], [], [,i])),
   1934   m4_dquote(m4_reverse(10000m4_for([i], [9999], [1], [], [,i])), [0]))
   1935 m4_list_cmp([0], [0m4_for([i], [1], [10000], [], [,0])])
   1936 m4_list_cmp([0m4_for([i], [1], [10000], [], [,0])], [0])
   1937 m4_for([i], [1], [10000], [], [m4_define(i)])dnl
   1938 m4_undefine(1m4_for([i], [2], [10000], [], [,i]))dnl
   1939 m4_bpatsubsts([a1]m4_for([i], [1], [10000], [], [,i]), [a2], [A])
   1940 m4_bmatch([9997]m4_for([i], [1], [10000], [], [,^i$]))
   1941 m4_define([up], [m4_define([$1], m4_incr($1))$1])m4_define([j], 0)dnl
   1942 m4_cond(m4_for([i], [1], [10000], [], [[up([j])], [9990], i,]) [oops]) j
   1943 m4_count(m4_map_args_pair([,m4_quote], []m4_map_args([,m4_echo]m4_for([i],
   1944   [1], [10000], [], [,i]))))
   1945 m4_divert_pop([])
   1946 ]])
   1947 
   1948 AT_CHECK_M4SUGAR([-o-], [0], [[48894
   1949 9999,10000
   1950 78896
   1951 58894
   1952 10000
   1953 end
   1954 0
   1955 0
   1956 0
   1957 A
   1958 ^9998$
   1959 9990 9990
   1960 5001
   1961 ]])
   1962 
   1963 AT_CLEANUP
   1964 
   1965 
   1966 ## ---------- ##
   1967 ## m4_set_*.  ##
   1968 ## ---------- ##
   1969 
   1970 AT_SETUP([m4@&t@_set])
   1971 
   1972 AT_KEYWORDS([m4@&t@_set_add m4@&t@_set_add_all m4@&t@_set_contains
   1973 m4@&t@_set_contents m4@&t@_set_delete m4@&t@_set_difference m4@&t@_set_dump
   1974 m4@&t@_set_empty m4@&t@_set_foreach m4@&t@_set_intersection m4@&t@_set_list
   1975 m4@&t@_set_listc m4@&t@_set_map m4@&t@_set_remove m4@&t@_set_size
   1976 m4@&t@_set_union])
   1977 
   1978 # Simple tests
   1979 AT_CHECK_M4SUGAR_TEXT([[m4_set_contains([a], [1], [yes], [no])
   1980 m4_set_add([a], [1], [added], [dup])
   1981 m4_set_contains([a], [1], [yes], [no])
   1982 m4_set_add([a], [1], [added], [dup])
   1983 m4_set_contents([a])
   1984 m4_set_remove([a], [1], [removed], [missing])
   1985 m4_set_contains([a], [1], [yes], [no])
   1986 m4_set_remove([a], [1], [removed], [missing])
   1987 m4_set_add([a], [2], [added], [dup])
   1988 m4_set_empty([a], [yes], [no])
   1989 m4_set_delete([a])
   1990 m4_set_empty([a], [yes], [no])
   1991 m4_set_add_all([c], [1], [2], [3])
   1992 m4_set_add_all([a]m4_set_listc([c]))
   1993 m4_set_contents([c], [-])
   1994 m4_set_dump([a], [-])
   1995 m4_set_contents([a])
   1996 m4_set_add_all([a], [1], [2], [3])m4_set_add_all([b], [3], [], [4])
   1997 m4_set_difference([a], [b])
   1998 m4_set_difference([b], [a])
   1999 m4_set_intersection([a], [b])
   2000 m4_set_union([a], [b])
   2001 m4_define([printodd], [m4_if(m4_eval([$1 & 1]), [1], [:$1])])dnl
   2002 m4_set_map([a], [printodd])
   2003 m4_set_foreach([a], [i], [m4_if(m4_eval(i & 1), [1], [m4_set_remove([a], i)])])
   2004 m4_set_list([a])
   2005 m4_set_add([a], [])
   2006 m4_set_list([a])
   2007 m4_set_remove([a], [2])
   2008 m4_dquote(m4_set_list([a]))
   2009 m4_set_listc([a])
   2010 m4_set_size([a])
   2011 m4_set_delete([a])
   2012 m4_dquote(m4_set_list([a]))
   2013 m4_indir([m4_dquote]m4_set_listc([a]))
   2014 m4_set_listc([a])
   2015 m4_set_size([a])
   2016 ]], [[no
   2017 added
   2018 yes
   2019 dup
   2020 1
   2021 removed
   2022 no
   2023 missing
   2024 added
   2025 no
   2026 
   2027 yes
   2028 
   2029 
   2030 1-2-3
   2031 3-2-1
   2032 
   2033 
   2034 ,1,2
   2035 ,,4
   2036 ,3
   2037 ,1,2,3,,4
   2038 :1:3
   2039 
   2040 2
   2041 
   2042 2,
   2043 
   2044 []
   2045 ,
   2046 1
   2047 
   2048 []
   2049 
   2050 
   2051 0
   2052 ]])
   2053 
   2054 # Stress tests - check for unusual names/values
   2055 AT_CHECK_M4SUGAR_TEXT([[m4_define([a], [oops])dnl
   2056 m4_set_add([a], [a])dnl
   2057 m4_set_remove([a], [oops], [yes], [no])
   2058 m4_set_add([a,b], [c])dnl
   2059 m4_set_add([a,b], [$*[]])dnl
   2060 m4_set_add_all([a], [b,c])dnl
   2061 m4_set_size([a])
   2062 m4_count(m4_set_contents([a], [,]))
   2063 m4_count(m4_set_list([a], [,]))
   2064 m4_set_dump([a], [,])
   2065 m4_set_contents([a,b], [,])
   2066 m4_set_list([a,b])
   2067 m4_set_foreach([$*[]], [$*[]], [oops])
   2068 m4_set_add([$*[]], [])dnl
   2069 m4_set_remove([$*[]], [a], [yes], [no])
   2070 m4_set_add([$*[]], [a])dnl
   2071 m4_set_foreach([$*[]], [$*[]], [-m4_defn([$*[]])m4_indir([$*[]])-])
   2072 m4_set_remove([$*[]], [], [yes], [no])
   2073 m4_set_add([c], [,])dnl
   2074 m4_set_foreach([a,b], [set], [:m4_set_listc(_m4_defn([set])):])
   2075 ]],[[no
   2076 2
   2077 1
   2078 2
   2079 b,c,a
   2080 c,$*[]
   2081 c,$*[]
   2082 
   2083 no
   2084 ---aoops-
   2085 yes
   2086 :,,::,a:
   2087 ]])
   2088 
   2089 # Stress tests - check for linear scaling (won't necessarily fail if
   2090 # quadratic, but hopefully users will complain if it appears to hang)
   2091 AT_CHECK_M4SUGAR_TEXT([[dnl
   2092 m4_for([i], [1], [10000], [], [m4_set_add([a], i)])dnl
   2093 m4_set_add_all([b]m4_for([i], [1], [10000], [], [,i]))dnl
   2094 m4_set_remove([a], [1])dnl
   2095 m4_set_remove([b], [10000])dnl
   2096 m4_set_add_all([a]m4_for([i], [1], [10000], [], [,i]))dnl
   2097 m4_for([i], [1], [10000], [], [m4_set_add([b], i)])dnl
   2098 m4_len(m4_set_contents([a]))
   2099 m4_len(m4_set_foreach([b], [b], [m4_if(m4_eval(b & 1), [1],
   2100   [m4_set_remove([b], b, [-])])]))
   2101 m4_set_size([b])
   2102 m4_define([prune3x], [m4_if(m4_eval([$1 % 3]), [0],
   2103   [m4_set_remove([a], [$1], [-])])])dnl
   2104 m4_len(m4_set_map([a], [prune3x]))
   2105 m4_count(m4_shift(m4_set_intersection([a], [b])))
   2106 ]], [[38894
   2107 5000
   2108 5000
   2109 3333
   2110 3334
   2111 ]])
   2112 
   2113 AT_CLEANUP
   2114 
   2115 
   2116 ## ---------------------- ##
   2117 ## __file__ and __line__. ##
   2118 ## ---------------------- ##
   2119 
   2120 AT_SETUP([[__file__ and __line__]])
   2121 
   2122 # Check that __file__ and __line__ work.
   2123 # Check that m4__file__ and m4__line__ are not defined
   2124 # (and get them to pass by the undefined-macro check).
   2125 # Try to not assume too much about AT_CHECK_M4SUGAR_TEXT.
   2126 AT_CHECK_M4SUGAR_TEXT([[dnl
   2127 m4_pattern_allow([m4__file__])dnl
   2128 m4_pattern_allow([m4__line__])dnl
   2129 m4__file__
   2130 m4__line__
   2131 __file__
   2132 m4_define([first], __line__)dnl
   2133 m4_define([second], __line__)dnl
   2134 m4_assert(first + 1 == second)dnl
   2135 ]], [[m4@&t@__@&t@file__
   2136 m4@&t@__@&t@line__
   2137 script.4s
   2138 ]])
   2139 
   2140 AT_CLEANUP
   2141