aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2011-11-09 07:17:56 +1000
committerSteve Bennett <steveb@workware.net.au>2011-11-09 07:18:25 +1000
commit2fd47a708fb151565eaf6de2b555d2af1fbd820a (patch)
tree172f8a8b069ca9d9a23836078c25ee75148c2945
parente87b07712dc470c8a2a36be6a555edad16926747 (diff)
downloadjimtcl-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.c57
-rw-r--r--tests/parse.test8
2 files changed, 30 insertions, 35 deletions
diff --git a/jim.c b/jim.c
index 1ef06e4..3784f5e 100644
--- a/jim.c
+++ b/jim.c
@@ -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