From c7f3d4ef195d1cfac9c80e96e91c69da74da7199 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Fri, 17 Oct 2008 07:31:06 -0600 Subject: [PATCH] Test AS_VAR interfaces. * tests/m4sh.at (AS@&t@_VAR): New test. * lib/m4sugar/m4sh.m4 (AS_VAR_PUSHDEF): Force expansion of _AS_TR_SH_PREPARE at top level, rather than argument collection. (AS_TR_SH): Support command substitution. Signed-off-by: Eric Blake --- ChangeLog | 6 ++++ lib/m4sugar/m4sh.m4 | 12 +++++-- tests/m4sh.at | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 072e51ee..4a399d71 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2008-10-17 Eric Blake + Test AS_VAR interfaces. + * tests/m4sh.at (AS@&t@_VAR): New test. + * lib/m4sugar/m4sh.m4 (AS_VAR_PUSHDEF): Force expansion of + _AS_TR_SH_PREPARE at top level, rather than argument collection. + (AS_TR_SH): Support command substitution. + Add AS_VAR_COPY. * lib/m4sugar/m4sh.m4 (AS_VAR_COPY): New macro. (AS_VAR_IF): Use it, instead of the broken AS_VAR_GET. diff --git a/lib/m4sugar/m4sh.m4 b/lib/m4sugar/m4sh.m4 index 11555f3b..84b19b6c 100644 --- a/lib/m4sugar/m4sh.m4 +++ b/lib/m4sugar/m4sh.m4 @@ -1569,7 +1569,8 @@ AS_LITERAL_IF([$1], m4_dquote(m4_dquote(m4_defn([m4_cr_not_symbols2])))[[, [pp[]]]]dnl m4_dquote(m4_dquote(m4_for(,1,255,,[[_]])))[[)], - [`AS_ECHO(["$1"]) | $as_tr_sh`])]) + [`AS_ECHO(["m4_bpatsubst(m4_dquote(m4_expand([$1])), + [[\\`]], [\\\&])"]) | $as_tr_sh`])]) # _AS_TR_CPP_PREPARE @@ -1695,8 +1696,15 @@ m4_define([AS_VAR_POPDEF], # Define the m4 macro VARNAME to an accessor to the shell variable # named VALUE. VALUE does not need to be a valid shell variable name: # the transliteration is handled here. To be dnl'ed. +# +# AS_TR_SH attempts to play with diversions if _AS_TR_SH_PREPARE has +# not been expanded. However, users are expected to do subsequent +# calls that trigger AS_LITERAL_IF([VARNAME]), and that macro performs +# expansion inside an argument collection context, where diversions +# don't work. Therefore, we must require the preparation ourselves. m4_define([AS_VAR_PUSHDEF], -[AS_LITERAL_IF([$2], +[AS_REQUIRE([_AS_TR_SH_PREPARE])dnl +AS_LITERAL_IF([$2], [m4_pushdef([$1], [AS_TR_SH($2)])], [as_$1=AS_TR_SH($2) m4_pushdef([$1], [$as_[$1]])])]) diff --git a/tests/m4sh.at b/tests/m4sh.at index 4951fd92..5a5ebec7 100644 --- a/tests/m4sh.at +++ b/tests/m4sh.at @@ -884,6 +884,102 @@ ok 7 AT_CLEANUP +## ---------- ## +## AS_VAR_*. ## +## ---------- ## + +AT_SETUP([AS@&t@_VAR]) +AT_KEYWORDS([m4sh AS@&t@_VAR_COPY AS@&t@_VAR_SET AS@&t@_VAR_GET]) +AT_KEYWORDS([AS@&t@_VAR_TEST_SET AS@&t@_VAR_SET_IF AS@&t@_VAR_IF]) +AT_KEYWORDS([AS@&t@_VAR_PUSHDEF AS@&t@_VAR_POPDEF]) + +AT_DATA_M4SH([script.as], [[dnl +AS_INIT +# Literals. +dnl AS_VAR_SET_IF also covers AS_VAR_TEST_SET +AS_VAR_SET_IF([foo], [echo oops], [echo ok]) +AS_VAR_SET([foo], ['\a "weird" `value` with; $fun '\''characters +']) # 'font-lock +AS_VAR_COPY([bar], [foo]) +echo "$bar-" +echo "AS_VAR_GET([foo])-" +AS_VAR_SET_IF([foo], [echo ok], [echo oops]) +AS_VAR_IF([foo], [string], [echo oops], [echo ok]) +AS_VAR_PUSHDEF([tmp], [foo]) +AS_VAR_IF([tmp], ['\a "weird" `value` with; $fun '\''characters +'], [echo ok], [echo oops]) # 'font-lock +AS_VAR_POPDEF([tmp]) +m4_ifdef([tmp], [echo oops]) + +# Indirects via shell vars. +echo '====' +num=1 +AS_VAR_SET_IF([foo$num], [echo oops], [echo ok]) +AS_VAR_SET([foo$num], ['\a "weird" `value` with; $fun '\''characters +']) # 'font-lock +AS_VAR_COPY([bar], [foo$num]) +num=2 +AS_VAR_COPY([foo$num], [bar]) +echo "$foo2-" +echo "AS_VAR_GET([foo$num])-" +AS_VAR_SET_IF([foo$num], [echo ok], [echo oops]) +AS_VAR_IF([foo$num], [string], [echo oops], [echo ok]) +AS_VAR_PUSHDEF([tmp], [foo$num]) +AS_VAR_IF([tmp], ['\a "weird" `value` with; $fun '\''characters +'], [echo ok], [echo oops]) # 'font-lock +AS_VAR_POPDEF([tmp]) +m4_ifdef([tmp], [echo oops]) + +# Indirects via command substitution. +echo '====' +AS_VAR_SET_IF([`echo foo3`], [echo oops], [echo ok]) +AS_VAR_SET([`echo foo3`], ['\a "weird" `value` with; $fun '\''characters +']) # 'font-lock +AS_VAR_COPY([bar], [`echo foo3`]) +num=2 +AS_VAR_COPY([`echo foo4`], [bar]) +echo "$foo4-" +echo "AS_VAR_GET([`echo foo4`])-" +AS_VAR_SET_IF([`echo foo4`], [echo ok], [echo oops]) +AS_VAR_IF([`echo foo4`], [string], [echo oops], [echo ok]) +AS_VAR_PUSHDEF([tmp], [`echo foo4`]) +AS_VAR_IF([tmp], ['\a "weird" `value` with; $fun '\''characters +'], [echo ok], [echo oops]) # 'font-lock +AS_VAR_POPDEF([tmp]) +m4_ifdef([tmp], [echo oops]) +: +]]) + +AT_CHECK_M4SH +AT_CHECK([./script], [], [[ok +\a "weird" `value` with; $fun 'characters +- +\a "weird" `value` with; $fun 'characters +- +ok +ok +ok +==== +ok +\a "weird" `value` with; $fun 'characters +- +\a "weird" `value` with; $fun 'characters- +ok +ok +ok +==== +ok +\a "weird" `value` with; $fun 'characters +- +\a "weird" `value` with; $fun 'characters- +ok +ok +ok +]]) + +AT_CLEANUP + + ## ----------------- ## ## AS_INIT cleanup. ## ## ----------------- ## -- 2.11.4.GIT