aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/Document.cxx12
-rw-r--r--src/UniConversion.cxx25
-rw-r--r--src/UniConversion.h4
-rw-r--r--win32/PlatWin.cxx6
4 files changed, 33 insertions, 14 deletions
diff --git a/src/Document.cxx b/src/Document.cxx
index f9cd654c7..4df512b1d 100644
--- a/src/Document.cxx
+++ b/src/Document.cxx
@@ -3058,17 +3058,9 @@ Sci::Position Cxx11RegexFindText(const Document *doc, Sci::Position minPos, Sci:
bool matched = false;
if (SC_CP_UTF8 == doc->dbcsCodePage) {
- const std::string_view sv(s);
- const size_t lenS = sv.length();
- std::vector<wchar_t> ws(sv.length() + 1);
-#if WCHAR_T_IS_16
- const size_t outLen = UTF16FromUTF8(sv, &ws[0], lenS);
-#else
- const size_t outLen = UTF32FromUTF8(sv, reinterpret_cast<unsigned int *>(&ws[0]), lenS);
-#endif
- ws[outLen] = 0;
+ const std::wstring ws = WStringFromUTF8(s);
std::wregex regexp;
- regexp.assign(&ws[0], flagsRe);
+ regexp.assign(ws, flagsRe);
matched = MatchOnLines<UTF8Iterator>(doc, regexp, resr, search);
} else {
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);
diff --git a/src/UniConversion.h b/src/UniConversion.h
index c676230da..a0a1f1a56 100644
--- a/src/UniConversion.h
+++ b/src/UniConversion.h
@@ -20,7 +20,11 @@ void UTF8FromUTF16(std::wstring_view wsv, char *putf, size_t len);
void UTF8FromUTF32Character(int uch, char *putf);
size_t UTF16Length(std::string_view sv);
size_t UTF16FromUTF8(std::string_view sv, wchar_t *tbuf, size_t tlen);
+size_t UTF32Length(std::string_view svu8) noexcept;
size_t UTF32FromUTF8(std::string_view sv, unsigned int *tbuf, size_t tlen);
+// WStringFromUTF8 does the right thing when wchar_t is 2 or 4 bytes so
+// works on both Windows and Unix.
+std::wstring WStringFromUTF8(std::string_view svu8);
unsigned int UTF16FromUTF32Character(unsigned int val, wchar_t *tbuf) noexcept;
bool UTF8IsValid(std::string_view sv) noexcept;
std::string FixInvalidUTF8(const std::string &text);
diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx
index e407bd630..766c91ef9 100644
--- a/win32/PlatWin.cxx
+++ b/win32/PlatWin.cxx
@@ -296,12 +296,10 @@ FontID CreateFontFromParameters(const FontParameters &fp) {
} else {
#if defined(USE_D2D)
IDWriteTextFormat *pTextFormat = nullptr;
- const int faceSize = 200;
- WCHAR wszFace[faceSize] = L"";
- UTF16FromUTF8(fp.faceName, wszFace, faceSize);
+ const std::wstring wsFace = WStringFromUTF8(fp.faceName);
const FLOAT fHeight = fp.size;
const DWRITE_FONT_STYLE style = fp.italic ? DWRITE_FONT_STYLE_ITALIC : DWRITE_FONT_STYLE_NORMAL;
- HRESULT hr = pIDWriteFactory->CreateTextFormat(wszFace, nullptr,
+ HRESULT hr = pIDWriteFactory->CreateTextFormat(wsFace.c_str(), nullptr,
static_cast<DWRITE_FONT_WEIGHT>(fp.weight),
style,
DWRITE_FONT_STRETCH_NORMAL, fHeight, L"en-us", &pTextFormat);