This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GNU M4 source repository".
http://git.sv.gnu.org/gitweb/?p=m4.git;a=commitdiff;h=06991b51ef43dcbafa3d878b2beefd1dcc00adc0 The branch, master has been updated via 06991b51ef43dcbafa3d878b2beefd1dcc00adc0 (commit) from 5d083e4726ed578b093aaf82e2a5a542f5815dcd (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 06991b51ef43dcbafa3d878b2beefd1dcc00adc0 Author: Eric Blake <[EMAIL PROTECTED]> Date: Sat Feb 16 14:39:41 2008 -0700 Add regression test for multi-character quote recursion. * examples/foreach2.m4: Use $0 rather than spelling out name. * examples/foreachq2.m4: Likewise. * examples/forloop2.m4: Likewise. * examples/hanoi.m4: Likewise. * examples/trace.m4: Likewise. * doc/m4.texinfo (Improved forloop): Document advantage of $0. (Improved foreach): Adjust dump from file. Signed-off-by: Eric Blake <[EMAIL PROTECTED]> ----------------------------------------------------------------------- Summary of changes: ChangeLog | 9 +++++++++ doc/m4.texinfo | 48 +++++++++++++++++++++++++++++++++++++++++++++--- examples/foreach2.m4 | 2 +- examples/foreachq2.m4 | 2 +- examples/forloop2.m4 | 2 +- examples/hanoi.m4 | 4 ++-- examples/trace.m4 | 4 ++-- 7 files changed, 61 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index d0ba987..6a89c56 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2008-02-16 Eric Blake <[EMAIL PROTECTED]> + Add regression test for multi-character quote recursion. + * examples/foreach2.m4: Use $0 rather than spelling out name. + * examples/foreachq2.m4: Likewise. + * examples/forloop2.m4: Likewise. + * examples/hanoi.m4: Likewise. + * examples/trace.m4: Likewise. + * doc/m4.texinfo (Improved forloop): Document advantage of $0. + (Improved foreach): Adjust dump from file. + Stage 15: return argv refs back to collect_arguments. Collect an entire $@ reference at once rather than one argument at a time, outside of quotes (but inside quotes, $@ is still diff --git a/doc/m4.texinfo b/doc/m4.texinfo index c313984..571c0dc 100644 --- a/doc/m4.texinfo +++ b/doc/m4.texinfo @@ -8256,7 +8256,7 @@ undivert(`forloop2.m4')dnl @result{}# performs sanity check that FROM is larger than TO @result{}# allows complex numerical expressions in TO and FROM @result{}define(`forloop', `ifelse(eval(`($3) >= ($2)'), `1', [EMAIL PROTECTED] `pushdef(`$1', eval(`$2'))_forloop(`$1', [EMAIL PROTECTED] `pushdef(`$1', eval(`$2'))_$0(`$1', @result{} eval(`$3'), `$4')popdef(`$1')')') @result{}define(`_forloop', @result{} `$3`'ifelse(indir(`$1'), `$2', `', @@ -8275,6 +8275,48 @@ forloop(`i', `a', `b', `non-numeric bounds') @result{} @end example +One other change to notice is that the improved version used @samp{_$0} +rather than @samp{_foreach} to invoke the helper routine. In general, +this is a good practice to follow, because then the set of macros can be +uniformly transformed. The following example shows a transformation +that doubles the current quoting and appends a suffix @samp{2} to each +transformed macro. If @code{foreach} refers to the literal [EMAIL PROTECTED], then @code{foreach2} invokes @code{_foreach} instead of +the intended @code{_foreach2}, and the mixing of quoting paradigms leads +to an infinite recursion loop in this example. + [EMAIL PROTECTED] options: -L9 [EMAIL PROTECTED] status: 1 [EMAIL PROTECTED] examples [EMAIL PROTECTED] +$ @kbd{m4 -d -L 9 -I examples} +define(`arg1', `$1')include(`forloop2.m4')include(`quote.m4') [EMAIL PROTECTED] +define(`double', `define(`$1'`2', + arg1(patsubst(dquote(defn(`$1')), `[`']', `\&\&')))') [EMAIL PROTECTED] +double(`forloop')double(`_forloop')defn(`forloop2') [EMAIL PROTECTED](eval(``($3) >= ($2)''), ``1'', [EMAIL PROTECTED] ``pushdef(``$1'', eval(``$2''))_$0(``$1'', [EMAIL PROTECTED] eval(``$3''), ``$4'')popdef(``$1'')'') +forloop(i, 1, 5, `ifelse(')forloop(i, 1, 5, `)') [EMAIL PROTECTED] +changequote(`[', `]')changequote([``], ['']) [EMAIL PROTECTED] +forloop2(i, 1, 5, ``ifelse('')forloop2(i, 1, 5, ``)'') [EMAIL PROTECTED] +changequote`'include(`forloop.m4') [EMAIL PROTECTED] +double(`forloop')double(`_forloop')defn(`forloop2') [EMAIL PROTECTED](``$1'', ``$2'')_forloop($@@)popdef(``$1'') +forloop(i, 1, 5, `ifelse(')forloop(i, 1, 5, `)') [EMAIL PROTECTED] +changequote(`[', `]')changequote([``], ['']) [EMAIL PROTECTED] +forloop2(i, 1, 5, ``ifelse('')forloop2(i, 1, 5, ``)'') [EMAIL PROTECTED]:stdin:12: recursion limit of 9 exceeded, use -L<N> to change it [EMAIL PROTECTED] example + Of course, it is possible to make even more improvements, such as adding an optional step argument, or allowing iteration through descending sequences. @acronym{GNU} Autoconf provides some of these @@ -8339,7 +8381,7 @@ undivert(`foreachq2.m4')dnl @result{}divert(`-1') @result{}# foreachq(x, `item_1, item_2, ..., item_n', stmt) @result{}# quoted list, improved version [EMAIL PROTECTED](`foreachq', `pushdef(`$1')_foreachq($@@)popdef(`$1')') [EMAIL PROTECTED](`foreachq', `pushdef(`$1')_$0($@@)popdef(`$1')') @result{}define(`_arg1q', ``$1'') @result{}define(`_rest', `ifelse(`$#', `1', `', `dquote(shift($@@))')') @result{}define(`_foreachq', `ifelse(`$2', `', `', @@ -8436,7 +8478,7 @@ undivert(`foreach2.m4')dnl @result{}divert(`-1') @result{}# foreach(x, (item_1, item_2, ..., item_n), stmt) @result{}# parenthesized list, improved version [EMAIL PROTECTED](`foreach', `pushdef(`$1')_foreach(`$1', [EMAIL PROTECTED](`foreach', `pushdef(`$1')_$0(`$1', @result{} (dquote(dquote_elt$2)), `$3')popdef(`$1')') @result{}define(`_arg1', `$1') @result{}define(`_foreach', `ifelse(`$2', `(`')', `', diff --git a/examples/foreach2.m4 b/examples/foreach2.m4 index 4acf0c2..74d00fb 100644 --- a/examples/foreach2.m4 +++ b/examples/foreach2.m4 @@ -2,7 +2,7 @@ include(`quote.m4')dnl divert(`-1') # foreach(x, (item_1, item_2, ..., item_n), stmt) # parenthesized list, improved version -define(`foreach', `pushdef(`$1')_foreach(`$1', +define(`foreach', `pushdef(`$1')_$0(`$1', (dquote(dquote_elt$2)), `$3')popdef(`$1')') define(`_arg1', `$1') define(`_foreach', `ifelse(`$2', `(`')', `', diff --git a/examples/foreachq2.m4 b/examples/foreachq2.m4 index 345ddfe..f57d3ed 100644 --- a/examples/foreachq2.m4 +++ b/examples/foreachq2.m4 @@ -2,7 +2,7 @@ include(`quote.m4')dnl divert(`-1') # foreachq(x, `item_1, item_2, ..., item_n', stmt) # quoted list, improved version -define(`foreachq', `pushdef(`$1')_foreachq($@)popdef(`$1')') +define(`foreachq', `pushdef(`$1')_$0($@)popdef(`$1')') define(`_arg1q', ``$1'') define(`_rest', `ifelse(`$#', `1', `', `dquote(shift($@))')') define(`_foreachq', `ifelse(`$2', `', `', diff --git a/examples/forloop2.m4 b/examples/forloop2.m4 index f1bdf0e..41e0e16 100644 --- a/examples/forloop2.m4 +++ b/examples/forloop2.m4 @@ -4,7 +4,7 @@ divert(`-1') # performs sanity check that FROM is larger than TO # allows complex numerical expressions in TO and FROM define(`forloop', `ifelse(eval(`($3) >= ($2)'), `1', - `pushdef(`$1', eval(`$2'))_forloop(`$1', + `pushdef(`$1', eval(`$2'))_$0(`$1', eval(`$3'), `$4')popdef(`$1')')') define(`_forloop', `$3`'ifelse(indir(`$1'), `$2', `', diff --git a/examples/hanoi.m4 b/examples/hanoi.m4 index c4a7c14..32fd8a4 100644 --- a/examples/hanoi.m4 +++ b/examples/hanoi.m4 @@ -6,10 +6,10 @@ define(`move', `Move one disk from `$1' to `$2'. # _hanoi (cnt, from, to, aux) define(`_hanoi', `ifelse(eval(`$1'<=1), 1, `move($2, $3)', -`_hanoi(decr($1), $2, $4, $3)move($2, $3)_hanoi(decr($1), $4, $3, $2)')') +`$0(decr($1), $2, $4, $3)move($2, $3)$0(decr($1), $4, $3, $2)')') # hanoi (cnt) -define(`hanoi', `_hanoi(`$1', source, destination, auxilliary)') +define(`hanoi', `_$0(`$1', source, destination, auxilliary)') # traceon(`move', `_hanoi', `decr') divert`'dnl diff --git a/examples/trace.m4 b/examples/trace.m4 index a79dbcd..92ce981 100644 --- a/examples/trace.m4 +++ b/examples/trace.m4 @@ -6,10 +6,10 @@ define(`move', `Move one disk from `$1' to `$2'. # _hanoi (cnt, from, to, aux) define(`_hanoi', `ifelse(eval(`$1'<=1), 1, `move($2, $3)', -`_hanoi(decr($1), $2, $4, $3)move($2, $3)_hanoi(decr($1), $4, $3, $2)')') +`$0(decr($1), $2, $4, $3)move($2, $3)$0(decr($1), $4, $3, $2)')') # hanoi (cnt) -define(`hanoi', `_hanoi(`$1', source, destination, auxilliary)') +define(`hanoi', `_$0(`$1', source, destination, auxilliary)') divert`'dnl # Debugmode t hooks/post-receive -- GNU M4 source repository
