diff options
Diffstat (limited to 'gtk/ScintillaGTK.cxx')
| -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;  	}  } | 
