diff options
author | dgp <dgp@users.sourceforge.net> | 2018-11-13 21:04:19 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2018-11-13 21:04:19 (GMT) |
commit | ad8c23540cd977b9e923053d0e86a56207761680 (patch) | |
tree | 141d7a82c5cb9b47ac8b675fef1c021a520d40ed /macosx | |
parent | 4e39644e1e0b2c89d06189ae0d14527235499bd1 (diff) | |
parent | f7dfeb706fb75bccd0aae6cd6119fccdfb6bd8d0 (diff) | |
download | tcl-ad8c23540cd977b9e923053d0e86a56207761680.zip tcl-ad8c23540cd977b9e923053d0e86a56207761680.tar.gz tcl-ad8c23540cd977b9e923053d0e86a56207761680.tar.bz2 |
Implement TIP 445
Diffstat (limited to 'macosx')
-rw-r--r-- | macosx/tclMacOSXFCmd.c | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/macosx/tclMacOSXFCmd.c b/macosx/tclMacOSXFCmd.c index f33cdf4..ab9b74f 100644 --- a/macosx/tclMacOSXFCmd.c +++ b/macosx/tclMacOSXFCmd.c @@ -692,24 +692,28 @@ UpdateStringOfOSType( register Tcl_Obj *objPtr) /* OSType object whose string rep to * update. */ { - char string[5]; + const int size = TCL_UTF_MAX * 4; + char *dst = Tcl_InitStringRep(objPtr, NULL, size); OSType osType = (OSType) objPtr->internalRep.longValue; - Tcl_DString ds; - Tcl_Encoding encoding = Tcl_GetEncoding(NULL, "macRoman"); - unsigned len; - - string[0] = (char) (osType >> 24); - string[1] = (char) (osType >> 16); - string[2] = (char) (osType >> 8); - string[3] = (char) (osType); - string[4] = '\0'; - Tcl_ExternalToUtfDString(encoding, string, -1, &ds); - len = (unsigned) Tcl_DStringLength(&ds) + 1; - objPtr->bytes = Tcl_Alloc(len); - memcpy(objPtr->bytes, Tcl_DStringValue(&ds), len); - objPtr->length = Tcl_DStringLength(&ds); - Tcl_DStringFree(&ds); + int written = 0; + Tcl_Encoding encoding; + char src[5]; + + TclOOM(dst, size); + + src[0] = (char) (osType >> 24); + src[1] = (char) (osType >> 16); + src[2] = (char) (osType >> 8); + src[3] = (char) (osType); + src[4] = '\0'; + + encoding = Tcl_GetEncoding(NULL, "macRoman"); + Tcl_ExternalToUtf(NULL, encoding, src, -1, /* flags */ 0, + /* statePtr */ NULL, dst, size, /* srcReadPtr */ NULL, + /* dstWrotePtr */ &written, /* dstCharsPtr */ NULL); Tcl_FreeEncoding(encoding); + + (void)Tcl_InitStringRep(objPtr, NULL, written); } /* |