diff options
Diffstat (limited to 'generic/tclEncoding.c')
| -rw-r--r-- | generic/tclEncoding.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/generic/tclEncoding.c b/generic/tclEncoding.c index 6c16827..d948189 100644 --- a/generic/tclEncoding.c +++ b/generic/tclEncoding.c @@ -2359,13 +2359,12 @@ UnicodeToUtfProc( const char *srcStart, *srcEnd; char *dstEnd, *dstStart; int result, numChars; - Tcl_UniChar ch; + unsigned short ch; result = TCL_OK; - if ((srcLen % sizeof(Tcl_UniChar)) != 0) { + if ((srcLen & 1) != 0) { result = TCL_CONVERT_MULTIBYTE; - srcLen /= sizeof(Tcl_UniChar); - srcLen *= sizeof(Tcl_UniChar); + srcLen--; } srcStart = src; @@ -2383,13 +2382,13 @@ UnicodeToUtfProc( * Special case for 1-byte utf chars for speed. Make sure we * work with Tcl_UniChar-size data. */ - ch = *(Tcl_UniChar *)src; + ch = *(unsigned short *)src; if (ch && ch < 0x80) { *dst++ = (ch & 0xFF); } else { dst += Tcl_UniCharToUtf(ch, dst); } - src += sizeof(Tcl_UniChar); + src += sizeof(unsigned short); } *srcReadPtr = src - srcStart; @@ -2477,6 +2476,11 @@ UtfToUnicodeProc( * by casting dst to a Tcl_UniChar. [Bug 1122671] * XXX: This hard-codes the assumed size of Tcl_UniChar as 2. */ +#if TCL_UTF_MAX > 3 + if (ch & ~0xFFFF) { + ch = 0xFFFD; + } else +#endif #ifdef WORDS_BIGENDIAN *dst++ = (ch >> 8); *dst++ = (ch & 0xFF); |
