| ︙ | | |
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
-
|
/*
* Functions used only in this module.
*/
static int UtfCount(int ch);
static int Invalid(unsigned char *src);
static int UCS4ToUpper(int ch);
static int UCS4ToLower(int ch);
static int UCS4ToTitle(int ch);
/*
*---------------------------------------------------------------------------
*
* UtfCount --
*
|
| ︙ | | |
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
|
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
|
-
+
|
/*
* Iterate over the string until we hit the terminating null.
*/
src = dst = str;
while (*src) {
len = TclUtfToUCS4(src, &ch);
lowChar = UCS4ToLower(ch);
lowChar = TclUCS4ToLower(ch);
/*
* To keep badly formed Utf strings from getting inflated by the
* conversion (thereby causing a segfault), only copy the lower case
* char to dst if its size is <= the original char.
*/
|
| ︙ | | |
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
|
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
|
-
+
|
src += len;
}
while (*src) {
len = TclUtfToUCS4(src, &ch);
lowChar = ch;
/* Special exception for Georgian Asomtavruli chars, no titlecase. */
if ((unsigned)(lowChar - 0x1C90) >= 0x30) {
lowChar = UCS4ToLower(lowChar);
lowChar = TclUCS4ToLower(lowChar);
}
if (len < UtfCount(lowChar) || ((lowChar & ~0x7FF) == 0xD800)) {
memmove(dst, src, len);
dst += len;
} else {
dst += Tcl_UniCharToUtf(lowChar, dst);
|
| ︙ | | |
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
|
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
|
-
-
+
+
-
+
|
*/
cs += TclUtfToUniChar(cs, &ch1);
ct += TclUtfToUniChar(ct, &ch2);
if (ch1 != ch2) {
#if TCL_UTF_MAX == 4
/* Surrogates always report higher than non-surrogates */
if (((ch1 & 0xFC00) == 0xD800)) {
if ((ch2 & 0xFC00) != 0xD800) {
if (((ch1 & ~0x3FF) == 0xD800)) {
if ((ch2 & ~0x3FF) != 0xD800) {
return ch1;
}
} else if ((ch2 & 0xFC00) == 0xD800) {
} else if ((ch2 & ~0x3FF) == 0xD800) {
return -ch2;
}
#endif
return (ch1 - ch2);
}
}
return 0;
|
| ︙ | | |
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
|
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
|
-
-
+
+
-
+
|
*
* Side effects:
* None.
*
*----------------------------------------------------------------------
*/
static int
UCS4ToLower(
int
TclUCS4ToLower(
int ch) /* Unicode character to convert. */
{
if (!UNICODE_OUT_OF_RANGE(ch)) {
int info = GetUniCharInfo(ch);
int mode = GetCaseType(info);
if ((mode & 0x02) && (mode != 0x7)) {
ch += GetDelta(info);
}
}
/* Clear away extension bits, if any */
return ch & 0x1FFFFF;
}
Tcl_UniChar
Tcl_UniCharToLower(
int ch) /* Unicode character to convert. */
{
return (Tcl_UniChar) UCS4ToLower(ch);
return (Tcl_UniChar) TclUCS4ToLower(ch);
}
/*
*----------------------------------------------------------------------
*
* Tcl_UniCharToTitle --
*
|
| ︙ | | |