diff options
author | Steve Bennett <steveb@workware.net.au> | 2017-08-01 18:04:08 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2017-08-03 09:07:17 +1000 |
commit | 00c8f8991c6dd72baa3a281db0631a8268086f2a (patch) | |
tree | 0e1f34fac10634cf1ed6bf800cf50639982b5840 | |
parent | 03a04d4ce5959ae1881088cc7c67179bb49554ef (diff) | |
download | jimtcl-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.c | 20 | ||||
-rw-r--r-- | tests/misc.test | 2 | ||||
-rw-r--r-- | tests/subst.test | 7 |
3 files changed, 23 insertions, 6 deletions
@@ -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 } |