[Lldb-commits] [lldb] [lldb] Use Locale to convert between std::wstring and std::string (NFC) (PR #112582)
via lldb-commits
lldb-commits at lists.llvm.org
Wed Oct 16 10:08:22 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lldb
Author: Jonas Devlieghere (JDevlieghere)
<details>
<summary>Changes</summary>
The codecvt header has been deprecated in C++17. Use locale to convert between std::string and std::wstring in Editline.
---
Full diff: https://github.com/llvm/llvm-project/pull/112582.diff
2 Files Affected:
- (modified) lldb/include/lldb/Host/Editline.h (-6)
- (modified) lldb/source/Host/common/Editline.cpp (+47-6)
``````````diff
diff --git a/lldb/include/lldb/Host/Editline.h b/lldb/include/lldb/Host/Editline.h
index 9049b106f02a34..57e2c831e3499d 100644
--- a/lldb/include/lldb/Host/Editline.h
+++ b/lldb/include/lldb/Host/Editline.h
@@ -30,9 +30,6 @@
#include "lldb/Host/Config.h"
-#if LLDB_EDITLINE_USE_WCHAR
-#include <codecvt>
-#endif
#include <locale>
#include <sstream>
#include <vector>
@@ -366,9 +363,6 @@ class Editline {
void SetEditLinePromptCallback(EditlinePromptCallbackType callbackFn);
void SetGetCharacterFunction(EditlineGetCharCallbackType callbackFn);
-#if LLDB_EDITLINE_USE_WCHAR
- std::wstring_convert<std::codecvt_utf8<wchar_t>> m_utf8conv;
-#endif
::EditLine *m_editline = nullptr;
EditlineHistorySP m_history_sp;
bool m_in_history = false;
diff --git a/lldb/source/Host/common/Editline.cpp b/lldb/source/Host/common/Editline.cpp
index 561ec228cdb23f..99a5003e7a83db 100644
--- a/lldb/source/Host/common/Editline.cpp
+++ b/lldb/source/Host/common/Editline.cpp
@@ -76,6 +76,46 @@ using namespace lldb_private::line_editor;
#endif // #if LLDB_EDITLINE_USE_WCHAR
+#if LLDB_EDITLINE_USE_WCHAR
+std::string ToBytes(const std::wstring &in) {
+ static std::locale locale("C.UTF-8");
+ static const auto &cvt =
+ std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>>(locale);
+
+ const size_t length = in.length();
+ std::string output(length + 1, 0x0);
+
+ std::mbstate_t mbs{};
+ const wchar_t *in_next;
+ char *out_next;
+
+ if (cvt.out(mbs, in.data(), in.data() + length + 1, in_next, output.data(),
+ output.data() + output.length() + 1,
+ out_next) == std::codecvt_base::ok)
+ return output;
+ return {};
+}
+
+std::wstring FromBytes(const std::string &in) {
+ static std::locale locale("C.UTF-8");
+ static const auto &cvt =
+ std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>>(locale);
+
+ const size_t length = in.length();
+ std::wstring output(length + 1, 0x0);
+
+ std::mbstate_t mbs{};
+ const char *in_next;
+ wchar_t *out_next;
+
+ if (cvt.in(mbs, in.data(), in.data() + length + 1, in_next, output.data(),
+ output.data() + output.length() + 1,
+ out_next) == std::codecvt_base::ok)
+ return output;
+ return {};
+}
+#endif
+
bool IsOnlySpaces(const EditLineStringType &content) {
for (wchar_t ch : content) {
if (ch != EditLineCharType(' '))
@@ -444,7 +484,7 @@ StringList Editline::GetInputAsStringList(int line_count) {
if (line_count == 0)
break;
#if LLDB_EDITLINE_USE_WCHAR
- lines.AppendString(m_utf8conv.to_bytes(line));
+ lines.AppendString(ToBytes(line));
#else
lines.AppendString(line);
#endif
@@ -636,7 +676,7 @@ unsigned char Editline::BreakLineCommand(int ch) {
if (m_fix_indentation_callback) {
StringList lines = GetInputAsStringList(m_current_line_index + 1);
#if LLDB_EDITLINE_USE_WCHAR
- lines.AppendString(m_utf8conv.to_bytes(new_line_fragment));
+ lines.AppendString(ToBytes(new_line_fragment));
#else
lines.AppendString(new_line_fragment);
#endif
@@ -685,7 +725,7 @@ unsigned char Editline::EndOrAddLineCommand(int ch) {
for (unsigned index = 0; index < lines.GetSize(); index++) {
#if LLDB_EDITLINE_USE_WCHAR
m_input_lines.insert(m_input_lines.end(),
- m_utf8conv.from_bytes(lines[index]));
+ FromBytes(lines[index]));
#else
m_input_lines.insert(m_input_lines.end(), lines[index]);
#endif
@@ -869,7 +909,7 @@ unsigned char Editline::FixIndentationCommand(int ch) {
currentLine = currentLine.erase(0, -indent_correction);
}
#if LLDB_EDITLINE_USE_WCHAR
- m_input_lines[m_current_line_index] = m_utf8conv.from_bytes(currentLine);
+ m_input_lines[m_current_line_index] = FromBytes(currentLine);
#else
m_input_lines[m_current_line_index] = currentLine;
#endif
@@ -1502,7 +1542,7 @@ bool Editline::GetLine(std::string &line, bool &interrupted) {
} else {
m_history_sp->Enter(input);
#if LLDB_EDITLINE_USE_WCHAR
- line = m_utf8conv.to_bytes(SplitLines(input)[0]);
+ line = ToBytes(SplitLines(input)[0]);
#else
line = SplitLines(input)[0];
#endif
@@ -1574,7 +1614,8 @@ bool Editline::CompleteCharacter(char ch, EditLineGetCharType &out) {
out = (unsigned char)ch;
return true;
#else
- std::codecvt_utf8<wchar_t> cvt;
+ std::locale locale("C.UTF-8");
+ const auto &cvt = std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>>(locale);
llvm::SmallString<4> input;
for (;;) {
const char *from_next;
``````````
</details>
https://github.com/llvm/llvm-project/pull/112582
More information about the lldb-commits
mailing list