summaryrefslogtreecommitdiffstats
path: root/generic/tclParse.c
diff options
context:
space:
mode:
authoravl <avl>2017-03-05 11:22:33 (GMT)
committeravl <avl>2017-03-05 11:22:33 (GMT)
commitca4151477f00d6c5aa468ada3361a8cf76208eaa (patch)
treeb6650d10a416487d85588f1cf8c378daea4d3e01 /generic/tclParse.c
parent6940e13afefbdc6ebe750104382be0c436b81f45 (diff)
downloadtcl-ca4151477f00d6c5aa468ada3361a8cf76208eaa.zip
tcl-ca4151477f00d6c5aa468ada3361a8cf76208eaa.tar.gz
tcl-ca4151477f00d6c5aa468ada3361a8cf76208eaa.tar.bz2
cherrypick 3bcf97f766: array index syntax done. ${...} not yet complete wrt backslashes.
Diffstat (limited to 'generic/tclParse.c')
-rw-r--r--generic/tclParse.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/generic/tclParse.c b/generic/tclParse.c
index 9b801a3..10f016d 100644
--- a/generic/tclParse.c
+++ b/generic/tclParse.c
@@ -95,7 +95,7 @@ const char tclCharTypeTable[] = {
TYPE_NORMAL, TYPE_NORMAL, TYPE_NORMAL, TYPE_NORMAL,
TYPE_SPACE, TYPE_NORMAL, TYPE_QUOTE, TYPE_NORMAL,
TYPE_SUBS, TYPE_NORMAL, TYPE_NORMAL, TYPE_NORMAL,
- TYPE_NORMAL, TYPE_CLOSE_PAREN, TYPE_NORMAL, TYPE_NORMAL,
+ TYPE_OPEN_PAREN, TYPE_CLOSE_PAREN, TYPE_NORMAL, TYPE_NORMAL,
TYPE_NORMAL, TYPE_NORMAL, TYPE_NORMAL, TYPE_NORMAL,
TYPE_NORMAL, TYPE_NORMAL, TYPE_NORMAL, TYPE_NORMAL,
TYPE_NORMAL, TYPE_NORMAL, TYPE_NORMAL, TYPE_NORMAL,
@@ -1366,7 +1366,7 @@ Tcl_ParseVarName(
{
Tcl_Token *tokenPtr;
register const char *src;
- int varIndex;
+ int varIndex, braceCount = 0;
unsigned array;
if ((numBytes == 0) || (start == NULL)) {
@@ -1419,15 +1419,20 @@ Tcl_ParseVarName(
*/
if (*src == '{') {
+ char ch;
src++;
numBytes--;
tokenPtr->type = TCL_TOKEN_TEXT;
tokenPtr->start = src;
tokenPtr->numComponents = 0;
- while (numBytes && (*src != '}')) {
+ ch = *src;
+ while (numBytes && (braceCount>0 || ch != '}')) {
+ if (ch == '{') { braceCount++; }
+ else if (ch == '}') { braceCount--; }
numBytes--;
src++;
+ ch= *src;
}
if (numBytes == 0) {
if (parsePtr->interp != NULL) {
@@ -1483,11 +1488,11 @@ Tcl_ParseVarName(
* any number of substitutions.
*/
- if (TCL_OK != ParseTokens(src+1, numBytes-1, TYPE_CLOSE_PAREN,
+ if (TCL_OK != ParseTokens(src+1, numBytes-1, TYPE_BAD_ARRAY_INDEX,
TCL_SUBST_ALL, parsePtr)) {
goto error;
}
- if ((parsePtr->term == src+numBytes) || (*parsePtr->term != ')')){
+ if ((parsePtr->term == src+numBytes)){
if (parsePtr->interp != NULL) {
Tcl_SetObjResult(parsePtr->interp, Tcl_NewStringObj(
"missing )", -1));
@@ -1496,6 +1501,14 @@ Tcl_ParseVarName(
parsePtr->term = src;
parsePtr->incomplete = 1;
goto error;
+ } else if ((*parsePtr->term != ')')){
+ if (parsePtr->interp != NULL) {
+ Tcl_SetObjResult(parsePtr->interp, Tcl_NewStringObj(
+ "invalid char in array index", -1));
+ }
+ parsePtr->errorType = TCL_PARSE_SYNTAX;
+ parsePtr->term = src;
+ goto error;
}
src = parsePtr->term + 1;
}