diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2020-05-19 14:02:02 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2020-05-19 14:02:02 (GMT) |
commit | 51d384bfda7a3eb5a915b19d343c8bb657268d75 (patch) | |
tree | 5d397a27a26ba1f1486439d759196d0528f83248 /generic/tkUtil.c | |
parent | 5204a77ccd7306b8ed7c3c264c88171f68180efd (diff) | |
download | tk-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.c | 37 |
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 |