1b9c1b51eSKate Stone //===-- OptionValueString.cpp ------------------------------------*- C++ 2b9c1b51eSKate Stone //-*-===// 367cc0636SGreg Clayton // 467cc0636SGreg Clayton // The LLVM Compiler Infrastructure 567cc0636SGreg Clayton // 667cc0636SGreg Clayton // This file is distributed under the University of Illinois Open Source 767cc0636SGreg Clayton // License. See LICENSE.TXT for details. 867cc0636SGreg Clayton // 967cc0636SGreg Clayton //===----------------------------------------------------------------------===// 1067cc0636SGreg Clayton 1167cc0636SGreg Clayton #include "lldb/Interpreter/OptionValueString.h" 1267cc0636SGreg Clayton 1367cc0636SGreg Clayton // C Includes 1467cc0636SGreg Clayton // C++ Includes 1567cc0636SGreg Clayton // Other libraries and framework includes 1667cc0636SGreg Clayton // Project includes 1767cc0636SGreg Clayton #include "lldb/Core/Stream.h" 184c05410fSGreg Clayton #include "lldb/Interpreter/Args.h" 1967cc0636SGreg Clayton 2067cc0636SGreg Clayton using namespace lldb; 2167cc0636SGreg Clayton using namespace lldb_private; 2267cc0636SGreg Clayton 23b9c1b51eSKate Stone void OptionValueString::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, 24b9c1b51eSKate Stone uint32_t dump_mask) { 2567cc0636SGreg Clayton if (dump_mask & eDumpOptionType) 2667cc0636SGreg Clayton strm.Printf("(%s)", GetTypeAsCString()); 27b9c1b51eSKate Stone if (dump_mask & eDumpOptionValue) { 2867cc0636SGreg Clayton if (dump_mask & eDumpOptionType) 2967cc0636SGreg Clayton strm.PutCString(" = "); 30b9c1b51eSKate Stone if (!m_current_value.empty() || m_value_was_set) { 31b9c1b51eSKate Stone if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) { 324c05410fSGreg Clayton std::string expanded_escape_value; 33b9c1b51eSKate Stone Args::ExpandEscapedCharacters(m_current_value.c_str(), 34b9c1b51eSKate Stone expanded_escape_value); 354c05410fSGreg Clayton if (dump_mask & eDumpOptionRaw) 364c05410fSGreg Clayton strm.Printf("%s", expanded_escape_value.c_str()); 374c05410fSGreg Clayton else 384c05410fSGreg Clayton strm.Printf("\"%s\"", expanded_escape_value.c_str()); 39b9c1b51eSKate Stone } else { 4067cc0636SGreg Clayton if (dump_mask & eDumpOptionRaw) 4167cc0636SGreg Clayton strm.Printf("%s", m_current_value.c_str()); 4267cc0636SGreg Clayton else 4367cc0636SGreg Clayton strm.Printf("\"%s\"", m_current_value.c_str()); 4467cc0636SGreg Clayton } 4567cc0636SGreg Clayton } 4667cc0636SGreg Clayton } 474c05410fSGreg Clayton } 4867cc0636SGreg Clayton 49b9c1b51eSKate Stone Error OptionValueString::SetValueFromString(llvm::StringRef value, 50b9c1b51eSKate Stone VarSetOperationType op) { 5167cc0636SGreg Clayton Error error; 5221c895e3SGreg Clayton 53c95f7e2aSPavel Labath std::string value_str = value.str(); 54c95f7e2aSPavel Labath value = value.trim(); 55b9c1b51eSKate Stone if (value.size() > 0) { 56b9c1b51eSKate Stone switch (value.front()) { 5721c895e3SGreg Clayton case '"': 58b9c1b51eSKate Stone case '\'': { 59b9c1b51eSKate Stone if (value.size() <= 1 || value.back() != value.front()) { 6021c895e3SGreg Clayton error.SetErrorString("mismatched quotes"); 6121c895e3SGreg Clayton return error; 6221c895e3SGreg Clayton } 634f2a9726SZachary Turner value = value.drop_front().drop_back(); 64b9c1b51eSKate Stone } break; 6521c895e3SGreg Clayton } 66c95f7e2aSPavel Labath value_str = value.str(); 6721c895e3SGreg Clayton } 6821c895e3SGreg Clayton 69b9c1b51eSKate Stone switch (op) { 7067cc0636SGreg Clayton case eVarSetOperationInvalid: 7167cc0636SGreg Clayton case eVarSetOperationInsertBefore: 7267cc0636SGreg Clayton case eVarSetOperationInsertAfter: 7367cc0636SGreg Clayton case eVarSetOperationRemove: 74b9c1b51eSKate Stone if (m_validator) { 75c95f7e2aSPavel Labath error = m_validator(value_str.c_str(), m_validator_baton); 769d14084bSEnrico Granata if (error.Fail()) 779d14084bSEnrico Granata return error; 789d14084bSEnrico Granata } 79c95f7e2aSPavel Labath error = OptionValue::SetValueFromString(value, op); 8067cc0636SGreg Clayton break; 8167cc0636SGreg Clayton 82b9c1b51eSKate Stone case eVarSetOperationAppend: { 839d14084bSEnrico Granata std::string new_value(m_current_value); 84b9c1b51eSKate Stone if (value.size() > 0) { 85b9c1b51eSKate Stone if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) { 864c05410fSGreg Clayton std::string str; 87c95f7e2aSPavel Labath Args::EncodeEscapeSequences(value_str.c_str(), str); 889d14084bSEnrico Granata new_value.append(str); 89b9c1b51eSKate Stone } else 90c95f7e2aSPavel Labath new_value.append(value); 919d14084bSEnrico Granata } 92b9c1b51eSKate Stone if (m_validator) { 939d14084bSEnrico Granata error = m_validator(new_value.c_str(), m_validator_baton); 949d14084bSEnrico Granata if (error.Fail()) 959d14084bSEnrico Granata return error; 969d14084bSEnrico Granata } 979d14084bSEnrico Granata m_current_value.assign(new_value); 98332e8b1cSGreg Clayton NotifyValueChanged(); 99b9c1b51eSKate Stone } break; 10067cc0636SGreg Clayton 10167cc0636SGreg Clayton case eVarSetOperationClear: 10267cc0636SGreg Clayton Clear(); 103332e8b1cSGreg Clayton NotifyValueChanged(); 10467cc0636SGreg Clayton break; 10567cc0636SGreg Clayton 10667cc0636SGreg Clayton case eVarSetOperationReplace: 10767cc0636SGreg Clayton case eVarSetOperationAssign: 108b9c1b51eSKate Stone if (m_validator) { 109c95f7e2aSPavel Labath error = m_validator(value_str.c_str(), m_validator_baton); 1109d14084bSEnrico Granata if (error.Fail()) 1119d14084bSEnrico Granata return error; 1129d14084bSEnrico Granata } 11367cc0636SGreg Clayton m_value_was_set = true; 114b9c1b51eSKate Stone if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) { 115c95f7e2aSPavel Labath Args::EncodeEscapeSequences(value_str.c_str(), m_current_value); 116b9c1b51eSKate Stone } else { 1178cef4b0bSZachary Turner SetCurrentValue(value_str); 1184c05410fSGreg Clayton } 119332e8b1cSGreg Clayton NotifyValueChanged(); 12067cc0636SGreg Clayton break; 12167cc0636SGreg Clayton } 12267cc0636SGreg Clayton return error; 12367cc0636SGreg Clayton } 12467cc0636SGreg Clayton 125b9c1b51eSKate Stone lldb::OptionValueSP OptionValueString::DeepCopy() const { 12667cc0636SGreg Clayton return OptionValueSP(new OptionValueString(*this)); 12767cc0636SGreg Clayton } 1289d14084bSEnrico Granata 1298cef4b0bSZachary Turner Error OptionValueString::SetCurrentValue(llvm::StringRef value) { 130b9c1b51eSKate Stone if (m_validator) { 1318cef4b0bSZachary Turner Error error(m_validator(value.str().c_str(), m_validator_baton)); 1329d14084bSEnrico Granata if (error.Fail()) 1339d14084bSEnrico Granata return error; 1349d14084bSEnrico Granata } 1359d14084bSEnrico Granata m_current_value.assign(value); 136*c1edf566SMehdi Amini return Error(); 1379d14084bSEnrico Granata } 1389d14084bSEnrico Granata 139b9c1b51eSKate Stone Error OptionValueString::AppendToCurrentValue(const char *value) { 140b9c1b51eSKate Stone if (value && value[0]) { 141b9c1b51eSKate Stone if (m_validator) { 1429d14084bSEnrico Granata std::string new_value(m_current_value); 1439d14084bSEnrico Granata new_value.append(value); 1449d14084bSEnrico Granata Error error(m_validator(value, m_validator_baton)); 1459d14084bSEnrico Granata if (error.Fail()) 1469d14084bSEnrico Granata return error; 1479d14084bSEnrico Granata m_current_value.assign(new_value); 148b9c1b51eSKate Stone } else 1499d14084bSEnrico Granata m_current_value.append(value); 1509d14084bSEnrico Granata } 151*c1edf566SMehdi Amini return Error(); 1529d14084bSEnrico Granata } 153