diff options
author | Steve Bennett <steveb@workware.net.au> | 2011-11-09 07:17:56 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2011-11-09 07:18:25 +1000 |
commit | 2fd47a708fb151565eaf6de2b555d2af1fbd820a (patch) | |
tree | 172f8a8b069ca9d9a23836078c25ee75148c2945 | |
parent | e87b07712dc470c8a2a36be6a555edad16926747 (diff) | |
download | jimtcl-2fd47a708fb151565eaf6de2b555d2af1fbd820a.zip jimtcl-2fd47a708fb151565eaf6de2b555d2af1fbd820a.tar.gz jimtcl-2fd47a708fb151565eaf6de2b555d2af1fbd820a.tar.bz2 |
Fix a parsing bug for quoted orphan $
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r-- | jim.c | 57 | ||||
-rw-r--r-- | tests/parse.test | 8 |
2 files changed, 30 insertions, 35 deletions
@@ -1196,57 +1196,42 @@ static int JimParseScript(struct JimParserCtx *pc) if (*(pc->p + 1) == '\n' && pc->state == JIM_PS_DEF) { return JimParseSep(pc); } - else { - pc->comment = 0; - return JimParseStr(pc); - } - break; + pc->comment = 0; + return JimParseStr(pc); case ' ': case '\t': case '\r': if (pc->state == JIM_PS_DEF) return JimParseSep(pc); - else { - pc->comment = 0; - return JimParseStr(pc); - } - break; + pc->comment = 0; + return JimParseStr(pc); case '\n': case ';': pc->comment = 1; if (pc->state == JIM_PS_DEF) return JimParseEol(pc); - else - return JimParseStr(pc); - break; + return JimParseStr(pc); case '[': pc->comment = 0; return JimParseCmd(pc); - break; case '$': pc->comment = 0; if (JimParseVar(pc) == JIM_ERR) { + /* An orphan $. Create as a separate token */ pc->tstart = pc->tend = pc->p++; pc->len--; - pc->tline = pc->linenr; - pc->tt = JIM_TT_STR; - return JIM_OK; + pc->tt = JIM_TT_ESC; } - else - return JIM_OK; - break; + return JIM_OK; case '#': if (pc->comment) { JimParseComment(pc); continue; } - else { - return JimParseStr(pc); - } + return JimParseStr(pc); default: pc->comment = 0; return JimParseStr(pc); - break; } return JIM_OK; } @@ -1610,17 +1595,19 @@ static int JimParseVar(struct JimParserCtx *pc) static int JimParseStr(struct JimParserCtx *pc) { - int newword = (pc->tt == JIM_TT_SEP || pc->tt == JIM_TT_EOL || - pc->tt == JIM_TT_NONE || pc->tt == JIM_TT_STR); - if (newword && *pc->p == '{') { - return JimParseBrace(pc); - } - else if (newword && *pc->p == '"') { - pc->state = JIM_PS_QUOTE; - pc->p++; - pc->len--; - /* In case the end quote is missing */ - pc->missingline = pc->tline; + if (pc->tt == JIM_TT_SEP || pc->tt == JIM_TT_EOL || + pc->tt == JIM_TT_NONE || pc->tt == JIM_TT_STR) { + /* Starting a new word */ + if (*pc->p == '{') { + return JimParseBrace(pc); + } + if (*pc->p == '"') { + pc->state = JIM_PS_QUOTE; + pc->p++; + pc->len--; + /* In case the end quote is missing */ + pc->missingline = pc->tline; + } } pc->tstart = pc->p; pc->tline = pc->linenr; diff --git a/tests/parse.test b/tests/parse.test index 427a717..e352fc3 100644 --- a/tests/parse.test +++ b/tests/parse.test @@ -312,4 +312,12 @@ test parse-1.61 "quote in command" { lindex $x end } x +test parse-1.62 "quoted orphan dollar sign" { + set x "x$" +} {x$} + +test parse-1.63 "unquoted dollar sign" { + set x x$ +} {x$} + testreport |