Tcl Source Code

Artifact [a75b28f84c]
Login

Artifact a75b28f84ceffe3d6b3390cebde53ce7831ab407:

Attachment "1201589-2.patch" to ticket [1201589fff] added by dgp 2005-05-20 22:04: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:50:30 -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,13 +1449,25 @@
 	}
 	if (infoPtr->lexeme != OPEN_PAREN) {
 
+	    int code;
+	    Tcl_Obj *errMsg, *objPtr
+		    = Tcl_NewStringObj(savedInfo.start, savedInfo.size);
+
+	    /* Check for boolean literals (true, false, yes, no, on, off) */
+	    Tcl_IncrRefCount(objPtr);
+	    code = Tcl_ConvertToType(NULL, objPtr, &tclBooleanType);
+	    Tcl_DecrRefCount(objPtr);
+	    if (code == TCL_OK) {
+		*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 );
+	    errMsg = Tcl_NewStringObj( "syntax error in expression \"", -1 );
 	    TclAppendLimitedToObj( errMsg,
 				   infoPtr->originalExpr,
 				   (int) (infoPtr->lastChar
@@ -1466,7 +1475,7 @@
 				   63,
 				   NULL );
 	    Tcl_AppendToObj( errMsg, "\": the word \"", -1 );
-	    Tcl_AppendToObj( errMsg, tokenPtr->start, tokenPtr->size );
+	    Tcl_AppendToObj( errMsg, savedInfo.start, savedInfo.size );
 	    Tcl_AppendToObj( errMsg,
 			     "\" requires a preceding $ if it's a variable ",
 			     -1 );
@@ -1478,6 +1487,17 @@
 	    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 +1525,7 @@
 	exprTokenPtr->size = (infoPtr->next - exprTokenPtr->start);
 	exprTokenPtr->numComponents = parsePtr->numTokens - firstIndex;
 	break;
+    }
 
     case COMMA:
 	LogSyntaxError(infoPtr,
@@ -1917,50 +1938,6 @@
 		infoPtr->size = (src - infoPtr->start);
 		infoPtr->next = src;
 		parsePtr->term = infoPtr->next;
-		/*
-		 * Check for boolean literals (true, false, yes, no, on, off)
-		 */
-		switch (infoPtr->start[0]) {
-		case 'f':
-		    if (infoPtr->size == 5 &&
-			strncmp("false", infoPtr->start, 5) == 0) {
-			infoPtr->lexeme = LITERAL;
-			return TCL_OK;
-		    }
-		    break;
-		case 'n':
-		    if (infoPtr->size == 2 &&
-			strncmp("no", infoPtr->start, 2) == 0) {
-			infoPtr->lexeme = LITERAL;
-			return TCL_OK;
-		    }
-		    break;
-		case 'o':
-		    if (infoPtr->size == 3 &&
-			strncmp("off", infoPtr->start, 3) == 0) {
-			infoPtr->lexeme = LITERAL;
-			return TCL_OK;
-		    } else if (infoPtr->size == 2 &&
-			strncmp("on", infoPtr->start, 2) == 0) {
-			infoPtr->lexeme = LITERAL;
-			return TCL_OK;
-		    }
-		    break;
-		case 't':
-		    if (infoPtr->size == 4 &&
-			strncmp("true", infoPtr->start, 4) == 0) {
-			infoPtr->lexeme = LITERAL;
-			return TCL_OK;
-		    }
-		    break;
-		case 'y':
-		    if (infoPtr->size == 3 &&
-			strncmp("yes", infoPtr->start, 3) == 0) {
-			infoPtr->lexeme = LITERAL;
-			return TCL_OK;
-		    }
-		    break;
-		}
 		return TCL_OK;
 	    }
 	    infoPtr->lexeme = UNKNOWN_CHAR;