]> git.ipfire.org Git - thirdparty/autoconf.git/commitdiff
Fix off-by-one bug in _m4_shiftn.
authorEric Blake <ebb9@byu.net>
Thu, 28 Aug 2008 02:30:25 +0000 (20:30 -0600)
committerEric Blake <ebb9@byu.net>
Thu, 28 Aug 2008 02:30:25 +0000 (20:30 -0600)
* lib/m4sugar/foreach.m4 (_m4_shiftn): Handle case when shifting
all arguments.
* tests/m4sugar.at (M4 loops): Test it.
Reported by Akim Demaille.

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

index 0aa373cd02988f6dcf385f0de38bb26d6ccd4cf5..d627af0555a51c5c6dd38ac93c0efbf43e4f31f1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-08-27  Eric Blake  <ebb9@byu.net>
+
+       Fix off-by-one bug in _m4_shiftn.
+       * lib/m4sugar/foreach.m4 (_m4_shiftn): Handle case when shifting
+       all arguments.
+       * tests/m4sugar.at (M4 loops): Test it.
+       Reported by Akim Demaille.
+
 2008-08-26  Eric Blake  <ebb9@byu.net>
 
        Improve INSTALL formatting.
index 80f333d68ed35341763d67fc6f1860ccdb19b90f..bfad3011e3a68dfea8a6a889d098ee021facad60 100644 (file)
@@ -215,9 +215,9 @@ m4_bpatsubst(m4_dquote(_m4_defn([_m4_p])), [$$1], [$$2]))]])
 #   ,[$5],[$6],...,[$m]_m4_popdef([_m4_s])
 # before calling m4_shift(_m4_s($@)).
 m4_define([_m4_shiftn],
-[m4_define([_m4_s],
+[m4_if(m4_incr([$1]), [$#], [], [m4_define([_m4_s],
           m4_pushdef([_m4_s])_m4_for([_m4_s], m4_eval([$1 + 2]), [$#], [1],
-  [[,]m4_dquote([$]_m4_s)])[_m4_popdef([_m4_s])])m4_shift(_m4_s($@))])
+  [[,]m4_dquote([$]_m4_s)])[_m4_popdef([_m4_s])])m4_shift(_m4_s($@))])])
 
 # m4_do(STRING, ...)
 # ------------------
index 75c505729017055eeaaf9127131620fc89d64641..89109c612ed4cb6faa387c58b6491353143f16d4 100644 (file)
@@ -698,6 +698,9 @@ g], [ myvar|])
 myvar
 dnl only one side effect expansion, prior to visiting list elements
 m4_foreach([i], [[1], [2], [3]m4_errprintn([hi])], [m4_errprintn(i)])dnl
+dnl shifting forms an important part of loops
+m4_shift3:m4_shift3(1,2,3):m4_shift3(1,2,3,4)
+m4_shiftn(3,1,2,3):m4_shiftn(3,1,2,3,4)
 ]],
 [[ 1 2 3
  1 2 3
@@ -731,18 +734,20 @@ m4_foreach([i], [[1], [2], [3]m4_errprintn([hi])], [m4_errprintn(i)])dnl
 | f|
  a| b| c,| d,e| f| g|
 outer value
+::4
+:4
 ]], [[hi
 1
 2
 3
 ]])
 
+dnl bounds checking in m4_for
 AT_DATA_M4SUGAR([script.4s],
 [[m4_init
 m4_divert([0])dnl
 m4_for([myvar], 1, 3,-1, [ myvar])
 ]])
-
 AT_CHECK_M4SUGAR([], 1, [],
 [[script.4s:3: error: assert failed: -1 > 0
 script.4s:3: the top level
@@ -754,7 +759,6 @@ AT_DATA_M4SUGAR([script.4s],
 m4_divert([0])dnl
 m4_for([myvar], 1, 2, 0, [ myvar])
 ]])
-
 AT_CHECK_M4SUGAR([], 1, [],
 [[script.4s:3: error: assert failed: 0 > 0
 script.4s:3: the top level
@@ -766,13 +770,24 @@ AT_DATA_M4SUGAR([script.4s],
 m4_divert([0])dnl
 m4_for([myvar], 2, 1, 0, [ myvar])
 ]])
-
 AT_CHECK_M4SUGAR([], 1, [],
 [[script.4s:3: error: assert failed: 0 < 0
 script.4s:3: the top level
 autom4te: m4 failed with exit status: 1
 ]])
 
+dnl m4_shiftn also does bounds checking
+AT_DATA_M4SUGAR([script.4s],
+[[m4_init
+m4_divert([0])dnl
+m4_shiftn(3,1,2)
+]])
+AT_CHECK_M4SUGAR([], 1, [],
+[[script.4s:3: error: assert failed: 0 < 3 && 3 < 3
+script.4s:3: the top level
+autom4te: m4 failed with exit status: 1
+]])
+
 AT_CLEANUP