From: Eric Blake Date: Thu, 28 Aug 2008 02:30:25 +0000 (-0600) Subject: Fix off-by-one bug in _m4_shiftn. X-Git-Tag: v2.63~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d0098d52bcde4a46ed187145e21dccd362f638fc;p=thirdparty%2Fautoconf.git 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. Signed-off-by: Eric Blake --- diff --git a/ChangeLog b/ChangeLog index 0aa373cd0..d627af055 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-08-27 Eric Blake + + 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 Improve INSTALL formatting. diff --git a/lib/m4sugar/foreach.m4 b/lib/m4sugar/foreach.m4 index 80f333d68..bfad3011e 100644 --- a/lib/m4sugar/foreach.m4 +++ b/lib/m4sugar/foreach.m4 @@ -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, ...) # ------------------ diff --git a/tests/m4sugar.at b/tests/m4sugar.at index 75c505729..89109c612 100644 --- a/tests/m4sugar.at +++ b/tests/m4sugar.at @@ -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