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 17*3eb2b44dSZachary Turner #include "lldb/Host/OptionParser.h" 184c05410fSGreg Clayton #include "lldb/Interpreter/Args.h" 19bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 2067cc0636SGreg Clayton 2167cc0636SGreg Clayton using namespace lldb; 2267cc0636SGreg Clayton using namespace lldb_private; 2367cc0636SGreg Clayton 24b9c1b51eSKate Stone void OptionValueString::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, 25b9c1b51eSKate Stone uint32_t dump_mask) { 2667cc0636SGreg Clayton if (dump_mask & eDumpOptionType) 2767cc0636SGreg Clayton strm.Printf("(%s)", GetTypeAsCString()); 28b9c1b51eSKate Stone if (dump_mask & eDumpOptionValue) { 2967cc0636SGreg Clayton if (dump_mask & eDumpOptionType) 3067cc0636SGreg Clayton strm.PutCString(" = "); 31b9c1b51eSKate Stone if (!m_current_value.empty() || m_value_was_set) { 32b9c1b51eSKate Stone if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) { 334c05410fSGreg Clayton std::string expanded_escape_value; 34b9c1b51eSKate Stone Args::ExpandEscapedCharacters(m_current_value.c_str(), 35b9c1b51eSKate Stone expanded_escape_value); 364c05410fSGreg Clayton if (dump_mask & eDumpOptionRaw) 374c05410fSGreg Clayton strm.Printf("%s", expanded_escape_value.c_str()); 384c05410fSGreg Clayton else 394c05410fSGreg Clayton strm.Printf("\"%s\"", expanded_escape_value.c_str()); 40b9c1b51eSKate Stone } else { 4167cc0636SGreg Clayton if (dump_mask & eDumpOptionRaw) 4267cc0636SGreg Clayton strm.Printf("%s", m_current_value.c_str()); 4367cc0636SGreg Clayton else 4467cc0636SGreg Clayton strm.Printf("\"%s\"", m_current_value.c_str()); 4567cc0636SGreg Clayton } 4667cc0636SGreg Clayton } 4767cc0636SGreg Clayton } 484c05410fSGreg Clayton } 4967cc0636SGreg Clayton 50b9c1b51eSKate Stone Error OptionValueString::SetValueFromString(llvm::StringRef value, 51b9c1b51eSKate Stone VarSetOperationType op) { 5267cc0636SGreg Clayton Error error; 5321c895e3SGreg Clayton 54c95f7e2aSPavel Labath std::string value_str = value.str(); 55c95f7e2aSPavel Labath value = value.trim(); 56b9c1b51eSKate Stone if (value.size() > 0) { 57b9c1b51eSKate Stone switch (value.front()) { 5821c895e3SGreg Clayton case '"': 59b9c1b51eSKate Stone case '\'': { 60b9c1b51eSKate Stone if (value.size() <= 1 || value.back() != value.front()) { 6121c895e3SGreg Clayton error.SetErrorString("mismatched quotes"); 6221c895e3SGreg Clayton return error; 6321c895e3SGreg Clayton } 644f2a9726SZachary Turner value = value.drop_front().drop_back(); 65b9c1b51eSKate Stone } break; 6621c895e3SGreg Clayton } 67c95f7e2aSPavel Labath value_str = value.str(); 6821c895e3SGreg Clayton } 6921c895e3SGreg Clayton 70b9c1b51eSKate Stone switch (op) { 7167cc0636SGreg Clayton case eVarSetOperationInvalid: 7267cc0636SGreg Clayton case eVarSetOperationInsertBefore: 7367cc0636SGreg Clayton case eVarSetOperationInsertAfter: 7467cc0636SGreg Clayton case eVarSetOperationRemove: 75b9c1b51eSKate Stone if (m_validator) { 76c95f7e2aSPavel Labath error = m_validator(value_str.c_str(), m_validator_baton); 779d14084bSEnrico Granata if (error.Fail()) 789d14084bSEnrico Granata return error; 799d14084bSEnrico Granata } 80c95f7e2aSPavel Labath error = OptionValue::SetValueFromString(value, op); 8167cc0636SGreg Clayton break; 8267cc0636SGreg Clayton 83b9c1b51eSKate Stone case eVarSetOperationAppend: { 849d14084bSEnrico Granata std::string new_value(m_current_value); 85b9c1b51eSKate Stone if (value.size() > 0) { 86b9c1b51eSKate Stone if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) { 874c05410fSGreg Clayton std::string str; 88c95f7e2aSPavel Labath Args::EncodeEscapeSequences(value_str.c_str(), str); 899d14084bSEnrico Granata new_value.append(str); 90b9c1b51eSKate Stone } else 91c95f7e2aSPavel Labath new_value.append(value); 929d14084bSEnrico Granata } 93b9c1b51eSKate Stone if (m_validator) { 949d14084bSEnrico Granata error = m_validator(new_value.c_str(), m_validator_baton); 959d14084bSEnrico Granata if (error.Fail()) 969d14084bSEnrico Granata return error; 979d14084bSEnrico Granata } 989d14084bSEnrico Granata m_current_value.assign(new_value); 99332e8b1cSGreg Clayton NotifyValueChanged(); 100b9c1b51eSKate Stone } break; 10167cc0636SGreg Clayton 10267cc0636SGreg Clayton case eVarSetOperationClear: 10367cc0636SGreg Clayton Clear(); 104332e8b1cSGreg Clayton NotifyValueChanged(); 10567cc0636SGreg Clayton break; 10667cc0636SGreg Clayton 10767cc0636SGreg Clayton case eVarSetOperationReplace: 10867cc0636SGreg Clayton case eVarSetOperationAssign: 109b9c1b51eSKate Stone if (m_validator) { 110c95f7e2aSPavel Labath error = m_validator(value_str.c_str(), m_validator_baton); 1119d14084bSEnrico Granata if (error.Fail()) 1129d14084bSEnrico Granata return error; 1139d14084bSEnrico Granata } 11467cc0636SGreg Clayton m_value_was_set = true; 115b9c1b51eSKate Stone if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) { 116c95f7e2aSPavel Labath Args::EncodeEscapeSequences(value_str.c_str(), m_current_value); 117b9c1b51eSKate Stone } else { 1188cef4b0bSZachary Turner SetCurrentValue(value_str); 1194c05410fSGreg Clayton } 120332e8b1cSGreg Clayton NotifyValueChanged(); 12167cc0636SGreg Clayton break; 12267cc0636SGreg Clayton } 12367cc0636SGreg Clayton return error; 12467cc0636SGreg Clayton } 12567cc0636SGreg Clayton 126b9c1b51eSKate Stone lldb::OptionValueSP OptionValueString::DeepCopy() const { 12767cc0636SGreg Clayton return OptionValueSP(new OptionValueString(*this)); 12867cc0636SGreg Clayton } 1299d14084bSEnrico Granata 1308cef4b0bSZachary Turner Error OptionValueString::SetCurrentValue(llvm::StringRef value) { 131b9c1b51eSKate Stone if (m_validator) { 1328cef4b0bSZachary Turner Error error(m_validator(value.str().c_str(), m_validator_baton)); 1339d14084bSEnrico Granata if (error.Fail()) 1349d14084bSEnrico Granata return error; 1359d14084bSEnrico Granata } 1369d14084bSEnrico Granata m_current_value.assign(value); 137c1edf566SMehdi Amini return Error(); 1389d14084bSEnrico Granata } 1399d14084bSEnrico Granata 140b9c1b51eSKate Stone Error OptionValueString::AppendToCurrentValue(const char *value) { 141b9c1b51eSKate Stone if (value && value[0]) { 142b9c1b51eSKate Stone if (m_validator) { 1439d14084bSEnrico Granata std::string new_value(m_current_value); 1449d14084bSEnrico Granata new_value.append(value); 1459d14084bSEnrico Granata Error error(m_validator(value, m_validator_baton)); 1469d14084bSEnrico Granata if (error.Fail()) 1479d14084bSEnrico Granata return error; 1489d14084bSEnrico Granata m_current_value.assign(new_value); 149b9c1b51eSKate Stone } else 1509d14084bSEnrico Granata m_current_value.append(value); 1519d14084bSEnrico Granata } 152c1edf566SMehdi Amini return Error(); 1539d14084bSEnrico Granata } 154