]> git.ipfire.org Git - thirdparty/autoconf.git/commitdiff
Allow nameless iteration.
authorEric Blake <ebb9@byu.net>
Sun, 30 Sep 2007 12:27:46 +0000 (06:27 -0600)
committerEric Blake <ebb9@byu.net>
Sun, 30 Sep 2007 12:45:33 +0000 (06:45 -0600)
* lib/m4sugar/m4sugar.m4 (m4_for, _m4_for): Access variable
indirectly.
* tests/m4sugar.at (myvar): Test this.

Signed-off-by: Eric Blake <ebb9@byu.net>
ChangeLog
lib/m4sugar/m4sugar.m4
tests/m4sugar.at

index 69d2053da73e8ce93143392e2a900c7042063101..cfe81ea9ea995a2b5dfbd5fa40aacf4818cefdc9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2007-09-30  Eric Blake  <ebb9@byu.net>
+
+       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  <ebb9@byu.net>
 
        Speed optimization: avoid m4 regex when other algorithms work.
index 8fea73671fbe55495a762634d3b2cdeeebe2c1e7..bd3fb17bea5ad3c1239f1011a2eb422dbaed6a04 100644 (file)
@@ -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
index 6f3da587d87eabc9740171d5c2d4912a2f7c328a..5aff0c9dbee69146629742c3ef9518b6e697e223 100644 (file)
@@ -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|