Tcl Source Code

Artifact [3a18433723]
Login

Artifact 3a18433723bdafba1b287c1eeefaf513db97d76c:

Attachment "1201589.patch" to ticket [1201589fff] added by dgp 2005-05-20 21:29:57.
Index: generic/tclParseExpr.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclParseExpr.c,v
retrieving revision 1.25
diff -u -r1.25 tclParseExpr.c
--- generic/tclParseExpr.c	10 May 2005 18:34:47 -0000	1.25
+++ generic/tclParseExpr.c	20 May 2005 14:23:23 -0000
@@ -1244,6 +1244,7 @@
 	 * Int or double number.
 	 */
 	
+	tokenizeLiteral:
 	if (parsePtr->numTokens == parsePtr->tokensAvailable) {
 	    TclExpandTokenArray(parsePtr);
 	}
@@ -1431,20 +1432,16 @@
 	}
 	break;
 	
-    case FUNC_NAME:
+    case STREQ:
+    case STRNEQ:
+    case IN_LIST:
+    case NOT_IN_LIST:
+    case FUNC_NAME: {
 	/*
 	 * math_func '(' expr {',' expr} ')'
 	 */
-	
-	if (parsePtr->numTokens == parsePtr->tokensAvailable) {
-	    TclExpandTokenArray(parsePtr);
-	}
-	tokenPtr = &parsePtr->tokenPtr[parsePtr->numTokens];
-	tokenPtr->type = TCL_TOKEN_OPERATOR;
-	tokenPtr->start = infoPtr->start;
-	tokenPtr->size = infoPtr->size;
-	tokenPtr->numComponents = 0;
-	parsePtr->numTokens++;
+
+	ParseInfo savedInfo = *infoPtr;
 	
 	code = GetLexeme(infoPtr); /* skip over function name */
 	if (code != TCL_OK) {
@@ -1452,10 +1449,12 @@
 	}
 	if (infoPtr->lexeme != OPEN_PAREN) {
 
+	    *infoPtr = savedInfo;
+	    goto tokenizeLiteral;
+	    
 	    /*
 	     * Either there's a math function without a (, or a
 	     * variable name without a '$'.
-	     */
 
 	    Tcl_Obj* errMsg 
 		= Tcl_NewStringObj( "syntax error in expression \"", -1 );
@@ -1476,8 +1475,20 @@
 	    infoPtr->parsePtr->errorType = TCL_PARSE_SYNTAX;
 	    infoPtr->parsePtr->term = infoPtr->start;
 	    return TCL_ERROR;
+	     */
 
 	}
+
+	if (parsePtr->numTokens == parsePtr->tokensAvailable) {
+	    TclExpandTokenArray(parsePtr);
+	}
+	tokenPtr = &parsePtr->tokenPtr[parsePtr->numTokens];
+	tokenPtr->type = TCL_TOKEN_OPERATOR;
+	tokenPtr->start = savedInfo.start;
+	tokenPtr->size = savedInfo.size;
+	tokenPtr->numComponents = 0;
+	parsePtr->numTokens++;
+	
 	code = GetLexeme(infoPtr); /* skip over '(' */
 	if (code != TCL_OK) {
 	    return code;
@@ -1505,6 +1516,7 @@
 	exprTokenPtr->size = (infoPtr->next - exprTokenPtr->start);
 	exprTokenPtr->numComponents = parsePtr->numTokens - firstIndex;
 	break;
+    }
 
     case COMMA:
 	LogSyntaxError(infoPtr,
@@ -1919,7 +1931,6 @@
 		parsePtr->term = infoPtr->next;
 		/*
 		 * Check for boolean literals (true, false, yes, no, on, off)
-		 */
 		switch (infoPtr->start[0]) {
 		case 'f':
 		    if (infoPtr->size == 5 &&
@@ -1961,6 +1972,7 @@
 		    }
 		    break;
 		}
+		 */
 		return TCL_OK;
 	    }
 	    infoPtr->lexeme = UNKNOWN_CHAR;