summaryrefslogtreecommitdiffstats
path: root/generic/tclUtf.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2022-03-03 13:05:38 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2022-03-03 13:05:38 (GMT)
commitb488f3edf6ee202281aca13745c0d4212310f654 (patch)
tree068d3d40fef160ee211303889016729e228b15ec /generic/tclUtf.c
parent9a1c1f5e11679feeaafd9c788631fc98faf6945e (diff)
downloadtcl-b488f3edf6ee202281aca13745c0d4212310f654.zip
tcl-b488f3edf6ee202281aca13745c0d4212310f654.tar.gz
tcl-b488f3edf6ee202281aca13745c0d4212310f654.tar.bz2
TIP #619 implementation. tests not working yet
Diffstat (limited to 'generic/tclUtf.c')
-rw-r--r--generic/tclUtf.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/generic/tclUtf.c b/generic/tclUtf.c
index e353b7f..a04e41c 100644
--- a/generic/tclUtf.c
+++ b/generic/tclUtf.c
@@ -208,15 +208,23 @@ Invalid(
*---------------------------------------------------------------------------
*/
+#undef Tcl_UniCharToUtf
int
Tcl_UniCharToUtf(
int ch, /* The Tcl_UniChar to be stored in the
- * buffer. */
+ * buffer. Can be or'ed with flag TCL_COMBINE */
char *buf) /* Buffer in which the UTF-8 representation of
* the Tcl_UniChar is stored. Buffer must be
* large enough to hold the UTF-8 character
* (at most 4 bytes). */
{
+#if TCL_UTF_MAX > 3
+ int flags = ch;
+#endif
+
+ if (ch >= TCL_COMBINE) {
+ ch &= (TCL_COMBINE - 1);
+ }
if ((unsigned)(ch - 1) < (UNICODE_SELF - 1)) {
buf[0] = (char) ch;
return 1;
@@ -228,7 +236,11 @@ Tcl_UniCharToUtf(
return 2;
}
if (ch <= 0xFFFF) {
- if ((ch & 0xF800) == 0xD800) {
+ if (
+#if TCL_UTF_MAX > 3
+ (flags & TCL_COMBINE) &&
+#endif
+ ((ch & 0xF800) == 0xD800)) {
if (ch & 0x0400) {
/* Low surrogate */
if (((buf[0] & 0xC0) == 0x80) && ((buf[1] & 0xCF) == 0)) {
@@ -377,7 +389,7 @@ Tcl_Char16ToUtfDString(
/* Special case for handling high surrogates. */
p += Tcl_UniCharToUtf(-1, p);
}
- len = Tcl_UniCharToUtf(*w, p);
+ len = Tcl_UniCharToUtf(*w | TCL_COMBINE, p);
p += len;
if ((*w >= 0xD800) && (len < 3)) {
len = 0; /* Indication that high surrogate was found */