1 //===-- OptionValueString.cpp ------------------------------------*- C++
2 //-*-===//
3 //
4 // The LLVM Compiler Infrastructure
5 //
6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10
11 #include "lldb/Interpreter/OptionValueString.h"
12
13 #include "lldb/Host/OptionParser.h"
14 #include "lldb/Utility/Args.h"
15 #include "lldb/Utility/Stream.h"
16
17 using namespace lldb;
18 using namespace lldb_private;
19
DumpValue(const ExecutionContext * exe_ctx,Stream & strm,uint32_t dump_mask)20 void OptionValueString::DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
21 uint32_t dump_mask) {
22 if (dump_mask & eDumpOptionType)
23 strm.Printf("(%s)", GetTypeAsCString());
24 if (dump_mask & eDumpOptionValue) {
25 if (dump_mask & eDumpOptionType)
26 strm.PutCString(" = ");
27 if (!m_current_value.empty() || m_value_was_set) {
28 if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
29 std::string expanded_escape_value;
30 Args::ExpandEscapedCharacters(m_current_value.c_str(),
31 expanded_escape_value);
32 if (dump_mask & eDumpOptionRaw)
33 strm.Printf("%s", expanded_escape_value.c_str());
34 else
35 strm.Printf("\"%s\"", expanded_escape_value.c_str());
36 } else {
37 if (dump_mask & eDumpOptionRaw)
38 strm.Printf("%s", m_current_value.c_str());
39 else
40 strm.Printf("\"%s\"", m_current_value.c_str());
41 }
42 }
43 }
44 }
45
SetValueFromString(llvm::StringRef value,VarSetOperationType op)46 Status OptionValueString::SetValueFromString(llvm::StringRef value,
47 VarSetOperationType op) {
48 Status error;
49
50 std::string value_str = value.str();
51 value = value.trim();
52 if (value.size() > 0) {
53 switch (value.front()) {
54 case '"':
55 case '\'': {
56 if (value.size() <= 1 || value.back() != value.front()) {
57 error.SetErrorString("mismatched quotes");
58 return error;
59 }
60 value = value.drop_front().drop_back();
61 } break;
62 }
63 value_str = value.str();
64 }
65
66 switch (op) {
67 case eVarSetOperationInvalid:
68 case eVarSetOperationInsertBefore:
69 case eVarSetOperationInsertAfter:
70 case eVarSetOperationRemove:
71 if (m_validator) {
72 error = m_validator(value_str.c_str(), m_validator_baton);
73 if (error.Fail())
74 return error;
75 }
76 error = OptionValue::SetValueFromString(value, op);
77 break;
78
79 case eVarSetOperationAppend: {
80 std::string new_value(m_current_value);
81 if (value.size() > 0) {
82 if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
83 std::string str;
84 Args::EncodeEscapeSequences(value_str.c_str(), str);
85 new_value.append(str);
86 } else
87 new_value.append(value);
88 }
89 if (m_validator) {
90 error = m_validator(new_value.c_str(), m_validator_baton);
91 if (error.Fail())
92 return error;
93 }
94 m_current_value.assign(new_value);
95 NotifyValueChanged();
96 } break;
97
98 case eVarSetOperationClear:
99 Clear();
100 NotifyValueChanged();
101 break;
102
103 case eVarSetOperationReplace:
104 case eVarSetOperationAssign:
105 if (m_validator) {
106 error = m_validator(value_str.c_str(), m_validator_baton);
107 if (error.Fail())
108 return error;
109 }
110 m_value_was_set = true;
111 if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
112 Args::EncodeEscapeSequences(value_str.c_str(), m_current_value);
113 } else {
114 SetCurrentValue(value_str);
115 }
116 NotifyValueChanged();
117 break;
118 }
119 return error;
120 }
121
DeepCopy() const122 lldb::OptionValueSP OptionValueString::DeepCopy() const {
123 return OptionValueSP(new OptionValueString(*this));
124 }
125
SetCurrentValue(llvm::StringRef value)126 Status OptionValueString::SetCurrentValue(llvm::StringRef value) {
127 if (m_validator) {
128 Status error(m_validator(value.str().c_str(), m_validator_baton));
129 if (error.Fail())
130 return error;
131 }
132 m_current_value.assign(value);
133 return Status();
134 }
135
AppendToCurrentValue(const char * value)136 Status OptionValueString::AppendToCurrentValue(const char *value) {
137 if (value && value[0]) {
138 if (m_validator) {
139 std::string new_value(m_current_value);
140 new_value.append(value);
141 Status error(m_validator(value, m_validator_baton));
142 if (error.Fail())
143 return error;
144 m_current_value.assign(new_value);
145 } else
146 m_current_value.append(value);
147 }
148 return Status();
149 }
150