diff options
author | Steve Bennett <steveb@workware.net.au> | 2012-02-17 18:30:49 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2012-02-17 18:49:31 +1000 |
commit | 8243f17e06a2b2bac9ac0b99b881b5e632201bcc (patch) | |
tree | af5a9af978d5e2cc367ff3001a6e54f195e234a3 /jim.c | |
parent | ba028faf4f740dcd364f9136399b599ea7d1f6d9 (diff) | |
download | jimtcl-8243f17e06a2b2bac9ac0b99b881b5e632201bcc.zip jimtcl-8243f17e06a2b2bac9ac0b99b881b5e632201bcc.tar.gz jimtcl-8243f17e06a2b2bac9ac0b99b881b5e632201bcc.tar.bz2 |
subst -noc should substitute vars inside brackets
This also simplifies and shrinks the implementation of subst
Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim.c')
-rw-r--r-- | jim.c | 85 |
1 files changed, 28 insertions, 57 deletions
@@ -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 |