From 8243f17e06a2b2bac9ac0b99b881b5e632201bcc Mon Sep 17 00:00:00 2001 From: Steve Bennett Date: Fri, 17 Feb 2012 18:30:49 +1000 Subject: subst -noc should substitute vars inside brackets This also simplifies and shrinks the implementation of subst Signed-off-by: Steve Bennett --- jim.c | 85 +++++++++++++++++++------------------------------------- tests/subst.test | 6 ++++ 2 files changed, 34 insertions(+), 57 deletions(-) diff --git a/jim.c b/jim.c index 6e787ac..fc486d4 100644 --- a/jim.c +++ b/jim.c @@ -10775,74 +10775,45 @@ int Jim_EvalFile(Jim_Interp *interp, const char *filename) /* ----------------------------------------------------------------------------- * Subst * ---------------------------------------------------------------------------*/ -static int JimParseSubstStr(struct JimParserCtx *pc) +static void JimParseSubst(struct JimParserCtx *pc, int flags) { pc->tstart = pc->p; pc->tline = pc->linenr; - while (pc->len && *pc->p != '$' && *pc->p != '[') { - if (*pc->p == '\\' && pc->len > 1) { - pc->p++; - pc->len--; - } - pc->p++; - pc->len--; - } - pc->tend = pc->p - 1; - pc->tt = JIM_TT_ESC; - return JIM_OK; -} - -static int JimParseSubst(struct JimParserCtx *pc, int flags) -{ - int retval; if (pc->len == 0) { - pc->tstart = pc->tend = pc->p; - pc->tline = pc->linenr; + pc->tend = pc->p; pc->tt = JIM_TT_EOL; pc->eof = 1; - return JIM_OK; + return; } - switch (*pc->p) { - case '[': - retval = JimParseCmd(pc); - if (flags & JIM_SUBST_NOCMD) { - pc->tstart--; - pc->tend++; - pc->tt = (flags & JIM_SUBST_NOESC) ? JIM_TT_STR : JIM_TT_ESC; - } - return retval; - break; - case '$': - if (JimParseVar(pc) == JIM_ERR) { - pc->tstart = pc->tend = pc->p++; - pc->len--; - pc->tline = pc->linenr; - pc->tt = JIM_TT_STR; - } - else { - if (flags & JIM_SUBST_NOVAR) { - pc->tstart--; - if (flags & JIM_SUBST_NOESC) - pc->tt = JIM_TT_STR; - else - pc->tt = JIM_TT_ESC; - if (*pc->tstart == '{') { - pc->tstart--; - if (*(pc->tend + 1)) - pc->tend++; - } - } - } + if (*pc->p == '[' && !(flags & JIM_SUBST_NOCMD)) { + JimParseCmd(pc); + return; + } + if (*pc->p == '$' && !(flags & JIM_SUBST_NOVAR)) { + if (JimParseVar(pc) == JIM_OK) { + return; + } + /* Not a var, so treat as a string */ + pc->tstart = pc->p; + flags |= JIM_SUBST_NOVAR; + } + while (pc->len) { + if (*pc->p == '$' && !(flags & JIM_SUBST_NOVAR)) { break; - default: - retval = JimParseSubstStr(pc); - if (flags & JIM_SUBST_NOESC) - pc->tt = JIM_TT_STR; - return retval; + } + if (*pc->p == '[' && !(flags & JIM_SUBST_NOCMD)) { break; + } + if (*pc->p == '\\' && pc->len > 1) { + pc->p++; + pc->len--; + } + pc->p++; + pc->len--; } - return JIM_OK; + pc->tend = pc->p - 1; + pc->tt = (flags & JIM_SUBST_NOESC) ? JIM_TT_STR : JIM_TT_ESC; } /* The subst object type reuses most of the data structures and functions diff --git a/tests/subst.test b/tests/subst.test index 4a084d9..353af5f 100644 --- a/tests/subst.test +++ b/tests/subst.test @@ -168,5 +168,11 @@ test subst-12.2 {lone $} { subst -novar {${a}} } {${a}} +test subst-12.3 {variable inside [] with -noc} { + set a 1 + subst -noc {x[join $a]y} +} {x[join 1]y} + + # cleanup testreport -- cgit v1.1