summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2015-10-07 08:40:23 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2015-10-07 08:40:23 (GMT)
commit6524bed322ce1bc175f6fd8df81558b8cdd17ee6 (patch)
treefe0feaa7c3072b1c0a3936dd8f3179b9fa43d0df
parentcfea006a9d30352c695b25ca4a3d4f4416be54b9 (diff)
downloadtcl-6524bed322ce1bc175f6fd8df81558b8cdd17ee6.zip
tcl-6524bed322ce1bc175f6fd8df81558b8cdd17ee6.tar.gz
tcl-6524bed322ce1bc175f6fd8df81558b8cdd17ee6.tar.bz2
Fix surrogate handling in PrintSourceToObj(), differenciating for TCL_UTF_MAX = 6 (androwish) and TCL_UTF_MAX = 4 (tip-389-impl). No effect when TCL_UTF_MAX = 3.
-rw-r--r--generic/tclDisassemble.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/generic/tclDisassemble.c b/generic/tclDisassemble.c
index 15502e7..86f0e1d 100644
--- a/generic/tclDisassemble.c
+++ b/generic/tclDisassemble.c
@@ -833,8 +833,19 @@ PrintSourceToObj(
continue;
default:
#if TCL_UTF_MAX > 4
- if ((int) ch > 0xffff) {
- Tcl_AppendPrintfToObj(appendObj, "\\U%08x", (int) ch);
+ if (ch > 0xffff) {
+ Tcl_AppendPrintfToObj(appendObj, "\\U%08x", ch);
+ i += 10;
+ } else
+#elif TCL_UTF_MAX > 3
+ /* If len == 0, this means we have a char > 0xffff, resulting in
+ * TclUtfToUniChar producing a surrogate pair. We want to output
+ * this pair as a single Unicode character.
+ */
+ if (len == 0) {
+ int upper = ((ch & 0x3ff) + 1) << 10;
+ len = TclUtfToUniChar(p, &ch);
+ Tcl_AppendPrintfToObj(appendObj, "\\U%08x", upper + (ch & 0x3ff));
i += 10;
} else
#endif