180814287SRaphael Isemann //===-- OptionValueString.cpp ---------------------------------------------===//
267cc0636SGreg Clayton //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
667cc0636SGreg Clayton //
767cc0636SGreg Clayton //===----------------------------------------------------------------------===//
867cc0636SGreg Clayton
967cc0636SGreg Clayton #include "lldb/Interpreter/OptionValueString.h"
1067cc0636SGreg Clayton
113eb2b44dSZachary Turner #include "lldb/Host/OptionParser.h"
12145d95c9SPavel Labath #include "lldb/Utility/Args.h"
13bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
1467cc0636SGreg Clayton
1567cc0636SGreg Clayton using namespace lldb;
1667cc0636SGreg Clayton using namespace lldb_private;
1767cc0636SGreg Clayton
DumpValue(const ExecutionContext * exe_ctx,Stream & strm,uint32_t dump_mask)18b9c1b51eSKate Stone void OptionValueString::DumpValue(const ExecutionContext *exe_ctx, Stream &strm,
19b9c1b51eSKate Stone uint32_t dump_mask) {
2067cc0636SGreg Clayton if (dump_mask & eDumpOptionType)
2167cc0636SGreg Clayton strm.Printf("(%s)", GetTypeAsCString());
22b9c1b51eSKate Stone if (dump_mask & eDumpOptionValue) {
2367cc0636SGreg Clayton if (dump_mask & eDumpOptionType)
2467cc0636SGreg Clayton strm.PutCString(" = ");
25b9c1b51eSKate Stone if (!m_current_value.empty() || m_value_was_set) {
26b9c1b51eSKate Stone if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
274c05410fSGreg Clayton std::string expanded_escape_value;
28b9c1b51eSKate Stone Args::ExpandEscapedCharacters(m_current_value.c_str(),
29b9c1b51eSKate Stone expanded_escape_value);
304c05410fSGreg Clayton if (dump_mask & eDumpOptionRaw)
314c05410fSGreg Clayton strm.Printf("%s", expanded_escape_value.c_str());
324c05410fSGreg Clayton else
334c05410fSGreg Clayton strm.Printf("\"%s\"", expanded_escape_value.c_str());
34b9c1b51eSKate Stone } else {
3567cc0636SGreg Clayton if (dump_mask & eDumpOptionRaw)
3667cc0636SGreg Clayton strm.Printf("%s", m_current_value.c_str());
3767cc0636SGreg Clayton else
3867cc0636SGreg Clayton strm.Printf("\"%s\"", m_current_value.c_str());
3967cc0636SGreg Clayton }
4067cc0636SGreg Clayton }
4167cc0636SGreg Clayton }
424c05410fSGreg Clayton }
4367cc0636SGreg Clayton
SetValueFromString(llvm::StringRef value,VarSetOperationType op)4497206d57SZachary Turner Status OptionValueString::SetValueFromString(llvm::StringRef value,
45b9c1b51eSKate Stone VarSetOperationType op) {
4697206d57SZachary Turner Status error;
4721c895e3SGreg Clayton
48c95f7e2aSPavel Labath std::string value_str = value.str();
49c95f7e2aSPavel Labath value = value.trim();
50b9c1b51eSKate Stone if (value.size() > 0) {
51b9c1b51eSKate Stone switch (value.front()) {
5221c895e3SGreg Clayton case '"':
53b9c1b51eSKate Stone case '\'': {
54b9c1b51eSKate Stone if (value.size() <= 1 || value.back() != value.front()) {
5521c895e3SGreg Clayton error.SetErrorString("mismatched quotes");
5621c895e3SGreg Clayton return error;
5721c895e3SGreg Clayton }
584f2a9726SZachary Turner value = value.drop_front().drop_back();
59b9c1b51eSKate Stone } break;
6021c895e3SGreg Clayton }
61c95f7e2aSPavel Labath value_str = value.str();
6221c895e3SGreg Clayton }
6321c895e3SGreg Clayton
64b9c1b51eSKate Stone switch (op) {
6567cc0636SGreg Clayton case eVarSetOperationInvalid:
6667cc0636SGreg Clayton case eVarSetOperationInsertBefore:
6767cc0636SGreg Clayton case eVarSetOperationInsertAfter:
6867cc0636SGreg Clayton case eVarSetOperationRemove:
69b9c1b51eSKate Stone if (m_validator) {
70c95f7e2aSPavel Labath error = m_validator(value_str.c_str(), m_validator_baton);
719d14084bSEnrico Granata if (error.Fail())
729d14084bSEnrico Granata return error;
739d14084bSEnrico Granata }
74c95f7e2aSPavel Labath error = OptionValue::SetValueFromString(value, op);
7567cc0636SGreg Clayton break;
7667cc0636SGreg Clayton
77b9c1b51eSKate Stone case eVarSetOperationAppend: {
789d14084bSEnrico Granata std::string new_value(m_current_value);
79b9c1b51eSKate Stone if (value.size() > 0) {
80b9c1b51eSKate Stone if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
814c05410fSGreg Clayton std::string str;
82c95f7e2aSPavel Labath Args::EncodeEscapeSequences(value_str.c_str(), str);
839d14084bSEnrico Granata new_value.append(str);
84b9c1b51eSKate Stone } else
85*adcd0268SBenjamin Kramer new_value.append(std::string(value));
869d14084bSEnrico Granata }
87b9c1b51eSKate Stone if (m_validator) {
889d14084bSEnrico Granata error = m_validator(new_value.c_str(), m_validator_baton);
899d14084bSEnrico Granata if (error.Fail())
909d14084bSEnrico Granata return error;
919d14084bSEnrico Granata }
929d14084bSEnrico Granata m_current_value.assign(new_value);
93332e8b1cSGreg Clayton NotifyValueChanged();
94b9c1b51eSKate Stone } break;
9567cc0636SGreg Clayton
9667cc0636SGreg Clayton case eVarSetOperationClear:
9767cc0636SGreg Clayton Clear();
98332e8b1cSGreg Clayton NotifyValueChanged();
9967cc0636SGreg Clayton break;
10067cc0636SGreg Clayton
10167cc0636SGreg Clayton case eVarSetOperationReplace:
10267cc0636SGreg Clayton case eVarSetOperationAssign:
103b9c1b51eSKate Stone if (m_validator) {
104c95f7e2aSPavel Labath error = m_validator(value_str.c_str(), m_validator_baton);
1059d14084bSEnrico Granata if (error.Fail())
1069d14084bSEnrico Granata return error;
1079d14084bSEnrico Granata }
10867cc0636SGreg Clayton m_value_was_set = true;
109b9c1b51eSKate Stone if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) {
110c95f7e2aSPavel Labath Args::EncodeEscapeSequences(value_str.c_str(), m_current_value);
111b9c1b51eSKate Stone } else {
1128cef4b0bSZachary Turner SetCurrentValue(value_str);
1134c05410fSGreg Clayton }
114332e8b1cSGreg Clayton NotifyValueChanged();
11567cc0636SGreg Clayton break;
11667cc0636SGreg Clayton }
11767cc0636SGreg Clayton return error;
11867cc0636SGreg Clayton }
11967cc0636SGreg Clayton
SetCurrentValue(llvm::StringRef value)12097206d57SZachary Turner Status OptionValueString::SetCurrentValue(llvm::StringRef value) {
121b9c1b51eSKate Stone if (m_validator) {
12297206d57SZachary Turner Status error(m_validator(value.str().c_str(), m_validator_baton));
1239d14084bSEnrico Granata if (error.Fail())
1249d14084bSEnrico Granata return error;
1259d14084bSEnrico Granata }
126*adcd0268SBenjamin Kramer m_current_value.assign(std::string(value));
12797206d57SZachary Turner return Status();
1289d14084bSEnrico Granata }
1299d14084bSEnrico Granata
AppendToCurrentValue(const char * value)13097206d57SZachary Turner Status OptionValueString::AppendToCurrentValue(const char *value) {
131b9c1b51eSKate Stone if (value && value[0]) {
132b9c1b51eSKate Stone if (m_validator) {
1339d14084bSEnrico Granata std::string new_value(m_current_value);
1349d14084bSEnrico Granata new_value.append(value);
13597206d57SZachary Turner Status error(m_validator(value, m_validator_baton));
1369d14084bSEnrico Granata if (error.Fail())
1379d14084bSEnrico Granata return error;
1389d14084bSEnrico Granata m_current_value.assign(new_value);
139b9c1b51eSKate Stone } else
1409d14084bSEnrico Granata m_current_value.append(value);
1419d14084bSEnrico Granata }
14297206d57SZachary Turner return Status();
1439d14084bSEnrico Granata }
144