1 //===-- OptionValueString.cpp ------------------------------------*- C++
4 // The LLVM Compiler Infrastructure
6 // This file is distributed under the University of Illinois Open Source
7 // License. See LICENSE.TXT for details.
9 //===----------------------------------------------------------------------===//
11 #include "lldb/Interpreter/OptionValueString.h"
13 #include "lldb/Host/OptionParser.h"
14 #include "lldb/Utility/Args.h"
15 #include "lldb/Utility/Stream.h"
18 using namespace lldb_private;
20 void OptionValueString::DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
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());
35 strm.Printf("\"%s\"", expanded_escape_value.c_str());
37 if (dump_mask & eDumpOptionRaw)
38 strm.Printf("%s", m_current_value.c_str());
40 strm.Printf("\"%s\"", m_current_value.c_str());
46 Status OptionValueString::SetValueFromString(llvm::StringRef value,
47 VarSetOperationType op) {
50 std::string value_str = value.str();
52 if (value.size() > 0) {
53 switch (value.front()) {
56 if (value.size() <= 1 || value.back() != value.front()) {
57 error.SetErrorString("mismatched quotes");
60 value = value.drop_front().drop_back();
63 value_str = value.str();
67 case eVarSetOperationInvalid:
68 case eVarSetOperationInsertBefore:
69 case eVarSetOperationInsertAfter:
70 case eVarSetOperationRemove:
72 error = m_validator(value_str.c_str(), m_validator_baton);
76 error = OptionValue::SetValueFromString(value, op);
79 case eVarSetOperationAppend: {
80 std::string new_value(m_current_value);
81 if (value.size() > 0) {
82 if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
84 Args::EncodeEscapeSequences(value_str.c_str(), str);
85 new_value.append(str);
87 new_value.append(value);
90 error = m_validator(new_value.c_str(), m_validator_baton);
94 m_current_value.assign(new_value);
98 case eVarSetOperationClear:
100 NotifyValueChanged();
103 case eVarSetOperationReplace:
104 case eVarSetOperationAssign:
106 error = m_validator(value_str.c_str(), m_validator_baton);
110 m_value_was_set = true;
111 if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
112 Args::EncodeEscapeSequences(value_str.c_str(), m_current_value);
114 SetCurrentValue(value_str);
116 NotifyValueChanged();
122 lldb::OptionValueSP OptionValueString::DeepCopy() const {
123 return OptionValueSP(new OptionValueString(*this));
126 Status OptionValueString::SetCurrentValue(llvm::StringRef value) {
128 Status error(m_validator(value.str().c_str(), m_validator_baton));
132 m_current_value.assign(value);
136 Status OptionValueString::AppendToCurrentValue(const char *value) {
137 if (value && value[0]) {
139 std::string new_value(m_current_value);
140 new_value.append(value);
141 Status error(m_validator(value, m_validator_baton));
144 m_current_value.assign(new_value);
146 m_current_value.append(value);