summaryrefslogtreecommitdiffstats
path: root/generic/tclParse.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclParse.c')
-rw-r--r--generic/tclParse.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/generic/tclParse.c b/generic/tclParse.c
index 10f016d..372ec92 100644
--- a/generic/tclParse.c
+++ b/generic/tclParse.c
@@ -1366,7 +1366,7 @@ Tcl_ParseVarName(
{
Tcl_Token *tokenPtr;
register const char *src;
- int varIndex, braceCount = 0;
+ int varIndex;
unsigned array;
if ((numBytes == 0) || (start == NULL)) {
@@ -1419,7 +1419,7 @@ Tcl_ParseVarName(
*/
if (*src == '{') {
- char ch;
+ char ch; int braceCount = 0;
src++;
numBytes--;
tokenPtr->type = TCL_TOKEN_TEXT;
@@ -1428,8 +1428,16 @@ Tcl_ParseVarName(
ch = *src;
while (numBytes && (braceCount>0 || ch != '}')) {
- if (ch == '{') { braceCount++; }
- else if (ch == '}') { braceCount--; }
+ switch (ch) {
+ case '{': braceCount++; break;
+ case '}': braceCount--; break;
+ case '\\':
+ /* if 2 or more left, consume 2, else consume
+ just the \ and let it run into the end */
+ if (numBytes > 1) {
+ src++; numBytes--;
+ }
+ }
numBytes--;
src++;
ch= *src;
@@ -1504,7 +1512,7 @@ Tcl_ParseVarName(
} else if ((*parsePtr->term != ')')){
if (parsePtr->interp != NULL) {
Tcl_SetObjResult(parsePtr->interp, Tcl_NewStringObj(
- "invalid char in array index", -1));
+ "invalid character in array index", -1));
}
parsePtr->errorType = TCL_PARSE_SYNTAX;
parsePtr->term = src;