aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/UniConversion.cxx
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2019-03-20 19:18:57 +1100
committerNeil <nyamatongwe@gmail.com>2019-03-20 19:18:57 +1100
commita09fe66e667ed2b91a4c953e74cf6b1abaaa919f (patch)
treeee20504b3c678e28da9c8510669479d135bb7240 /src/UniConversion.cxx
parent37e58367e8b48e53032f1849de570668811e81fb (diff)
downloadscintilla-mirror-a09fe66e667ed2b91a4c953e74cf6b1abaaa919f.tar.gz
Implement WStringFromUTF8 to simplify code that creates wstring objects for
regular expressions and calling the Win32 API.
Diffstat (limited to 'src/UniConversion.cxx')
-rw-r--r--src/UniConversion.cxx25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/UniConversion.cxx b/src/UniConversion.cxx
index 58475687b..a695b0f3c 100644
--- a/src/UniConversion.cxx
+++ b/src/UniConversion.cxx
@@ -175,6 +175,17 @@ size_t UTF16FromUTF8(std::string_view sv, wchar_t *tbuf, size_t tlen) {
return ui;
}
+size_t UTF32Length(std::string_view svu8) noexcept {
+ size_t ulen = 0;
+ for (size_t i = 0; i < svu8.length();) {
+ const unsigned char ch = svu8[i];
+ const unsigned int byteCount = UTF8BytesOfLead[ch];
+ i += byteCount;
+ ulen++;
+ }
+ return ulen;
+}
+
size_t UTF32FromUTF8(std::string_view sv, unsigned int *tbuf, size_t tlen) {
size_t ui = 0;
for (size_t i = 0; i < sv.length();) {
@@ -228,6 +239,20 @@ size_t UTF32FromUTF8(std::string_view sv, unsigned int *tbuf, size_t tlen) {
return ui;
}
+std::wstring WStringFromUTF8(std::string_view svu8) {
+ if constexpr (sizeof(wchar_t) == 2) {
+ const size_t len16 = UTF16Length(svu8);
+ std::wstring ws(len16, 0);
+ UTF16FromUTF8(svu8, &ws[0], len16);
+ return ws;
+ } else {
+ const size_t len32 = UTF32Length(svu8);
+ std::wstring ws(len32, 0);
+ UTF32FromUTF8(svu8, reinterpret_cast<unsigned int *>(&ws[0]), len32);
+ return ws;
+ }
+}
+
unsigned int UTF16FromUTF32Character(unsigned int val, wchar_t *tbuf) noexcept {
if (val < SUPPLEMENTAL_PLANE_FIRST) {
tbuf[0] = static_cast<wchar_t>(val);