Tcl Source Code

Artifact [5061cef3bd]
Login

Artifact 5061cef3bd693eecaf469a0f2d3ac3bba3749c33:

Attachment "1382287.patch" to ticket [1382287fff] added by dgp 2005-12-20 01:39:41.
Index: generic/tclCmdMZ.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclCmdMZ.c,v
retrieving revision 1.133
diff -u -r1.133 tclCmdMZ.c
--- generic/tclCmdMZ.c	4 Nov 2005 22:38:38 -0000	1.133
+++ generic/tclCmdMZ.c	19 Dec 2005 18:36:25 -0000
@@ -1544,8 +1544,11 @@
 		failat = 0;
 	    } else {
 		failat = stop - string1;
-		string1 = stop;
-		chcomp = Tcl_UniCharIsSpace;
+		if (stop < end) {
+		    result = 0;
+		    TclFreeIntRep(objPtr);
+		    objPtr->typePtr = NULL;
+		}
 	    }
 	    break;
 	}
Index: generic/tclInt.h
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclInt.h,v
retrieving revision 1.262
diff -u -r1.262 tclInt.h
--- generic/tclInt.h	13 Dec 2005 22:43:17 -0000	1.262
+++ generic/tclInt.h	19 Dec 2005 18:36:25 -0000
@@ -1906,6 +1906,8 @@
 				/* Disable floating point parsing */
 #define TCL_PARSE_SCAN_PREFIXES		16
 				/* Use [scan] rules dealing with 0? prefixes */
