diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2017-06-08 12:53:31 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2017-06-08 12:53:31 (GMT) |
commit | 381ed7be7a4f2a552dd98af85e52f489f1f077ba (patch) | |
tree | a4053c1797329b9c215523321b29f76f51898dbc /generic | |
parent | 74d42f2fe9fc80e12aa490ffea731ac8114183b5 (diff) | |
parent | 7bf7c6e7d90d4b7913115508c91115db89868d48 (diff) | |
download | tcl-381ed7be7a4f2a552dd98af85e52f489f1f077ba.zip tcl-381ed7be7a4f2a552dd98af85e52f489f1f077ba.tar.gz tcl-381ed7be7a4f2a552dd98af85e52f489f1f077ba.tar.bz2 |
merge core-8-6-branch
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tclUtil.c | 47 |
1 files changed, 35 insertions, 12 deletions
diff --git a/generic/tclUtil.c b/generic/tclUtil.c index b30a1d0..91cc3b4 100644 --- a/generic/tclUtil.c +++ b/generic/tclUtil.c @@ -2162,9 +2162,14 @@ Tcl_StringCaseMatch( * This is a special case optimization for single-byte utf. */ - TclUtfToUniChar(pattern, &ch2); - if (nocase) { - ch2 = Tcl_UniCharToLower(ch2); + if (UCHAR(*pattern) < 0x80) { + ch2 = (Tcl_UniChar) + (nocase ? tolower(UCHAR(*pattern)) : UCHAR(*pattern)); + } else { + Tcl_UtfToUniChar(pattern, &ch2); + if (nocase) { + ch2 = Tcl_UniCharToLower(ch2); + } } while (1) { @@ -2230,26 +2235,44 @@ Tcl_StringCaseMatch( Tcl_UniChar startChar, endChar; pattern++; - str += TclUtfToUniChar(str, &ch1); - if (nocase) { - ch1 = Tcl_UniCharToLower(ch1); + if (UCHAR(*str) < 0x80) { + ch1 = (Tcl_UniChar) + (nocase ? tolower(UCHAR(*str)) : UCHAR(*str)); + str++; + } else { + str += Tcl_UtfToUniChar(str, &ch1); + if (nocase) { + ch1 = Tcl_UniCharToLower(ch1); + } } while (1) { if ((*pattern == ']') || (*pattern == '\0')) { return 0; } - pattern += TclUtfToUniChar(pattern, &startChar); - if (nocase) { - startChar = Tcl_UniCharToLower(startChar); + if (UCHAR(*pattern) < 0x80) { + startChar = (Tcl_UniChar) (nocase + ? tolower(UCHAR(*pattern)) : UCHAR(*pattern)); + pattern++; + } else { + pattern += Tcl_UtfToUniChar(pattern, &startChar); + if (nocase) { + startChar = Tcl_UniCharToLower(startChar); + } } if (*pattern == '-') { pattern++; if (*pattern == '\0') { return 0; } - pattern += TclUtfToUniChar(pattern, &endChar); - if (nocase) { - endChar = Tcl_UniCharToLower(endChar); + if (UCHAR(*pattern) < 0x80) { + endChar = (Tcl_UniChar) (nocase + ? tolower(UCHAR(*pattern)) : UCHAR(*pattern)); + pattern++; + } else { + pattern += Tcl_UtfToUniChar(pattern, &endChar); + if (nocase) { + endChar = Tcl_UniCharToLower(endChar); + } } if (((startChar <= ch1) && (ch1 <= endChar)) || ((endChar <= ch1) && (ch1 <= startChar))) { |