Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/lldb/source/Interpreter/OptionValueString.cpp
39587 views
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
//===----------------------------------------------------------------------===//
8
9
#include "lldb/Interpreter/OptionValueString.h"
10
11
#include "lldb/Host/OptionParser.h"
12
#include "lldb/Utility/Args.h"
13
#include "lldb/Utility/Stream.h"
14
15
using namespace lldb;
16
using namespace lldb_private;
17
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());
39
}
40
}
41
}
42
}
43
44
Status OptionValueString::SetValueFromString(llvm::StringRef value,
45
VarSetOperationType op) {
46
Status error;
47
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.SetErrorString("mismatched quotes");
56
return error;
57
}
58
value = value.drop_front().drop_back();
59
} break;
60
}
61
value_str = value.str();
62
}
63
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;
73
}
74
error = OptionValue::SetValueFromString(value, op);
75
break;
76
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));
86
}
87
if (m_validator) {
88
error = m_validator(new_value.c_str(), m_validator_baton);
89
if (error.Fail())
90
return error;
91
}
92
m_current_value.assign(new_value);
93
NotifyValueChanged();
94
} break;
95
96
case eVarSetOperationClear:
97
Clear();
98
NotifyValueChanged();
99
break;
100
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;
107
}
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);
113
}
114
NotifyValueChanged();
115
break;
116
}
117
return error;
118
}
119
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;
125
}
126
m_current_value.assign(std::string(value));
127
return Status();
128
}
129
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);
141
}
142
return Status();
143
}
144
145