aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/UniConversion.h
diff options
context:
space:
mode:
authorZufu Liu <unknown>2018-03-24 13:53:22 +1100
committerZufu Liu <unknown>2018-03-24 13:53:22 +1100
commit0bb4d5456748c8794a943b4716ee089d0590519c (patch)
treed3a1f8654824ca8f6e9892cb0ae9b8ce172efed4 /src/UniConversion.h
parentf3830c19917c254dcddfd272518a7b749fe89129 (diff)
downloadscintilla-mirror-0bb4d5456748c8794a943b4716ee089d0590519c.tar.gz
Feature [feature-requests:#1212]. Move Unicode conversions into UniConversion.
Move Unicode conversion functions UnicodeFromUTF8 and UTF8FromUTF32Character into UniConversion.
Diffstat (limited to 'src/UniConversion.h')
-rw-r--r--src/UniConversion.h16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/UniConversion.h b/src/UniConversion.h
index 0f22c06e6..98bcd0329 100644
--- a/src/UniConversion.h
+++ b/src/UniConversion.h
@@ -16,6 +16,7 @@ const int unicodeReplacementChar = 0xFFFD;
size_t UTF8Length(const wchar_t *uptr, size_t tlen);
void UTF8FromUTF16(const wchar_t *uptr, size_t tlen, char *putf, size_t len);
+void UTF8FromUTF32Character(int uch, char *putf);
size_t UTF16Length(const char *s, size_t len);
size_t UTF16FromUTF8(const char *s, size_t len, wchar_t *tbuf, size_t tlen);
size_t UTF32FromUTF8(const char *s, size_t len, unsigned int *tbuf, size_t tlen);
@@ -24,6 +25,19 @@ std::string FixInvalidUTF8(const std::string &text);
extern const unsigned char UTF8BytesOfLead[256];
+inline int UnicodeFromUTF8(const unsigned char *us) {
+ switch (UTF8BytesOfLead[us[0]]) {
+ case 1:
+ return us[0];
+ case 2:
+ return ((us[0] & 0x1F) << 6) + (us[1] & 0x3F);
+ case 3:
+ return ((us[0] & 0xF) << 12) + ((us[1] & 0x3F) << 6) + (us[2] & 0x3F);
+ default:
+ return ((us[0] & 0x7) << 18) + ((us[1] & 0x3F) << 12) + ((us[2] & 0x3F) << 6) + (us[3] & 0x3F);
+ }
+}
+
inline bool UTF8IsTrailByte(unsigned char ch) {
return (ch >= 0x80) && (ch < 0xc0);
}
@@ -63,7 +77,7 @@ inline unsigned int UTF16CharLength(wchar_t uch) {
}
inline unsigned int UTF16LengthFromUTF8ByteCount(unsigned int byteCount) {
- return (byteCount < 4) ? 1 : 2;
+ return (byteCount < 4) ? 1 : 2;
}
}