summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2016-06-27 19:01:34 (GMT)
committerdgp <dgp@users.sourceforge.net>2016-06-27 19:01:34 (GMT)
commit40d07325fd099e39c32596c89888f080b1a7a307 (patch)
tree987aefde601c87afec4101a3d2d2454bba26be25
parentc26fe8498a889a3a9e71f9502848e4db08dcb072 (diff)
downloadtcl-40d07325fd099e39c32596c89888f080b1a7a307.zip
tcl-40d07325fd099e39c32596c89888f080b1a7a307.tar.gz
tcl-40d07325fd099e39c32596c89888f080b1a7a307.tar.bz2
Stop parsing white space where there cannot be any.
-rw-r--r--generic/tclParse.c69
1 files changed, 28 insertions, 41 deletions
diff --git a/generic/tclParse.c b/generic/tclParse.c
index 4974c87..3372318 100644
--- a/generic/tclParse.c
+++ b/generic/tclParse.c
@@ -294,12 +294,18 @@ Tcl_ParseCommand(
}
}
+ /* Jump to where we check for command termination */
+
+ parsePtr->commandStart = src;
+ type = CHAR_TYPE(*src);
+ scanned = 1;
+ goto start;
+
/*
* The following loop parses the words of the command, one word in each
* iteration through the loop.
*/
- parsePtr->commandStart = src;
while (1) {
int expandWord = 0;
@@ -312,23 +318,6 @@ Tcl_ParseCommand(
tokenPtr = &parsePtr->tokenPtr[wordIndex];
tokenPtr->type = TCL_TOKEN_WORD;
- /*
- * Skip white space before the word. Also skip a backslash-newline
- * sequence: it should be treated just like white space.
- */
-
- scanned = ParseWhiteSpace(src,numBytes, &parsePtr->incomplete, &type);
- src += scanned;
- numBytes -= scanned;
- if (numBytes == 0) {
- parsePtr->term = src;
- break;
- }
- if ((type & terminators) != 0) {
- parsePtr->term = src;
- src++;
- break;
- }
tokenPtr->start = src;
parsePtr->numTokens++;
parsePtr->numWords++;
@@ -555,12 +544,10 @@ Tcl_ParseCommand(
*/
scanned = ParseWhiteSpace(src,numBytes, &parsePtr->incomplete, &type);
- if (scanned) {
- src += scanned;
- numBytes -= scanned;
- continue;
- }
+ src += scanned;
+ numBytes -= scanned;
+ start:
if (numBytes == 0) {
parsePtr->term = src;
break;
@@ -570,30 +557,30 @@ Tcl_ParseCommand(
src++;
break;
}
- if (src[-1] == '"') {
- if (interp != NULL) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "extra characters after close-quote", -1));
- }
- parsePtr->errorType = TCL_PARSE_QUOTE_EXTRA;
- } else {
- if (interp != NULL) {
- Tcl_SetObjResult(interp, Tcl_NewStringObj(
- "extra characters after close-brace", -1));
+ if (scanned == 0) {
+ if (src[-1] == '"') {
+ if (interp != NULL) {
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(
+ "extra characters after close-quote", -1));
+ }
+ parsePtr->errorType = TCL_PARSE_QUOTE_EXTRA;
+ } else {
+ if (interp != NULL) {
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(
+ "extra characters after close-brace", -1));
+ }
+ parsePtr->errorType = TCL_PARSE_BRACE_EXTRA;
}
- parsePtr->errorType = TCL_PARSE_BRACE_EXTRA;
+ parsePtr->term = src;
+ error:
+ Tcl_FreeParse(parsePtr);
+ parsePtr->commandSize = parsePtr->end - parsePtr->commandStart;
+ return TCL_ERROR;
}
- parsePtr->term = src;
- goto error;
}
parsePtr->commandSize = src - parsePtr->commandStart;
return TCL_OK;
-
- error:
- Tcl_FreeParse(parsePtr);
- parsePtr->commandSize = parsePtr->end - parsePtr->commandStart;
- return TCL_ERROR;
}
/*