summaryrefslogtreecommitdiffstats
path: root/generic/tkUtil.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2020-05-19 14:02:02 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2020-05-19 14:02:02 (GMT)
commit51d384bfda7a3eb5a915b19d343c8bb657268d75 (patch)
tree5d397a27a26ba1f1486439d759196d0528f83248 /generic/tkUtil.c
parent5204a77ccd7306b8ed7c3c264c88171f68180efd (diff)
downloadtk-51d384bfda7a3eb5a915b19d343c8bb657268d75.zip
tk-51d384bfda7a3eb5a915b19d343c8bb657268d75.tar.gz
tk-51d384bfda7a3eb5a915b19d343c8bb657268d75.tar.bz2
New (internal) function TkUtfPrev(). This function can handle 4-byte (illegal) byte-sequences, arising when pasting Emoji on a Text widget on MacOS (for example)
Diffstat (limited to 'generic/tkUtil.c')
-rw-r--r--generic/tkUtil.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/generic/tkUtil.c b/generic/tkUtil.c
index 7a15410..805a47c 100644
--- a/generic/tkUtil.c
+++ b/generic/tkUtil.c
@@ -1264,9 +1264,46 @@ int TkUniCharToUtf(int ch, char *buf)
}
return Tcl_UniCharToUtf(ch, buf);
}
+/*
+ *---------------------------------------------------------------------------
+ *
+ * TkUtfPrev --
+ *
+ * Almost the same as Tcl_UtfPrev.
+ * This function is capable of jumping over a upper/lower surrogate pair.
+ * So, might jump back up to 6 bytes.
+ *
+ * Results:
+ * pointer to the first byte of the current UTF-8 character. A surrogate
+ * pair is also handled as being a single entity.
+ *
+ * Side effects:
+ * None.
+ *
+ *---------------------------------------------------------------------------
+ */
+
+const char *
+TkUtfPrev(
+ const char *src, /* The UTF-8 string. */
+ const char *start) /* Start position of string */
+{
+ const char *p = Tcl_UtfPrev(src, start);
+ const char *first = Tcl_UtfPrev(p, start);
+ int ch;
+
+#if TCL_UTF_MAX == 3
+ if ((src - start > 3) && ((src[-1] & 0xC0) == 0x80) && ((src[-2] & 0xC0) == 0x80)
+ && ((src[-3] & 0xC0) == 0x80) && (UCHAR(src[-4]) >= 0xF0)) {
+ return src - 4;
+ }
+#endif
+ return (first + TkUtfToUniChar(first, &ch) >= src) ? first : p ;
+}
#endif
+
/*
* Local Variables:
* mode: c