summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authordkf <donal.k.fellows@manchester.ac.uk>2003-10-08 14:21:18 (GMT)
committerdkf <donal.k.fellows@manchester.ac.uk>2003-10-08 14:21:18 (GMT)
commitc523c442ea40722320430dc7ba32673b7b191a90 (patch)
treec7a20e4018242cdfdaa708c55f922f1d0cc48b5a /generic
parent1cf2d1bce788d1be36ad8372e2c5c194c88921ba (diff)
downloadtcl-c523c442ea40722320430dc7ba32673b7b191a90.zip
tcl-c523c442ea40722320430dc7ba32673b7b191a90.tar.gz
tcl-c523c442ea40722320430dc7ba32673b7b191a90.tar.bz2
Made Tcl_NumUtfChars do the right thing with \u0000 when guessing the length
because of a negative 'length' parameter. [Bug 769812]
Diffstat (limited to 'generic')
-rw-r--r--generic/tclTest.c30
-rw-r--r--generic/tclUtf.c7
2 files changed, 30 insertions, 7 deletions
diff --git a/generic/tclTest.c b/generic/tclTest.c
index 327c470..d3abdfb 100644
--- a/generic/tclTest.c
+++ b/generic/tclTest.c
@@ -14,7 +14,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclTest.c,v 1.62.2.1 2003/04/16 23:31:46 dgp Exp $
+ * RCS: @(#) $Id: tclTest.c,v 1.62.2.2 2003/10/08 14:21:20 dkf Exp $
*/
#define TCL_TEST
@@ -420,6 +420,9 @@ static Tcl_Obj* SimpleListVolumes _ANSI_ARGS_ ((void));
static int SimplePathInFilesystem _ANSI_ARGS_ ((
Tcl_Obj *pathPtr, ClientData *clientDataPtr));
static Tcl_Obj* SimpleCopy _ANSI_ARGS_ ((Tcl_Obj *pathPtr));
+static int TestNumUtfCharsCmd _ANSI_ARGS_((ClientData clientData,
+ Tcl_Interp *interp, int objc,
+ Tcl_Obj *CONST objv[]));
static Tcl_Filesystem testReportingFilesystem = {
"reporting",
@@ -654,6 +657,9 @@ Tcltest_Init(interp)
Tcl_CreateObjCommand(interp, "testsetobjerrorcode",
TestsetobjerrorcodeCmd, (ClientData) 0,
(Tcl_CmdDeleteProc *) NULL);
+ Tcl_CreateObjCommand(interp, "testnumutfchars",
+ TestNumUtfCharsCmd, (ClientData) 0,
+ (Tcl_CmdDeleteProc *) NULL);
Tcl_CreateCommand(interp, "testsetplatform", TestsetplatformCmd,
(ClientData) 0, (Tcl_CmdDeleteProc *) NULL);
Tcl_CreateCommand(interp, "teststaticpkg", TeststaticpkgCmd,
@@ -6423,4 +6429,24 @@ SimpleListVolumes(void)
Tcl_IncrRefCount(retVal);
return retVal;
}
-
+
+/*
+ * Used to check correct string-length determining in Tcl_NumUtfChars
+ */
+static int
+TestNumUtfCharsCmd(clientData, interp, objc, objv)
+ ClientData clientData;
+ Tcl_Interp *interp;
+ int objc;
+ Tcl_Obj *CONST objv[];
+{
+ if (objc > 1) {
+ int len = -1;
+ if (objc > 2) {
+ (void) Tcl_GetStringFromObj(objv[1], &len);
+ }
+ len = Tcl_NumUtfChars(Tcl_GetString(objv[1]), len);
+ Tcl_SetObjResult(interp, Tcl_NewIntObj(len));
+ }
+ return TCL_OK;
+}
diff --git a/generic/tclUtf.c b/generic/tclUtf.c
index cc8c3c7..b7a6277 100644
--- a/generic/tclUtf.c
+++ b/generic/tclUtf.c
@@ -8,7 +8,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclUtf.c,v 1.30.2.1 2003/03/06 23:24:17 dgp Exp $
+ * RCS: @(#) $Id: tclUtf.c,v 1.30.2.2 2003/10/08 14:21:20 dkf Exp $
*/
#include "tclInt.h"
@@ -501,11 +501,8 @@ Tcl_NumUtfChars(str, len)
i = 0;
if (len < 0) {
- while (1) {
+ while (*str != '\0') {
str += TclUtfToUniChar(str, chPtr);
- if (ch == '\0') {
- break;
- }
i++;
}
} else {