1 //===-- OptionValueString.cpp ------------------------------------*- C++
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8 //===----------------------------------------------------------------------===//
10 #include "lldb/Interpreter/OptionValueString.h"
12 #include "lldb/Host/OptionParser.h"
13 #include "lldb/Utility/Args.h"
14 #include "lldb/Utility/Stream.h"
17 using namespace lldb_private;
19 void OptionValueString::DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
21 if (dump_mask & eDumpOptionType)
22 strm.Printf("(%s)", GetTypeAsCString());
23 if (dump_mask & eDumpOptionValue) {
24 if (dump_mask & eDumpOptionType)
25 strm.PutCString(" = ");
26 if (!m_current_value.empty() || m_value_was_set) {
27 if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
28 std::string expanded_escape_value;
29 Args::ExpandEscapedCharacters(m_current_value.c_str(),
30 expanded_escape_value);
31 if (dump_mask & eDumpOptionRaw)
32 strm.Printf("%s", expanded_escape_value.c_str());
34 strm.Printf("\"%s\"", expanded_escape_value.c_str());
36 if (dump_mask & eDumpOptionRaw)
37 strm.Printf("%s", m_current_value.c_str());
39 strm.Printf("\"%s\"", m_current_value.c_str());
45 Status OptionValueString::SetValueFromString(llvm::StringRef value,
46 VarSetOperationType op) {
49 std::string value_str = value.str();
51 if (value.size() > 0) {
52 switch (value.front()) {
55 if (value.size() <= 1 || value.back() != value.front()) {
56 error.SetErrorString("mismatched quotes");
59 value = value.drop_front().drop_back();
62 value_str = value.str();
66 case eVarSetOperationInvalid:
67 case eVarSetOperationInsertBefore:
68 case eVarSetOperationInsertAfter:
69 case eVarSetOperationRemove:
71 error = m_validator(value_str.c_str(), m_validator_baton);
75 error = OptionValue::SetValueFromString(value, op);
78 case eVarSetOperationAppend: {
79 std::string new_value(m_current_value);
80 if (value.size() > 0) {
81 if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
83 Args::EncodeEscapeSequences(value_str.c_str(), str);
84 new_value.append(str);
86 new_value.append(value);
89 error = m_validator(new_value.c_str(), m_validator_baton);
93 m_current_value.assign(new_value);
97 case eVarSetOperationClear:
102 case eVarSetOperationReplace:
103 case eVarSetOperationAssign:
105 error = m_validator(value_str.c_str(), m_validator_baton);
109 m_value_was_set = true;
110 if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
111 Args::EncodeEscapeSequences(value_str.c_str(), m_current_value);
113 SetCurrentValue(value_str);
115 NotifyValueChanged();
121 lldb::OptionValueSP OptionValueString::DeepCopy() const {
122 return OptionValueSP(new OptionValueString(*this));
125 Status OptionValueString::SetCurrentValue(llvm::StringRef value) {
127 Status error(m_validator(value.str().c_str(), m_validator_baton));
131 m_current_value.assign(value);
135 Status OptionValueString::AppendToCurrentValue(const char *value) {
136 if (value && value[0]) {
138 std::string new_value(m_current_value);
139 new_value.append(value);
140 Status error(m_validator(value, m_validator_baton));
143 m_current_value.assign(new_value);
145 m_current_value.append(value);