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