diff options
author | dgp <dgp@users.sourceforge.net> | 2020-04-27 12:57:35 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2020-04-27 12:57:35 (GMT) |
commit | e0b9dbb21d7916513a0e4f371935a2ed6ad79302 (patch) | |
tree | d200ad4c3178b61b1511db22119c669488757500 /generic/tclUtf.c | |
parent | 1c0f9c6c22f3dd731de54dbe2910d125985efc55 (diff) | |
parent | bdb10b8e7d85c04dbb38419f365949163829cb8f (diff) | |
download | tcl-e0b9dbb21d7916513a0e4f371935a2ed6ad79302.zip tcl-e0b9dbb21d7916513a0e4f371935a2ed6ad79302.tar.gz tcl-e0b9dbb21d7916513a0e4f371935a2ed6ad79302.tar.bz2 |
merge 8.6
Diffstat (limited to 'generic/tclUtf.c')
-rw-r--r-- | generic/tclUtf.c | 61 |
1 files changed, 16 insertions, 45 deletions
diff --git a/generic/tclUtf.c b/generic/tclUtf.c index 1138372..19e1365 100644 --- a/generic/tclUtf.c +++ b/generic/tclUtf.c @@ -96,6 +96,11 @@ static const unsigned char complete[256] = { */ static int Invalid(unsigned char *src); + +#define UCS4ToUpper Tcl_UniCharToUpper +#define UCS4ToLower Tcl_UniCharToLower +#define UCS4ToTitle Tcl_UniCharToTitle + /* *--------------------------------------------------------------------------- @@ -1219,8 +1224,7 @@ int Tcl_UtfToUpper( char *str) /* String to convert in place. */ { - Tcl_UniChar ch = 0; - int upChar; + int ch, upChar; char *src, *dst; int len; @@ -1230,16 +1234,8 @@ Tcl_UtfToUpper( src = dst = str; while (*src) { - len = TclUtfToUniChar(src, &ch); - upChar = ch; -#if TCL_UTF_MAX <= 3 - if ((ch >= 0xD800) && (len < 3)) { - len += TclUtfToUniChar(src + len, &ch); - /* Combine surrogates */ - upChar = (((upChar & 0x3FF) << 10) | (ch & 0x3FF)) + 0x10000; - } -#endif - upChar = Tcl_UniCharToUpper(upChar); + len = TclUtfToUCS4(src, &ch); + upChar = UCS4ToUpper(ch); /* * To keep badly formed Utf strings from getting inflated by the @@ -1281,8 +1277,7 @@ int Tcl_UtfToLower( char *str) /* String to convert in place. */ { - Tcl_UniChar ch = 0; - int lowChar; + int ch, lowChar; char *src, *dst; int len; @@ -1292,16 +1287,8 @@ Tcl_UtfToLower( src = dst = str; while (*src) { - len = TclUtfToUniChar(src, &ch); - lowChar = ch; -#if TCL_UTF_MAX <= 3 - if ((ch >= 0xD800) && (len < 3)) { - len += TclUtfToUniChar(src + len, &ch); - /* Combine surrogates */ - lowChar = (((lowChar & 0x3FF) << 10) | (ch & 0x3FF)) + 0x10000; - } -#endif - lowChar = Tcl_UniCharToLower(lowChar); + len = TclUtfToUCS4(src, &ch); + lowChar = UCS4ToLower(ch); /* * To keep badly formed Utf strings from getting inflated by the @@ -1344,8 +1331,7 @@ int Tcl_UtfToTitle( char *str) /* String to convert in place. */ { - Tcl_UniChar ch = 0; - int titleChar, lowChar; + int ch, titleChar, lowChar; char *src, *dst; int len; @@ -1357,16 +1343,8 @@ Tcl_UtfToTitle( src = dst = str; if (*src) { - len = TclUtfToUniChar(src, &ch); - titleChar = ch; -#if TCL_UTF_MAX <= 3 - if ((ch >= 0xD800) && (len < 3)) { - len += TclUtfToUniChar(src + len, &ch); - /* Combine surrogates */ - titleChar = (((titleChar & 0x3FF) << 10) | (ch & 0x3FF)) + 0x10000; - } -#endif - titleChar = Tcl_UniCharToTitle(titleChar); + len = TclUtfToUCS4(src, &ch); + titleChar = UCS4ToTitle(ch); if ((len < TclUtfCount(titleChar)) || ((titleChar & 0xF800) == 0xD800)) { memmove(dst, src, len); @@ -1377,18 +1355,11 @@ Tcl_UtfToTitle( src += len; } while (*src) { - len = TclUtfToUniChar(src, &ch); + len = TclUtfToUCS4(src, &ch); lowChar = ch; -#if TCL_UTF_MAX <= 3 - if ((ch >= 0xD800) && (len < 3)) { - len += TclUtfToUniChar(src + len, &ch); - /* Combine surrogates */ - lowChar = (((lowChar & 0x3FF) << 10) | (ch & 0x3FF)) + 0x10000; - } -#endif /* Special exception for Georgian Asomtavruli chars, no titlecase. */ if ((unsigned)(lowChar - 0x1C90) >= 0x30) { - lowChar = Tcl_UniCharToLower(lowChar); + lowChar = UCS4ToLower(lowChar); } if ((len < TclUtfCount(lowChar)) || ((lowChar & 0xF800) == 0xD800)) { |