[NFC][Coroutines] Use structured binding with llvm::enumerate in CoroSplit (#116879)
[llvm-project.git] / lldb / source / Interpreter / OptionValueString.cpp
blobae30661a56d0579814e7a8cf8a0195e241133946
1 //===-- OptionValueString.cpp ---------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
9 #include "lldb/Interpreter/OptionValueString.h"
11 #include "lldb/Host/OptionParser.h"
12 #include "lldb/Utility/Args.h"
13 #include "lldb/Utility/Stream.h"
15 using namespace lldb;
16 using namespace lldb_private;
18 void OptionValueString::DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
19 uint32_t dump_mask) {
20 if (dump_mask & eDumpOptionType)
21 strm.Printf("(%s)", GetTypeAsCString());
22 if (dump_mask & eDumpOptionValue) {
23 if (dump_mask & eDumpOptionType)
24 strm.PutCString(" = ");
25 if (!m_current_value.empty() || m_value_was_set) {
26 if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
27 std::string expanded_escape_value;
28 Args::ExpandEscapedCharacters(m_current_value.c_str(),
29 expanded_escape_value);
30 if (dump_mask & eDumpOptionRaw)
31 strm.Printf("%s", expanded_escape_value.c_str());
32 else
33 strm.Printf("\"%s\"", expanded_escape_value.c_str());
34 } else {
35 if (dump_mask & eDumpOptionRaw)
36 strm.Printf("%s", m_current_value.c_str());
37 else
38 strm.Printf("\"%s\"", m_current_value.c_str());
44 Status OptionValueString::SetValueFromString(llvm::StringRef value,
45 VarSetOperationType op) {
46 Status error;
48 std::string value_str = value.str();
49 value = value.trim();
50 if (value.size() > 0) {
51 switch (value.front()) {
52 case '"':
53 case '\'': {
54 if (value.size() <= 1 || value.back() != value.front()) {
55 error = Status::FromErrorString("mismatched quotes");
56 return error;
58 value = value.drop_front().drop_back();
59 } break;
61 value_str = value.str();
64 switch (op) {
65 case eVarSetOperationInvalid:
66 case eVarSetOperationInsertBefore:
67 case eVarSetOperationInsertAfter:
68 case eVarSetOperationRemove:
69 if (m_validator) {
70 error = m_validator(value_str.c_str(), m_validator_baton);
71 if (error.Fail())
72 return error;
74 error = OptionValue::SetValueFromString(value, op);
75 break;
77 case eVarSetOperationAppend: {
78 std::string new_value(m_current_value);
79 if (value.size() > 0) {
80 if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
81 std::string str;
82 Args::EncodeEscapeSequences(value_str.c_str(), str);
83 new_value.append(str);
84 } else
85 new_value.append(std::string(value));
87 if (m_validator) {
88 error = m_validator(new_value.c_str(), m_validator_baton);
89 if (error.Fail())
90 return error;
92 m_current_value.assign(new_value);
93 NotifyValueChanged();
94 } break;
96 case eVarSetOperationClear:
97 Clear();
98 NotifyValueChanged();
99 break;
101 case eVarSetOperationReplace:
102 case eVarSetOperationAssign:
103 if (m_validator) {
104 error = m_validator(value_str.c_str(), m_validator_baton);
105 if (error.Fail())
106 return error;
108 m_value_was_set = true;
109 if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
110 Args::EncodeEscapeSequences(value_str.c_str(), m_current_value);
111 } else {
112 SetCurrentValue(value_str);
114 NotifyValueChanged();
115 break;
117 return error;
120 Status OptionValueString::SetCurrentValue(llvm::StringRef value) {
121 if (m_validator) {
122 Status error(m_validator(value.str().c_str(), m_validator_baton));
123 if (error.Fail())
124 return error;
126 m_current_value.assign(std::string(value));
127 return Status();
130 Status OptionValueString::AppendToCurrentValue(const char *value) {
131 if (value && value[0]) {
132 if (m_validator) {
133 std::string new_value(m_current_value);
134 new_value.append(value);
135 Status error(m_validator(value, m_validator_baton));
136 if (error.Fail())
137 return error;
138 m_current_value.assign(new_value);
139 } else
140 m_current_value.append(value);
142 return Status();