diff options
| -rw-r--r-- | ChangeLog | 11 | ||||
| -rw-r--r-- | generic/tclIndexObj.c | 21 |
2 files changed, 23 insertions, 9 deletions
@@ -1,3 +1,8 @@ +2012-07-05 Don Porter <dgp@users.sourceforge.net> + + * unix/tclUnixPipe.c: [Bug 1189293] Make "<<" binary safe. + * win/tclWinPipe.c: + 2012-06-29 Jan Nijtmans <nijtmans@users.sf.net> * library/msgcat/msgcat.tcl: Add tn, ro_MO and ru_MO to msgcat. Make it @@ -56,9 +61,9 @@ 2012-05-21 Don Porter <dgp@users.sourceforge.net> - * generic/tclFileName.c: When using Tcl_SetObjLength() calls to grow - * generic/tclIOUtil.c: and shrink the objPtr->bytes buffer, care must be - taken that the value cannot possibly become pure Unicode. Calling + * generic/tclFileName.c: When using Tcl_SetObjLength() calls to grow + * generic/tclIOUtil.c: and shrink the objPtr->bytes buffer, care must + be taken that the value cannot possibly become pure Unicode. Calling Tcl_AppendToObj() has the possibility of making such a conversion. Bug found while valgrinding the trunk. diff --git a/generic/tclIndexObj.c b/generic/tclIndexObj.c index 79fc262..1076e32 100644 --- a/generic/tclIndexObj.c +++ b/generic/tclIndexObj.c @@ -207,6 +207,10 @@ Tcl_GetIndexFromObjStruct(interp, objPtr, tablePtr, offset, msg, flags, entryPtr = NEXT_ENTRY(entryPtr, offset), i++) { for (p1 = key, p2 = *entryPtr; *p1 == *p2; p1++, p2++) { if (*p1 == '\0') { + if (p1 == key) { + /* empty keys never match */ + continue; + } index = i; goto done; } @@ -260,24 +264,29 @@ Tcl_GetIndexFromObjStruct(interp, objPtr, tablePtr, offset, msg, flags, /* * Produce a fancy error message. */ - int count; + int count = 0; TclNewObj(resultPtr); Tcl_SetObjResult(interp, resultPtr); + entryPtr = tablePtr; + while ((*entryPtr != NULL) && !**entryPtr) { + entryPtr = NEXT_ENTRY(entryPtr, offset); + } Tcl_AppendStringsToObj(resultPtr, (numAbbrev > 1) && !(flags & TCL_EXACT) ? "ambiguous " : "bad ", msg, " \"", - key, "\": must be ", STRING_AT(tablePtr,offset,0), (char*)NULL); - for (entryPtr = NEXT_ENTRY(tablePtr, offset), count = 0; - *entryPtr != NULL; - entryPtr = NEXT_ENTRY(entryPtr, offset), count++) { + key, "\": must be ", *entryPtr, (char*)NULL); + entryPtr = NEXT_ENTRY(entryPtr, offset); + while (*entryPtr != NULL) { if (*NEXT_ENTRY(entryPtr, offset) == NULL) { Tcl_AppendStringsToObj(resultPtr, (count > 0) ? ", or " : " or ", *entryPtr, (char *) NULL); - } else { + } else if (**entryPtr) { Tcl_AppendStringsToObj(resultPtr, ", ", *entryPtr, (char *) NULL); + count++; } + entryPtr = NEXT_ENTRY(entryPtr, offset); } } return TCL_ERROR; |