+#define TCL_PARSE_NO_WHITESPACE		32
+				/* Reject leading/trailing whitespace */
 
 /*
  *----------------------------------------------------------------------
Index: generic/tclParseExpr.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclParseExpr.c,v
retrieving revision 1.31
diff -u -r1.31 tclParseExpr.c
--- generic/tclParseExpr.c	13 Dec 2005 22:43:18 -0000	1.31
+++ generic/tclParseExpr.c	19 Dec 2005 18:36:25 -0000
@@ -1616,7 +1616,7 @@
 	CONST char *end = infoPtr->lastChar;
 	CONST char* end2;
 	int code = TclParseNumber(NULL, NULL, NULL, src, (int)(end-src),
-		&end2, 0);
+		&end2, TCL_PARSE_NO_WHITESPACE);
 
 	if (code == TCL_OK) {
 	    length = end2-src;
Index: generic/tclScan.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclScan.c,v
retrieving revision 1.22
diff -u -r1.22 tclScan.c
--- generic/tclScan.c	12 Nov 2005 04:08:05 -0000	1.22
+++ generic/tclScan.c	19 Dec 2005 18:36:25 -0000
@@ -630,7 +630,7 @@
     objIndex = 0;
     nconversions = 0;
     while (*format != '\0') {
-	int parseFlag = 0;
+	int parseFlag = TCL_PARSE_NO_WHITESPACE;
 	format += Tcl_UtfToUniChar(format, &ch);
 
 	flags = 0;
@@ -735,19 +735,19 @@
 
 	case 'd':
 	    op = 'i';
-	    parseFlag = TCL_PARSE_DECIMAL_ONLY;
+	    parseFlag |= TCL_PARSE_DECIMAL_ONLY;
 	    break;
 	case 'i':
 	    op = 'i';
-	    parseFlag = TCL_PARSE_SCAN_PREFIXES;
+	    parseFlag |= TCL_PARSE_SCAN_PREFIXES;
 	    break;
 	case 'o':
 	    op = 'i';
-	    parseFlag = TCL_PARSE_OCTAL_ONLY | TCL_PARSE_SCAN_PREFIXES;
+	    parseFlag |= TCL_PARSE_OCTAL_ONLY | TCL_PARSE_SCAN_PREFIXES;
 	    break;
 	case 'x':
 	    op = 'i';
-	    parseFlag = TCL_PARSE_HEXADECIMAL_ONLY;
+	    parseFlag |= TCL_PARSE_HEXADECIMAL_ONLY;
 	    break;
 	case 'u':
 	    op = 'i';
@@ -955,7 +955,7 @@
 		width = ~0;
 	    }
 	    if (TCL_OK != TclParseNumber(NULL, objPtr, NULL, string, width,
-		    &end, TCL_PARSE_DECIMAL_ONLY)) {
+		    &end, TCL_PARSE_DECIMAL_ONLY | TCL_PARSE_NO_WHITESPACE)) {
 		Tcl_DecrRefCount(objPtr);
 		if (width < 0) {
 		    if (*end == '\0') {
Index: generic/tclStrToD.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclStrToD.c,v
retrieving revision 1.17
diff -u -r1.17 tclStrToD.c
--- generic/tclStrToD.c	14 Nov 2005 17:43:51 -0000	1.17
+++ generic/tclStrToD.c	19 Dec 2005 18:36:25 -0000
@@ -177,6 +177,7 @@
  *		TCL_PARSE_INTEGER_ONLY.
  * 	- TCL_PARSE_DECIMAL_ONLY:	parse only in the decimal format, no
  *		matter whether a 0 prefix would normally force a different base.
+ *	- TCL_PARSE_NO_WHITESPACE:	reject any leading/trailing whitespace
  *
  *	The arguments interp and expected are inputs that control error message
  * 	generation.  If interp is NULL, no error message will be generated.
@@ -335,6 +336,9 @@
 	     */
 
 	    if (isspace(UCHAR(c))) {
+		if (flags & TCL_PARSE_NO_WHITESPACE) {
+		    goto endgame;
+		}
 		break;
 	    } else if (c == '+') {
 		state = SIGNUM;
@@ -893,12 +897,14 @@
 	/* Back up to the last accepting state in the lexer. */
 	p = acceptPoint;
 	len = acceptLen;
-	if (endPtrPtr == NULL) {
+	if (!(flags & TCL_PARSE_NO_WHITESPACE)) {
 	    /* Accept trailing whitespace */
 	    while (len != 0 && isspace(UCHAR(*p))) {
 		++p;
 		--len;
 	    }
+	}
+	if (endPtrPtr == NULL) {
 	    if ((len != 0) && ((numBytes > 0) || (*p != '\0'))) {
 		status = TCL_ERROR;
 	    }
Index: tests/scan.test
===================================================================
RCS file: /cvsroot/tcl/tcl/tests/scan.test,v
retrieving revision 1.18
diff -u -r1.18 scan.test
--- tests/scan.test	8 Oct 2005 14:42:54 -0000	1.18
+++ tests/scan.test	19 Dec 2005 18:36:27 -0000
@@ -606,6 +606,12 @@
     set arr(2) {}
     list [catch {scan ab%c14 ab%%c%d arr(2)} msg] $msg $arr(2)
 } {0 1 14}
+test scan-10.6 {miscellaneous tests} {
+    scan 5a {%i%[a]}
+} {5 a}
+test scan-10.7 {miscellaneous tests} {
+    scan {5 a} {%i%[a]}
+} {5 {}}
 
 test scan-11.1 {alignment in results array (TCL_ALIGN)} {
     scan "123 13.6" "%s %f" a b
@@ -758,4 +764,4 @@
 
 # Local Variables:
 # mode: tcl
-# End:
\ No newline at end of file
+# End:
Index: tests/string.test
===================================================================
RCS file: /cvsroot/tcl/tcl/tests/string.test,v
retrieving revision 1.54
diff -u -r1.54 string.test
--- tests/string.test	9 Nov 2005 20:24:11 -0000	1.54
+++ tests/string.test	19 Dec 2005 18:36:27 -0000
@@ -661,6 +661,14 @@
     }
     set result
 } {1 1 0 0 0 1 0 0}
+test string-6.108 {string is double, Bug 1382287} {
+    set x 2turtledoves
+    string is double $x
+    string is double $x
+} 0
+test string-6.109 {string is double, Bug 1360532} {
+    string is double 1\u00a0
+} 0
 
 catch {rename largest_int {}}