summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2020-04-06 21:28:26 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2020-04-06 21:28:26 (GMT)
commitd2461c317277de62c02fa2f1d757a41c7bc1b06e (patch)
tree2b25b3d22463500bc2914c1f4b3040efe4d78175
parentd0f56684e57c15c590975be1a7f608b170a3ee40 (diff)
parent62a467f50761835b22b455d6ff0105b2e4bbe4dd (diff)
downloadtk-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.c2
-rw-r--r--generic/tkUtil.c20
-rw-r--r--generic/ttk/ttkEntry.c2
-rw-r--r--macosx/tkMacOSXFont.c2
-rw-r--r--win/tkWinFont.c2
-rw-r--r--win/tkWinKey.c2
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) {