aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--gtk/ScintillaGTK.cxx83
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;
}
}