Update to 8.5.19
This commit is contained in:
@@ -1139,7 +1139,8 @@ Tcl_AppendLimitedToObj(
|
||||
if (ellipsis == NULL) {
|
||||
ellipsis = "...";
|
||||
}
|
||||
toCopy = Tcl_UtfPrev(bytes+limit+1-strlen(ellipsis), bytes) - bytes;
|
||||
toCopy = (bytes == NULL) ? limit
|
||||
: Tcl_UtfPrev(bytes+limit+1-strlen(ellipsis), bytes) - bytes;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1386,11 +1387,12 @@ AppendUnicodeToUnicodeRep(
|
||||
* due to the reallocs below.
|
||||
*/
|
||||
int offset = -1;
|
||||
if (unicode >= stringPtr->unicode && unicode <= stringPtr->unicode
|
||||
if (unicode && unicode >= stringPtr->unicode
|
||||
&& unicode <= stringPtr->unicode
|
||||
+ stringPtr->uallocated / sizeof(Tcl_UniChar)) {
|
||||
offset = unicode - stringPtr->unicode;
|
||||
}
|
||||
|
||||
|
||||
GrowUnicodeBuffer(objPtr, numChars);
|
||||
stringPtr = GET_STRING(objPtr);
|
||||
|
||||
@@ -1405,8 +1407,10 @@ AppendUnicodeToUnicodeRep(
|
||||
* trailing null.
|
||||
*/
|
||||
|
||||
memcpy(stringPtr->unicode + stringPtr->numChars, unicode,
|
||||
appendNumChars * sizeof(Tcl_UniChar));
|
||||
if (unicode) {
|
||||
memcpy(stringPtr->unicode + stringPtr->numChars, unicode,
|
||||
appendNumChars * sizeof(Tcl_UniChar));
|
||||
}
|
||||
stringPtr->unicode[numChars] = 0;
|
||||
stringPtr->numChars = numChars;
|
||||
stringPtr->allocated = 0;
|
||||
@@ -1478,8 +1482,8 @@ AppendUtfToUnicodeRep(
|
||||
int numBytes) /* Number of bytes of "bytes" to convert. */
|
||||
{
|
||||
Tcl_DString dsPtr;
|
||||
int numChars;
|
||||
Tcl_UniChar *unicode;
|
||||
int numChars = numBytes;
|
||||
Tcl_UniChar *unicode = NULL;
|
||||
|
||||
if (numBytes < 0) {
|
||||
numBytes = (bytes ? strlen(bytes) : 0);
|
||||
@@ -1489,8 +1493,11 @@ AppendUtfToUnicodeRep(
|
||||
}
|
||||
|
||||
Tcl_DStringInit(&dsPtr);
|
||||
numChars = Tcl_NumUtfChars(bytes, numBytes);
|
||||
unicode = (Tcl_UniChar *)Tcl_UtfToUniCharDString(bytes, numBytes, &dsPtr);
|
||||
if (bytes) {
|
||||
numChars = Tcl_NumUtfChars(bytes, numBytes);
|
||||
unicode = (Tcl_UniChar *) Tcl_UtfToUniCharDString(bytes, numBytes,
|
||||
&dsPtr);
|
||||
}
|
||||
AppendUnicodeToUnicodeRep(objPtr, unicode, numChars);
|
||||
Tcl_DStringFree(&dsPtr);
|
||||
}
|
||||
@@ -1547,7 +1554,7 @@ AppendUtfToUtfRep(
|
||||
* due to the reallocs below.
|
||||
*/
|
||||
int offset = -1;
|
||||
if (bytes >= objPtr->bytes
|
||||
if (bytes && bytes >= objPtr->bytes
|
||||
&& bytes <= objPtr->bytes + objPtr->length) {
|
||||
offset = bytes - objPtr->bytes;
|
||||
}
|
||||
@@ -1568,7 +1575,7 @@ AppendUtfToUtfRep(
|
||||
unsigned int limit = INT_MAX - newLength;
|
||||
unsigned int extra = numBytes + TCL_GROWTH_MIN_ALLOC;
|
||||
int growth = (int) ((extra > limit) ? limit : extra);
|
||||
|
||||
|
||||
Tcl_SetObjLength(objPtr, newLength + growth);
|
||||
}
|
||||
|
||||
@@ -1585,7 +1592,9 @@ AppendUtfToUtfRep(
|
||||
stringPtr->numChars = -1;
|
||||
stringPtr->hasUnicode = 0;
|
||||
|
||||
memcpy(objPtr->bytes + oldLength, bytes, (size_t) numBytes);
|
||||
if (bytes) {
|
||||
memcpy(objPtr->bytes + oldLength, bytes, (size_t) numBytes);
|
||||
}
|
||||
objPtr->bytes[newLength] = 0;
|
||||
objPtr->length = newLength;
|
||||
}
|
||||
@@ -2699,6 +2708,38 @@ Tcl_ObjPrintf(
|
||||
return objPtr;
|
||||
}
|
||||
|
||||
/*
|
||||
*---------------------------------------------------------------------------
|
||||
*
|
||||
* TclGetStringStorage --
|
||||
*
|
||||
* Returns the string storage space of a Tcl_Obj.
|
||||
*
|
||||
* Results:
|
||||
* The pointer value objPtr->bytes is returned and the number of bytes
|
||||
* allocated there is written to *sizePtr (if known).
|
||||
*
|
||||
* Side effects:
|
||||
* May set objPtr->bytes.
|
||||
*
|
||||
*---------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
char *
|
||||
TclGetStringStorage(
|
||||
Tcl_Obj *objPtr,
|
||||
unsigned int *sizePtr)
|
||||
{
|
||||
String *stringPtr;
|
||||
|
||||
if (objPtr->typePtr != &tclStringType || objPtr->bytes == NULL) {
|
||||
return TclGetStringFromObj(objPtr, (int *)sizePtr);
|
||||
}
|
||||
|
||||
stringPtr = GET_STRING(objPtr);
|
||||
*sizePtr = stringPtr->allocated;
|
||||
return objPtr->bytes;
|
||||
}
|
||||
/*
|
||||
*---------------------------------------------------------------------------
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user