diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2020-04-06 21:28:26 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2020-04-06 21:28:26 (GMT) |
commit | d2461c317277de62c02fa2f1d757a41c7bc1b06e (patch) | |
tree | 2b25b3d22463500bc2914c1f4b3040efe4d78175 | |
parent | d0f56684e57c15c590975be1a7f608b170a3ee40 (diff) | |
parent | 62a467f50761835b22b455d6ff0105b2e4bbe4dd (diff) | |
download | tk-d2461c317277de62c02fa2f1d757a41c7bc1b06e.zip tk-d2461c317277de62c02fa2f1d757a41c7bc1b06e.tar.gz tk-d2461c317277de62c02fa2f1d757a41c7bc1b06e.tar.bz2 |
Better implementation of [a179564826], not depending on surrogate handling by Tcl any more
-rw-r--r-- | generic/tkEntry.c | 2 | ||||
-rw-r--r-- | generic/tkUtil.c | 20 | ||||
-rw-r--r-- | generic/ttk/ttkEntry.c | 2 | ||||
-rw-r--r-- | macosx/tkMacOSXFont.c | 2 | ||||
-rw-r--r-- | win/tkWinFont.c | 2 | ||||
-rw-r--r-- | win/tkWinKey.c | 2 |
6 files changed, 14 insertions, 16 deletions
diff --git a/generic/tkEntry.c b/generic/tkEntry.c index 00c6fc4..9c53769 100644 --- a/generic/tkEntry.c +++ b/generic/tkEntry.c @@ -1923,7 +1923,7 @@ EntryComputeGeometry( if (entryPtr->showChar != NULL) { int ch; - char buf[4]; + char buf[6]; int size; /* diff --git a/generic/tkUtil.c b/generic/tkUtil.c index cac3dc8..7a15410 100644 --- a/generic/tkUtil.c +++ b/generic/tkUtil.c @@ -1240,8 +1240,9 @@ TkUtfToUniChar( * * TkUniCharToUtf -- * - * Almost the same as Tcl_UniCharToUtf but producing 4-byte UTF-8 - * sequences even when TCL_UTF_MAX==3. So, up to 4 bytes might be produced. + * Almost the same as Tcl_UniCharToUtf but producing 2 x 3-byte UTF-8 + * sequences for out-of-bmp characters when TCL_UTF_MAX==3. + * So, up to 6 bytes might be produced. * * Results: * *buf is filled with the UTF-8 string, and the return value is the @@ -1255,16 +1256,13 @@ TkUtfToUniChar( int TkUniCharToUtf(int ch, char *buf) { - if (((unsigned)(ch - 0x10000) <= 0xFFFFF)) { - /* Spit out a 4-byte UTF-8 character */ - *buf++ = (char) ((ch >> 18) | 0xF0); - *buf++ = (char) (((ch >> 12) | 0x80) & 0xBF); - *buf++ = (char) (((ch >> 6) | 0x80) & 0xBF); - *buf = (char) ((ch | 0x80) & 0xBF); - return 4; - } else { - return Tcl_UniCharToUtf(ch, buf); + if ((sizeof(Tcl_UniChar) == 2) && (((unsigned)(ch - 0x10000) <= 0xFFFFF))) { + /* Spit out a 4-byte UTF-8 character or 2 x 3-byte UTF-8 characters, depending on Tcl + * version and/or TCL_UTF_MAX build value */ + int len = Tcl_UniCharToUtf(0xD800 | ((ch - 0x10000) >> 10), buf); + return len + Tcl_UniCharToUtf(0xDC00 | (ch & 0x7FF), buf + len); } + return Tcl_UniCharToUtf(ch, buf); } diff --git a/generic/ttk/ttkEntry.c b/generic/ttk/ttkEntry.c index 44e45de..96f3cf2 100644 --- a/generic/ttk/ttkEntry.c +++ b/generic/ttk/ttkEntry.c @@ -279,7 +279,7 @@ static char *EntryDisplayString(const char *showChar, int numChars) char *displayString, *p; int size; int ch; - char buf[4]; + char buf[6]; TkUtfToUniChar(showChar, &ch); size = TkUniCharToUtf(ch, buf); diff --git a/macosx/tkMacOSXFont.c b/macosx/tkMacOSXFont.c index c8fce8b..c3b0b66 100644 --- a/macosx/tkMacOSXFont.c +++ b/macosx/tkMacOSXFont.c @@ -176,7 +176,7 @@ TkUtfAtIndex( *code = CFStringGetLongCharacterForSurrogatePair( uniChar, lowChar); ptr += Tcl_UniCharToUtf(uniChar, ptr); - ptr += Tcl_UniCharToUtf(lowChar, ptr); + ptr += Tcl_UniCharToUtf(lowChar, ptr); return ptr - uni; } else { *code = (int) uniChar; diff --git a/win/tkWinFont.c b/win/tkWinFont.c index c430d48..cef505a 100644 --- a/win/tkWinFont.c +++ b/win/tkWinFont.c @@ -2182,7 +2182,7 @@ FontMapLoadPage( Tcl_Encoding encoding; int i, j, bitOffset, end, segCount; USHORT *startCount, *endCount; - char buf[16], src[4]; + char buf[16], src[6]; subFontPtr->fontMap[row] = (char *)ckalloc(FONTMAP_BITSPERPAGE / 8); memset(subFontPtr->fontMap[row], 0, FONTMAP_BITSPERPAGE / 8); diff --git a/win/tkWinKey.c b/win/tkWinKey.c index 29f2ff0..c7fa20c 100644 --- a/win/tkWinKey.c +++ b/win/tkWinKey.c @@ -98,7 +98,7 @@ TkpGetString( { XKeyEvent *keyEv = &eventPtr->xkey; int len; - char buf[4]; + char buf[6]; Tcl_DStringInit(dsPtr); if (keyEv->send_event == -1) { |