From: Eric Blake Date: Sun, 30 Sep 2007 12:27:46 +0000 (-0600) Subject: Allow nameless iteration. X-Git-Tag: v2.62~244 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=615300a1d5e4a7bb89df2d40b8acf2ede38142d0;p=thirdparty%2Fautoconf.git Allow nameless iteration. * lib/m4sugar/m4sugar.m4 (m4_for, _m4_for): Access variable indirectly. * tests/m4sugar.at (myvar): Test this. Signed-off-by: Eric Blake --- diff --git a/ChangeLog b/ChangeLog index 69d2053d..cfe81ea9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2007-09-30 Eric Blake + + Allow nameless iteration. + * lib/m4sugar/m4sugar.m4 (m4_for, _m4_for): Access variable + indirectly. + * tests/m4sugar.at (myvar): Test this. + 2007-09-29 Eric Blake Speed optimization: avoid m4 regex when other algorithms work. diff --git a/lib/m4sugar/m4sugar.m4 b/lib/m4sugar/m4sugar.m4 index 8fea7367..bd3fb17b 100644 --- a/lib/m4sugar/m4sugar.m4 +++ b/lib/m4sugar/m4sugar.m4 @@ -580,16 +580,21 @@ m4_builtin([undefine], $@)]) # -------------------------------------------------------- # Expand EXPRESSION defining VARIABLE to FROM, FROM + 1, ..., TO. # Both limits are included, and bounds are checked for consistency. +# The algorithm is robust to indirect VARIABLE names. m4_define([m4_for], [m4_pushdef([$1], m4_eval([$2]))dnl -m4_if(m4_eval(([$3]) > $1), 1, +m4_if(m4_eval(([$3]) > m4_defn([$1])), 1, [m4_pushdef([_m4_step], m4_eval(m4_default([$4], 1)))dnl m4_assert(_m4_step > 0)dnl -_m4_for([$1], m4_eval((([$3]) - $1) / _m4_step * _m4_step + $1), _m4_step, [$5])], - m4_eval(([$3]) < $1), 1, +_m4_for([$1], m4_eval((([$3]) - m4_defn([$1])) + / _m4_step * _m4_step + m4_defn([$1])), + _m4_step, [$5])], + m4_eval(([$3]) < m4_defn([$1])), 1, [m4_pushdef([_m4_step], m4_eval(m4_default([$4], -1)))dnl m4_assert(_m4_step < 0)dnl -_m4_for([$1], m4_eval(($1 - ([$3])) / -(_m4_step) * _m4_step + $1), _m4_step, [$5])], +_m4_for([$1], m4_eval((m4_defn([$1]) - ([$3])) + / -(_m4_step) * _m4_step + m4_defn([$1])), + _m4_step, [$5])], [m4_pushdef(_m4_step,[])dnl $5])[]dnl m4_popdef([_m4_step])dnl @@ -601,8 +606,8 @@ m4_popdef([$1])]) # Core of the loop, no consistency checks, all arguments are plain numbers. m4_define([_m4_for], [$4[]dnl -m4_if($1, [$2], [], - [m4_define([$1], m4_eval($1+[$3]))_m4_for([$1], [$2], [$3], [$4])])]) +m4_if(m4_defn([$1]), [$2], [], + [m4_define([$1], m4_eval(m4_defn([$1])+[$3]))$0($@)])]) # Implementing `foreach' loops in m4 is much more tricky than it may diff --git a/tests/m4sugar.at b/tests/m4sugar.at index 6f3da587..5aff0c9d 100644 --- a/tests/m4sugar.at +++ b/tests/m4sugar.at @@ -281,6 +281,9 @@ m4_for([myvar], -2+8, 3-5, , [ myvar]) m4_for([myvar], 8, 16, 3 * 2, [ myvar]) m4_for([myvar], 8, 16, -3 * -2, [ myvar]) m4_for([myvar], [2<<2], [2<<3], [-3 * (-2)], [ myvar]) +dnl Make sure we can do nameless iteration +m4_for(, 1, 10, , -) +dnl foreach tests m4_foreach([myvar], [[a], [b, c], [d], [e ],[f]], [ myvar|]) m4_foreach_w([myvar], [a b c, d,e f @@ -313,6 +316,7 @@ myvar 8 14 8 14 8 14 +---------- a| b, c| d| e | f| a| b| c,| d,e| f| g|