diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2003-10-08 14:21:18 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2003-10-08 14:21:18 (GMT) |
commit | c523c442ea40722320430dc7ba32673b7b191a90 (patch) | |
tree | c7a20e4018242cdfdaa708c55f922f1d0cc48b5a /generic | |
parent | 1cf2d1bce788d1be36ad8372e2c5c194c88921ba (diff) | |
download | tcl-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.c | 30 | ||||
-rw-r--r-- | generic/tclUtf.c | 7 |
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 { |