diff options
Diffstat (limited to 'generic/tclStringObj.c')
| -rw-r--r-- | generic/tclStringObj.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c index fc599a9..4d30374 100644 --- a/generic/tclStringObj.c +++ b/generic/tclStringObj.c @@ -676,14 +676,17 @@ Tcl_GetUnicodeFromObj( Tcl_Obj * Tcl_GetRange( Tcl_Obj *objPtr, /* The Tcl object to find the range of. */ - int first, /* First index of the range. */ - int last) /* Last index of the range. */ + size_t first, /* First index of the range. */ + size_t last) /* Last index of the range. */ { Tcl_Obj *newObjPtr; /* The Tcl object to find the range of. */ String *stringPtr; int length; - if (first < 0) { + if (last == (size_t)-2) { + last = (size_t)-1; /* For compatibility with pre-9.0 behavior */ + } + if (first == (size_t)-1) { first = 0; } @@ -695,10 +698,10 @@ Tcl_GetRange( if (TclIsPureByteArray(objPtr)) { unsigned char *bytes = Tcl_GetByteArrayFromObj(objPtr, &length); - if (last >= length) { + if (last+1 >= (size_t)(unsigned int)length+1) { last = length - 1; } - if (last < first) { + if (last + 1 < first + 1) { return Tcl_NewObj(); } return Tcl_NewByteArrayObj(bytes + first, last - first + 1); @@ -720,10 +723,10 @@ Tcl_GetRange( TclNumUtfChars(stringPtr->numChars, objPtr->bytes, objPtr->length); } if (stringPtr->numChars == objPtr->length) { - if (last >= (int)stringPtr->numChars) { + if (last + 1 >= stringPtr->numChars + 1) { last = stringPtr->numChars - 1; } - if (last < first) { + if (last + 1 < first + 1) { return Tcl_NewObj(); } newObjPtr = Tcl_NewStringObj(objPtr->bytes + first, last-first+1); @@ -740,19 +743,19 @@ Tcl_GetRange( FillUnicodeRep(objPtr); stringPtr = GET_STRING(objPtr); } - if (last > (int)stringPtr->numChars) { + if (last + 1 > stringPtr->numChars + 1) { last = stringPtr->numChars; } - if (last < first) { + if (last + 1 < first + 1) { return Tcl_NewObj(); } #if TCL_UTF_MAX <= 4 /* See: bug [11ae2be95dac9417] */ - if ((first > 0) && ((stringPtr->unicode[first] & 0xFC00) == 0xDC00) + if ((first + 1 > 1) && ((stringPtr->unicode[first] & 0xFC00) == 0xDC00) && ((stringPtr->unicode[first-1] & 0xFC00) == 0xD800)) { ++first; } - if ((last + 1 < (int)stringPtr->numChars) + if ((last + 1 < stringPtr->numChars) && ((stringPtr->unicode[last+1] & 0xFC00) == 0xDC00) && ((stringPtr->unicode[last] & 0xFC00) == 0xD800)) { ++last; |
