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 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 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 120b9c1b51eSKate Stone lldb::OptionValueSP OptionValueString::DeepCopy() const { 12167cc0636SGreg Clayton return OptionValueSP(new OptionValueString(*this)); 12267cc0636SGreg Clayton } 1239d14084bSEnrico Granata 12497206d57SZachary Turner Status OptionValueString::SetCurrentValue(llvm::StringRef value) { 125b9c1b51eSKate Stone if (m_validator) { 12697206d57SZachary Turner Status error(m_validator(value.str().c_str(), m_validator_baton)); 1279d14084bSEnrico Granata if (error.Fail()) 1289d14084bSEnrico Granata return error; 1299d14084bSEnrico Granata } 130*adcd0268SBenjamin Kramer m_current_value.assign(std::string(value)); 13197206d57SZachary Turner return Status(); 1329d14084bSEnrico Granata } 1339d14084bSEnrico Granata 13497206d57SZachary Turner Status OptionValueString::AppendToCurrentValue(const char *value) { 135b9c1b51eSKate Stone if (value && value[0]) { 136b9c1b51eSKate Stone if (m_validator) { 1379d14084bSEnrico Granata std::string new_value(m_current_value); 1389d14084bSEnrico Granata new_value.append(value); 13997206d57SZachary Turner Status error(m_validator(value, m_validator_baton)); 1409d14084bSEnrico Granata if (error.Fail()) 1419d14084bSEnrico Granata return error; 1429d14084bSEnrico Granata m_current_value.assign(new_value); 143b9c1b51eSKate Stone } else 1449d14084bSEnrico Granata m_current_value.append(value); 1459d14084bSEnrico Granata } 14697206d57SZachary Turner return Status(); 1479d14084bSEnrico Granata } 148