From: Eric Blake Date: Fri, 18 Jul 2008 20:26:41 +0000 (-0600) Subject: Support multiple arguments to m4_defn, m4_popdef, and m4_undefine. X-Git-Tag: v2.63~55 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=36d8106f6dadede2d202cc1a71cb7dbbd7924fc9;p=thirdparty%2Fautoconf.git Support multiple arguments to m4_defn, m4_popdef, and m4_undefine. * lib/m4sugar/m4sugar.m4 (m4_defn, m4_popdef, m4_undefine): Loop through all variables, per POSIX and newer m4. (_m4_text_wrap): Exploit the looping capabilities. * tests/m4sugar.at (m4@&t@_defn): Test this. * NEWS: Document it. * doc/autoconf.texi (Redefined M4 Macros) : Likewise. Signed-off-by: Eric Blake --- diff --git a/ChangeLog b/ChangeLog index 974c025ec..47c73b7f2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2008-07-19 Eric Blake + Support multiple arguments to m4_defn, m4_popdef, and m4_undefine. + * lib/m4sugar/m4sugar.m4 (m4_defn, m4_popdef, m4_undefine): Loop + through all variables, per POSIX and newer m4. + (_m4_text_wrap): Exploit the looping capabilities. + * tests/m4sugar.at (m4@&t@_defn): Test this. + * NEWS: Document it. + * doc/autoconf.texi (Redefined M4 Macros) + : Likewise. + Reduce overhead of m4_builtin([defn]). * lib/m4sugar/m4sugar.m4 (_m4_defn, _m4_popdef, _m4_undefine): New internal macros, which are slightly more efficient than diff --git a/NEWS b/NEWS index d3fb23b9c..232ec8616 100644 --- a/NEWS +++ b/NEWS @@ -22,6 +22,10 @@ GNU Autoconf NEWS - User visible changes. ** The following m4sugar macros are new: m4_joinall +** The following m4sugar macros now accept multiple arguments, as is the + case with underlying m4: + m4_defn m4_popdef m4_undefine + ** AT_KEYWORDS once again performs expansion on its argument, such that AT_KEYWORDS([m4_if([$1], [], [default])]) no longer complains about the possibly unexpanded m4_if [regression introduced in 2.62]. diff --git a/doc/autoconf.texi b/doc/autoconf.texi index 4e8638d34..efb654043 100644 --- a/doc/autoconf.texi +++ b/doc/autoconf.texi @@ -10323,12 +10323,14 @@ is kept for future versions of M4sugar, once @acronym{GNU} M4 2.0 is released and supports extended regular expression syntax. @end defmac -@defmac m4_defn (@var{macro}) +@defmac m4_defn (@var{macro}@dots{}) @msindex{defn} -Unlike the M4 builtin, this macro fails if @var{macro} is not -defined. Also, while newer M4 can concatenate multiple definitions, -this version currently only supports a single @var{macro}. See -@code{m4_undefine}. +This macro fails if @var{macro} is not defined, even when using older +versions of M4 that did not warn. See @code{m4_undefine}. +Unfortunately, in order to support these older versions of M4, there are +some situations involving unbalanced quotes where concatenating multiple +macros together will work in newer M4 but not in m4sugar; use +quadrigraphs to work around this. @end defmac @defmac m4_divert (@var{diversion}) @@ -10380,26 +10382,23 @@ and both have the secure semantics regardless of which macro the underlying M4 provides. @end defmac -@defmac m4_popdef (@var{macro}) +@defmac m4_popdef (@var{macro}@dots{}) @msindex{popdef} -Unlike the M4 builtin, this macro fails if @var{macro} is not -defined. Also, while newer M4 can pop multiple definitions at once, -this version currently only supports a single @var{macro}. See -@code{m4_undefine}. +This macro fails if @var{macro} is not defined, even when using older +versions of M4 that did not warn. See @code{m4_undefine}. @end defmac -@defmac m4_undefine (@var{macro}) +@defmac m4_undefine (@var{macro}@dots{}) @msindex{undefine} -Unlike the M4 builtin, this macro fails if @var{macro} is not -defined. Also, while newer M4 can undefine multiple definitions at -once, this version currently only supports a single @var{macro}. Use +This macro fails if @var{macro} is not defined, even when using older +versions of M4 that did not warn. Use @example m4_ifdef([@var{macro}], [m4_undefine([@var{macro}])]) @end example @noindent -to recover the behavior of the builtin. +if you are not sure whether @var{macro} is defined. @end defmac @defmac m4_undivert (@var{diversion}) diff --git a/lib/m4sugar/m4sugar.m4 b/lib/m4sugar/m4sugar.m4 index 347c123c5..5ef78366d 100644 --- a/lib/m4sugar/m4sugar.m4 +++ b/lib/m4sugar/m4sugar.m4 @@ -506,7 +506,11 @@ m4_define([m4_default], # m4_defn(NAME) # ------------- # Like the original, except guarantee a warning when using something which is -# undefined (unlike M4 1.4.x), and only support one argument. +# undefined (unlike M4 1.4.x). This replacement is not a full-featured +# replacement: if any of the defined macros contain unbalanced quoting, but +# when pasted together result in a well-quoted string, then only native m4 +# support is able to get it correct. But that's where quadrigraphs come in +# handy, if you really need unbalanced quotes inside your macros. # # This macro is called frequently, so minimize the amount of additional # expansions by skipping m4_ifndef. Better yet, if __m4_version__ exists, @@ -521,7 +525,7 @@ m4_ifdef([__m4_version__], [], [m4_define([m4_defn], [m4_ifdef([$1], [], [m4_fatal([$0: undefined macro: $1])])]dnl -[_m4_defn([$1])])]) +[_m4_defn([$1])m4_if([$#], [1], [], [$0(m4_shift($@))])])]) # _m4_dumpdefs_up(NAME) @@ -555,7 +559,7 @@ _m4_dumpdefs_down([$1])]) # m4_popdef(NAME) # --------------- # Like the original, except guarantee a warning when using something which is -# undefined (unlike M4 1.4.x), and only support one argument. +# undefined (unlike M4 1.4.x). # # This macro is called frequently, so minimize the amount of additional # expansions by skipping m4_ifndef. Better yet, if __m4_version__ exists, @@ -569,7 +573,7 @@ m4_ifdef([__m4_version__], [], [m4_define([m4_popdef], [m4_ifdef([$1], [], [m4_fatal([$0: undefined macro: $1])])]dnl -[_m4_popdef([$1])])]) +[_m4_popdef([$1])m4_if([$#], [1], [], [$0(m4_shift($@))])])]) # m4_shiftn(N, ...) @@ -619,7 +623,7 @@ m4_define([_m4_shift3], # m4_undefine(NAME) # ----------------- # Like the original, except guarantee a warning when using something which is -# undefined (unlike M4 1.4.x), and only support one argument. +# undefined (unlike M4 1.4.x). # # This macro is called frequently, so minimize the amount of additional # expansions by skipping m4_ifndef. Better yet, if __m4_version__ exists, @@ -633,7 +637,7 @@ m4_ifdef([__m4_version__], [], [m4_define([m4_undefine], [m4_ifdef([$1], [], [m4_fatal([$0: undefined macro: $1])])]dnl -[_m4_undefine([$1])])]) +[_m4_undefine([$1])m4_if([$#], [1], [], [$0(m4_shift($@))])])]) # _m4_wrap(PRE, POST) # ------------------- @@ -2067,9 +2071,7 @@ dnl either way, insert the word [$2]], [m4_Separator[]])_m4_defn([m4_Word])])]], dnl finally, clean up the local variabls -[[_m4_popdef([m4_Separator])]], -[[_m4_popdef([m4_Cursor])]], -[[_m4_popdef([m4_Indent])]])) +[[_m4_popdef([m4_Separator], [m4_Cursor], [m4_Indent])]])) # m4_text_box(MESSAGE, [FRAME-CHARACTER = `-']) diff --git a/tests/m4sugar.at b/tests/m4sugar.at index 650f5dcf0..9dd953a98 100644 --- a/tests/m4sugar.at +++ b/tests/m4sugar.at @@ -64,24 +64,30 @@ AT_KEYWORDS([m4@&t@_popdef m4@&t@_undefine]) # this is provided by m4 natively or faked by wrappers in m4sugar. AT_DATA_M4SUGAR([script.4s], -[[m4_defn([oops]) +[[m4_define([good]) +m4_defn([good], [oops]) ]]) AT_CHECK_M4SUGAR([-o-], 1, [], [stderr]) +AT_CHECK([grep good stderr], [1]) AT_CHECK([grep 'm4@&t@_defn: undefined.*oops' stderr], [0], [ignore]) AT_DATA_M4SUGAR([script.4s], -[[m4_popdef([oops]) +[[m4_define([good]) +m4_popdef([good], [oops]) ]]) AT_CHECK_M4SUGAR([-o-], 1, [], [stderr]) +AT_CHECK([grep good stderr], [1]) AT_CHECK([grep 'm4@&t@_popdef: undefined.*oops' stderr], [0], [ignore]) AT_DATA_M4SUGAR([script.4s], -[[m4_undefine([oops]) +[[m4_define([good]) +m4_undefine([good], [oops]) ]]) AT_CHECK_M4SUGAR([-o-], 1, [], [stderr]) +AT_CHECK([grep good stderr], [1]) AT_CHECK([grep 'm4@&t@_undefine: undefined.*oops' stderr], [0], [ignore]) AT_CLEANUP