aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2017-08-01 18:04:08 +1000
committerSteve Bennett <steveb@workware.net.au>2017-08-03 09:07:17 +1000
commit00c8f8991c6dd72baa3a281db0631a8268086f2a (patch)
tree0e1f34fac10634cf1ed6bf800cf50639982b5840
parent03a04d4ce5959ae1881088cc7c67179bb49554ef (diff)
downloadjimtcl-00c8f8991c6dd72baa3a281db0631a8268086f2a.zip
jimtcl-00c8f8991c6dd72baa3a281db0631a8268086f2a.tar.gz
jimtcl-00c8f8991c6dd72baa3a281db0631a8268086f2a.tar.bz2
Error on extra characters after close brace
In scripts, like Tcl does. Signed-off-by: Steve Bennett <steveb@workware.net.au> Reported-by: tcler.yin
-rw-r--r--jim.c20
-rw-r--r--tests/misc.test2
-rw-r--r--tests/subst.test7
3 files changed, 23 insertions, 6 deletions
diff --git a/jim.c b/jim.c
index 9b9647e..e69d4c0 100644
--- a/jim.c
+++ b/jim.c
@@ -3411,7 +3411,7 @@ static void ScriptAddToken(ParseTokenList *tokenlist, const char *token, int len
* operator (in which case the count doesn't include
* that token).
*/
-static int JimCountWordTokens(ParseToken *t)
+static int JimCountWordTokens(struct ScriptObj *script, ParseToken *t)
{
int expand = 1;
int count = 0;
@@ -3423,6 +3423,13 @@ static int JimCountWordTokens(ParseToken *t)
expand = -1;
t++;
}
+ else {
+ if (script->missing == ' ') {
+ /* This is a "extra characters after close-brace" error. Report the first error */
+ script->missing = '}';
+ script->linenr = t[1].line;
+ }
+ }
}
/* Now count non-separator words */
@@ -3509,7 +3516,7 @@ static void ScriptObjAddTokens(Jim_Interp *interp, struct ScriptObj *script,
i++;
}
- wordtokens = JimCountWordTokens(tokenlist->list + i);
+ wordtokens = JimCountWordTokens(script, tokenlist->list + i);
if (wordtokens == 0) {
/* None, so at end of line */
@@ -3590,6 +3597,10 @@ static void ScriptObjAddTokens(Jim_Interp *interp, struct ScriptObj *script,
* '\\' on scripts with a trailing backslash.
*
* If the script is complete, 1 is returned, otherwise 0.
+ *
+ * If the script has extra characters after a close brace, this still returns 1,
+ * but sets *stateCharPtr to '}'
+ * Evaluating the script will give the error "extra characters after close-brace".
*/
int Jim_ScriptIsComplete(Jim_Interp *interp, Jim_Obj *scriptObj, char *stateCharPtr)
{
@@ -3597,7 +3608,7 @@ int Jim_ScriptIsComplete(Jim_Interp *interp, Jim_Obj *scriptObj, char *stateChar
if (stateCharPtr) {
*stateCharPtr = script->missing;
}
- return (script->missing == ' ');
+ return script->missing == ' ' || script->missing == '}';
}
/**
@@ -3622,6 +3633,9 @@ static int JimParseCheckMissing(Jim_Interp *interp, int ch)
case '{':
msg = "missing close-brace";
break;
+ case '}':
+ msg = "extra characters after close-brace";
+ break;
case '"':
default:
msg = "missing quote";
diff --git a/tests/misc.test b/tests/misc.test
index 29bd977..0ff2a7a 100644
--- a/tests/misc.test
+++ b/tests/misc.test
@@ -485,7 +485,7 @@ test jimexpr-2.6 "exit in expression" {
} else {
set x 3
}
- }]
+ }
} 6
# This one is for test coverage of an unusual case
diff --git a/tests/subst.test b/tests/subst.test
index 353af5f..5128a99 100644
--- a/tests/subst.test
+++ b/tests/subst.test
@@ -142,10 +142,13 @@ test subst-10.2 {break in a subst} {
test subst-10.3 {break in a subst} {
subst {foo [if 1 { break; bogus code}] bar}
} {foo }
-test subst-10.4 {break in a subst, parse error} {
+
+# Note that unlike Tcl, Jim throws an error for these two before
+# evaluating
+test subst-10.4 {break in a subst, parse error} tcl {
subst {foo [break ; set a {}{} ; stuff] bar}
} {foo }
-test subst-10.5 {break in a subst, parse error} {
+test subst-10.5 {break in a subst, parse error} tcl {
subst {foo [break ;set bar baz ;set a {}{} ; stuff] bar}
} {foo }