aboutsummaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2012-02-17 18:30:49 +1000
committerSteve Bennett <steveb@workware.net.au>2012-02-17 18:49:31 +1000
commit8243f17e06a2b2bac9ac0b99b881b5e632201bcc (patch)
treeaf5a9af978d5e2cc367ff3001a6e54f195e234a3 /jim.c
parentba028faf4f740dcd364f9136399b599ea7d1f6d9 (diff)
downloadjimtcl-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.c85
1 files changed, 28 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