aboutsummaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2010-01-24 11:49:28 +1000
committerSteve Bennett <steveb@workware.net.au>2010-10-15 11:02:42 +1000
commitb367df9ca11f36a392b97afc2767694f8bfe1c4f (patch)
treeb61a231c02622789cadaee3f3ed7c824d2a221d1 /jim.c
parentfb44f9ee2d4b23bc4f5f46ad3b01b33e563932cd (diff)
downloadjimtcl-b367df9ca11f36a392b97afc2767694f8bfe1c4f.zip
jimtcl-b367df9ca11f36a392b97afc2767694f8bfe1c4f.tar.gz
jimtcl-b367df9ca11f36a392b97afc2767694f8bfe1c4f.tar.bz2
Bugs, features, tests
Subst was broken for backslash escapes Add support for return, break, continue in subst commands Accept abbreviations for switches to subst Fix 'list #' More tests
Diffstat (limited to 'jim.c')
-rw-r--r--jim.c34
1 files changed, 23 insertions, 11 deletions
diff --git a/jim.c b/jim.c
index 8c27a73..527ddee 100644
--- a/jim.c
+++ b/jim.c
@@ -4977,6 +4977,7 @@ static int ListElementQuotingType(const char *s, int len)
/* Try with the SIMPLE case */
if (len == 0) return JIM_ELESTR_BRACE;
+ if (s[0] == '#') return JIM_ELESTR_BRACE;
if (s[0] == '"' || s[0] == '{') {
trySimple = 0;
goto testbrace;
@@ -8638,6 +8639,9 @@ static int JimParseSubstStr(struct JimParserCtx *pc)
pc->tstart = pc->p;
pc->tline = pc->linenr;
while (*pc->p && *pc->p != '$' && *pc->p != '[') {
+ if (*pc->p == '\\' && pc->len > 1) {
+ pc->p++; pc->len--;
+ }
pc->p++; pc->len--;
}
pc->tend = pc->p-1;
@@ -8765,6 +8769,7 @@ int Jim_SubstObj(Jim_Interp *interp, Jim_Obj *substObjPtr,
ScriptObj *script;
ScriptToken *token;
int i, len, retcode = JIM_OK;
+ int rc;
Jim_Obj *resObjPtr, *savedResultObjPtr;
script = Jim_GetSubst(interp, substObjPtr, flags);
@@ -8825,9 +8830,20 @@ int Jim_SubstObj(Jim_Interp *interp, Jim_Obj *substObjPtr,
Jim_DecrRefCount(interp, objPtr);
break;
case JIM_TT_CMD:
- if (Jim_EvalObj(interp, token[i].objPtr) != JIM_OK)
+ rc = Jim_EvalObj(interp, token[i].objPtr);
+ if (rc == JIM_BREAK) {
+ /* Stop substituting */
+ goto ok;
+ }
+ else if (rc == JIM_CONTINUE) {
+ /* just skip this one */
+ }
+ else if (rc == JIM_OK || rc == JIM_RETURN) {
+ Jim_AppendObj(interp, resObjPtr, interp->result);
+ }
+ else {
goto err;
- Jim_AppendObj(interp, resObjPtr, interp->result);
+ }
break;
default:
Jim_Panic(interp,
@@ -11246,15 +11262,11 @@ static int Jim_SubstCoreCommand(Jim_Interp *interp, int argc,
}
i = argc-2;
while(i--) {
- if (Jim_CompareStringImmediate(interp, argv[i+1],
- "-nobackslashes"))
- flags |= JIM_SUBST_NOESC;
- else if (Jim_CompareStringImmediate(interp, argv[i+1],
- "-novariables"))
- flags |= JIM_SUBST_NOVAR;
- else if (Jim_CompareStringImmediate(interp, argv[i+1],
- "-nocommands"))
- flags |= JIM_SUBST_NOCMD;
+ const char *option = Jim_GetString(argv[i + 1], NULL);
+
+ if (strncmp(option, "-nob", 4) == 0) flags |= JIM_SUBST_NOESC;
+ else if (strncmp(option, "-nov", 4) == 0) flags |= JIM_SUBST_NOVAR;
+ else if (strncmp(option, "-noc", 4) == 0) flags |= JIM_SUBST_NOCMD;
else {
Jim_SetResult(interp, Jim_NewEmptyStringObj(interp));
Jim_AppendStrings(interp, Jim_GetResult(interp),