diff options
-rw-r--r-- | gtk/ScintillaGTK.cxx | 83 |
1 files changed, 61 insertions, 22 deletions
diff --git a/gtk/ScintillaGTK.cxx b/gtk/ScintillaGTK.cxx index b7fa93d1a..ecf80a999 100644 --- a/gtk/ScintillaGTK.cxx +++ b/gtk/ScintillaGTK.cxx @@ -1090,38 +1090,77 @@ public: } }; +class CaseFolderDBCS : public CaseFolderTable { + const char *charSet; +public: + CaseFolderDBCS(const char *charSet_) : charSet(charSet_) { + StandardASCII(); + } + virtual size_t Fold(char *folded, size_t sizeFolded, const char *mixed, size_t lenMixed) { + if ((lenMixed == 1) && (sizeFolded > 0)) { + folded[0] = mapping[static_cast<unsigned char>(mixed[0])]; + return 1; + } else if (*charSet) { + int convertedLength = lenMixed; + char *sUTF8 = ConvertText(&convertedLength, const_cast<char *>(mixed), lenMixed, + "UTF-8", charSet, false); + if (sUTF8) { + gchar *mapped = g_utf8_casefold(sUTF8, strlen(sUTF8)); + size_t lenMapped = strlen(mapped); + if (lenMapped < sizeFolded) { + memcpy(folded, mapped, lenMapped); + } else { + folded[0] = '\0'; + lenMapped = 1; + } + g_free(mapped); + delete []sUTF8; + return lenMapped; + } + } + // Something failed so return a single NUL byte + folded[0] = '\0'; + return 1; + } +}; + CaseFolder *ScintillaGTK::CaseFolderForEncoding() { if (pdoc->dbcsCodePage == SC_CP_UTF8) { return new CaseFolderUTF8(); } else { - CaseFolderTable *pcf = new CaseFolderTable(); const char *charSetBuffer = CharacterSetID(); - if ((pdoc->dbcsCodePage == 0) && charSetBuffer) { - pcf->StandardASCII(); - // Only for single byte encodings - for (int i=0x80; i<0x100; i++) { - char sCharacter[2] = "A"; - sCharacter[0] = i; - int convertedLength = 1; - const char *sUTF8 = ConvertText(&convertedLength, sCharacter, 1, - "UTF-8", charSetBuffer, false); - if (sUTF8) { - gchar *mapped = g_utf8_casefold(sUTF8, strlen(sUTF8)); - if (mapped) { - int mappedLength = strlen(mapped); - const char *mappedBack = ConvertText(&mappedLength, mapped, - mappedLength, charSetBuffer, "UTF-8", false, true); - if (mappedBack && (strlen(mappedBack) == 1) && (mappedBack[0] != sCharacter[0])) { - pcf->SetTranslation(sCharacter[0], mappedBack[0]); + if (charSetBuffer) { + if (pdoc->dbcsCodePage == 0) { + CaseFolderTable *pcf = new CaseFolderTable(); + pcf->StandardASCII(); + // Only for single byte encodings + for (int i=0x80; i<0x100; i++) { + char sCharacter[2] = "A"; + sCharacter[0] = i; + int convertedLength = 1; + const char *sUTF8 = ConvertText(&convertedLength, sCharacter, 1, + "UTF-8", charSetBuffer, false); + if (sUTF8) { + gchar *mapped = g_utf8_casefold(sUTF8, strlen(sUTF8)); + if (mapped) { + int mappedLength = strlen(mapped); + const char *mappedBack = ConvertText(&mappedLength, mapped, + mappedLength, charSetBuffer, "UTF-8", false, true); + if (mappedBack && (strlen(mappedBack) == 1) && (mappedBack[0] != sCharacter[0])) { + pcf->SetTranslation(sCharacter[0], mappedBack[0]); + } + delete []mappedBack; + g_free(mapped); } - delete []mappedBack; - g_free(mapped); } + delete []sUTF8; } - delete []sUTF8; + return pcf; + } else { + return new CaseFolderDBCS(charSetBuffer); } } - return pcf; + return 0; } } |