diff options
Diffstat (limited to 'src/corelib/tools')
-rw-r--r-- | src/corelib/tools/qchar.cpp | 35 | ||||
-rw-r--r-- | src/corelib/tools/qstring.cpp | 13 | ||||
-rw-r--r-- | src/corelib/tools/qunicodetables_p.h | 2 |
3 files changed, 39 insertions, 11 deletions
diff --git a/src/corelib/tools/qchar.cpp b/src/corelib/tools/qchar.cpp index 3034e430ef..74df59ab5b 100644 --- a/src/corelib/tools/qchar.cpp +++ b/src/corelib/tools/qchar.cpp @@ -1053,33 +1053,48 @@ template <typename T> static inline T toLowerCase_helper(T uc) { const QUnicodeTables::Properties *p = qGetProp(uc); - if (!p->lowerCaseSpecial) - return uc + p->lowerCaseDiff; - return uc; + if (p->lowerCaseSpecial) { + const ushort *specialCase = specialCaseMap + p->lowerCaseDiff; + if (*specialCase == 1) + return specialCase[1]; + } + return uc + p->lowerCaseDiff; } template <typename T> static inline T toUpperCase_helper(T uc) { const QUnicodeTables::Properties *p = qGetProp(uc); - if (!p->upperCaseSpecial) - return uc + p->upperCaseDiff; - return uc; + if (p->upperCaseSpecial) { + const ushort *specialCase = specialCaseMap + p->upperCaseDiff; + if (*specialCase == 1) + return specialCase[1]; + } + return uc + p->upperCaseDiff; } template <typename T> static inline T toTitleCase_helper(T uc) { const QUnicodeTables::Properties *p = qGetProp(uc); - if (!p->titleCaseSpecial) - return uc + p->titleCaseDiff; - return uc; + if (p->titleCaseSpecial) { + const ushort *specialCase = specialCaseMap + p->titleCaseDiff; + if (*specialCase == 1) + return specialCase[1]; + } + return uc + p->titleCaseDiff; } template <typename T> static inline T toCaseFolded_helper(T uc) { - return uc + qGetProp(uc)->caseFoldDiff; + const QUnicodeTables::Properties *p = qGetProp(uc); + if (p->caseFoldSpecial) { + const ushort *specialCase = specialCaseMap + p->caseFoldDiff; + if (*specialCase == 1) + return specialCase[1]; + } + return uc + p->caseFoldDiff; } /*! diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index 65b52f3229..39747aa3e9 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -5263,7 +5263,20 @@ QString QString::toCaseFolded() const prop = qGetProp(*p); } if (prop->caseFoldSpecial) { + const ushort *specialCase = specialCaseMap + prop->caseFoldDiff; + ushort length = *specialCase++; +#if 0 + int pos = pp - s.d->data; + s.resize(s.d->size + length - 1); + pp = s.d->data + pos; + while (length--) + *pp++ = *specialCase++; +#else //### we currently don't support full case foldings + Q_ASSERT(length == 1); + Q_UNUSED(length) + *pp++ = *specialCase; +#endif } else { *pp++ = *p + prop->caseFoldDiff; } diff --git a/src/corelib/tools/qunicodetables_p.h b/src/corelib/tools/qunicodetables_p.h index 0b8115035c..d8f8340673 100644 --- a/src/corelib/tools/qunicodetables_p.h +++ b/src/corelib/tools/qunicodetables_p.h @@ -76,7 +76,7 @@ namespace QUnicodeTables { ushort lowerCaseSpecial : 1; ushort upperCaseSpecial : 1; ushort titleCaseSpecial : 1; - ushort caseFoldSpecial : 1; /* currently unused */ + ushort caseFoldSpecial : 1; signed short mirrorDiff : 16; signed short lowerCaseDiff : 16; signed short upperCaseDiff : 16; |