167cc0636SGreg Clayton //===-- OptionValueString.cpp ------------------------------------*- C++ -*-===// 267cc0636SGreg Clayton // 367cc0636SGreg Clayton // The LLVM Compiler Infrastructure 467cc0636SGreg Clayton // 567cc0636SGreg Clayton // This file is distributed under the University of Illinois Open Source 667cc0636SGreg Clayton // License. See LICENSE.TXT for details. 767cc0636SGreg Clayton // 867cc0636SGreg Clayton //===----------------------------------------------------------------------===// 967cc0636SGreg Clayton 1067cc0636SGreg Clayton #include "lldb/Interpreter/OptionValueString.h" 1167cc0636SGreg Clayton 1267cc0636SGreg Clayton // C Includes 1367cc0636SGreg Clayton // C++ Includes 1467cc0636SGreg Clayton // Other libraries and framework includes 1567cc0636SGreg Clayton // Project includes 1667cc0636SGreg Clayton #include "lldb/Core/Stream.h" 174c05410fSGreg Clayton #include "lldb/Interpreter/Args.h" 1867cc0636SGreg Clayton 1967cc0636SGreg Clayton using namespace lldb; 2067cc0636SGreg Clayton using namespace lldb_private; 2167cc0636SGreg Clayton 2267cc0636SGreg Clayton void 2367cc0636SGreg Clayton OptionValueString::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask) 2467cc0636SGreg Clayton { 2567cc0636SGreg Clayton if (dump_mask & eDumpOptionType) 2667cc0636SGreg Clayton strm.Printf ("(%s)", GetTypeAsCString ()); 2767cc0636SGreg Clayton if (dump_mask & eDumpOptionValue) 2867cc0636SGreg Clayton { 2967cc0636SGreg Clayton if (dump_mask & eDumpOptionType) 3067cc0636SGreg Clayton strm.PutCString (" = "); 3167cc0636SGreg Clayton if (!m_current_value.empty() || m_value_was_set) 3267cc0636SGreg Clayton { 334c05410fSGreg Clayton if (m_options.Test (eOptionEncodeCharacterEscapeSequences)) 344c05410fSGreg Clayton { 354c05410fSGreg Clayton std::string expanded_escape_value; 364c05410fSGreg Clayton Args::ExpandEscapedCharacters(m_current_value.c_str(), expanded_escape_value); 374c05410fSGreg Clayton if (dump_mask & eDumpOptionRaw) 384c05410fSGreg Clayton strm.Printf ("%s", expanded_escape_value.c_str()); 394c05410fSGreg Clayton else 404c05410fSGreg Clayton strm.Printf ("\"%s\"", expanded_escape_value.c_str()); 414c05410fSGreg Clayton } 424c05410fSGreg Clayton else 434c05410fSGreg Clayton { 4467cc0636SGreg Clayton if (dump_mask & eDumpOptionRaw) 4567cc0636SGreg Clayton strm.Printf ("%s", m_current_value.c_str()); 4667cc0636SGreg Clayton else 4767cc0636SGreg Clayton strm.Printf ("\"%s\"", m_current_value.c_str()); 4867cc0636SGreg Clayton } 4967cc0636SGreg Clayton } 5067cc0636SGreg Clayton } 514c05410fSGreg Clayton } 5267cc0636SGreg Clayton 5367cc0636SGreg Clayton Error 54*c95f7e2aSPavel Labath OptionValueString::SetValueFromString (llvm::StringRef value, 5567cc0636SGreg Clayton VarSetOperationType op) 5667cc0636SGreg Clayton { 5767cc0636SGreg Clayton Error error; 5821c895e3SGreg Clayton 59*c95f7e2aSPavel Labath std::string value_str = value.str(); 60*c95f7e2aSPavel Labath value = value.trim(); 61*c95f7e2aSPavel Labath if (value.size() > 0) 6221c895e3SGreg Clayton { 63*c95f7e2aSPavel Labath switch (value.front()) 6421c895e3SGreg Clayton { 6521c895e3SGreg Clayton case '"': 6621c895e3SGreg Clayton case '\'': 6721c895e3SGreg Clayton { 68*c95f7e2aSPavel Labath if (value.size() <= 1 || value.back() != value.front()) 6921c895e3SGreg Clayton { 7021c895e3SGreg Clayton error.SetErrorString("mismatched quotes"); 7121c895e3SGreg Clayton return error; 7221c895e3SGreg Clayton } 73*c95f7e2aSPavel Labath value = value.drop_front().drop_back().str(); 7421c895e3SGreg Clayton } 7521c895e3SGreg Clayton break; 7621c895e3SGreg Clayton } 77*c95f7e2aSPavel Labath value_str = value.str(); 7821c895e3SGreg Clayton } 7921c895e3SGreg Clayton 8067cc0636SGreg Clayton switch (op) 8167cc0636SGreg Clayton { 8267cc0636SGreg Clayton case eVarSetOperationInvalid: 8367cc0636SGreg Clayton case eVarSetOperationInsertBefore: 8467cc0636SGreg Clayton case eVarSetOperationInsertAfter: 8567cc0636SGreg Clayton case eVarSetOperationRemove: 869d14084bSEnrico Granata if (m_validator) 879d14084bSEnrico Granata { 88*c95f7e2aSPavel Labath error = m_validator(value_str.c_str(),m_validator_baton); 899d14084bSEnrico Granata if (error.Fail()) 909d14084bSEnrico Granata return error; 919d14084bSEnrico Granata } 92*c95f7e2aSPavel Labath error = OptionValue::SetValueFromString (value, op); 9367cc0636SGreg Clayton break; 9467cc0636SGreg Clayton 9567cc0636SGreg Clayton case eVarSetOperationAppend: 969d14084bSEnrico Granata { 979d14084bSEnrico Granata std::string new_value(m_current_value); 98*c95f7e2aSPavel Labath if (value.size() > 0) 994c05410fSGreg Clayton { 1004c05410fSGreg Clayton if (m_options.Test (eOptionEncodeCharacterEscapeSequences)) 1014c05410fSGreg Clayton { 1024c05410fSGreg Clayton std::string str; 103*c95f7e2aSPavel Labath Args::EncodeEscapeSequences (value_str.c_str(), str); 1049d14084bSEnrico Granata new_value.append(str); 1054c05410fSGreg Clayton } 1064c05410fSGreg Clayton else 107*c95f7e2aSPavel Labath new_value.append(value); 1089d14084bSEnrico Granata } 1099d14084bSEnrico Granata if (m_validator) 1109d14084bSEnrico Granata { 1119d14084bSEnrico Granata error = m_validator(new_value.c_str(),m_validator_baton); 1129d14084bSEnrico Granata if (error.Fail()) 1139d14084bSEnrico Granata return error; 1149d14084bSEnrico Granata } 1159d14084bSEnrico Granata m_current_value.assign(new_value); 116332e8b1cSGreg Clayton NotifyValueChanged(); 1174c05410fSGreg Clayton } 11867cc0636SGreg Clayton break; 11967cc0636SGreg Clayton 12067cc0636SGreg Clayton case eVarSetOperationClear: 12167cc0636SGreg Clayton Clear (); 122332e8b1cSGreg Clayton NotifyValueChanged(); 12367cc0636SGreg Clayton break; 12467cc0636SGreg Clayton 12567cc0636SGreg Clayton case eVarSetOperationReplace: 12667cc0636SGreg Clayton case eVarSetOperationAssign: 1279d14084bSEnrico Granata if (m_validator) 1289d14084bSEnrico Granata { 129*c95f7e2aSPavel Labath error = m_validator(value_str.c_str(), m_validator_baton); 1309d14084bSEnrico Granata if (error.Fail()) 1319d14084bSEnrico Granata return error; 1329d14084bSEnrico Granata } 13367cc0636SGreg Clayton m_value_was_set = true; 1344c05410fSGreg Clayton if (m_options.Test (eOptionEncodeCharacterEscapeSequences)) 1354c05410fSGreg Clayton { 136*c95f7e2aSPavel Labath Args::EncodeEscapeSequences (value_str.c_str(), m_current_value); 1374c05410fSGreg Clayton } 1384c05410fSGreg Clayton else 1394c05410fSGreg Clayton { 140*c95f7e2aSPavel Labath SetCurrentValue (value_str.c_str()); 1414c05410fSGreg Clayton } 142332e8b1cSGreg Clayton NotifyValueChanged(); 14367cc0636SGreg Clayton break; 14467cc0636SGreg Clayton } 14567cc0636SGreg Clayton return error; 14667cc0636SGreg Clayton } 14767cc0636SGreg Clayton 14867cc0636SGreg Clayton 14967cc0636SGreg Clayton lldb::OptionValueSP 15067cc0636SGreg Clayton OptionValueString::DeepCopy () const 15167cc0636SGreg Clayton { 15267cc0636SGreg Clayton return OptionValueSP(new OptionValueString(*this)); 15367cc0636SGreg Clayton } 1549d14084bSEnrico Granata 1559d14084bSEnrico Granata Error 1569d14084bSEnrico Granata OptionValueString::SetCurrentValue (const char *value) 1579d14084bSEnrico Granata { 1589d14084bSEnrico Granata if (m_validator) 1599d14084bSEnrico Granata { 1609d14084bSEnrico Granata Error error(m_validator(value,m_validator_baton)); 1619d14084bSEnrico Granata if (error.Fail()) 1629d14084bSEnrico Granata return error; 1639d14084bSEnrico Granata } 1649d14084bSEnrico Granata if (value && value[0]) 1659d14084bSEnrico Granata m_current_value.assign (value); 1669d14084bSEnrico Granata else 1679d14084bSEnrico Granata m_current_value.clear(); 1689d14084bSEnrico Granata return Error(); 1699d14084bSEnrico Granata } 1709d14084bSEnrico Granata 1719d14084bSEnrico Granata Error 1729d14084bSEnrico Granata OptionValueString::AppendToCurrentValue (const char *value) 1739d14084bSEnrico Granata { 1749d14084bSEnrico Granata if (value && value[0]) 1759d14084bSEnrico Granata { 1769d14084bSEnrico Granata if (m_validator) 1779d14084bSEnrico Granata { 1789d14084bSEnrico Granata std::string new_value(m_current_value); 1799d14084bSEnrico Granata new_value.append(value); 1809d14084bSEnrico Granata Error error(m_validator(value,m_validator_baton)); 1819d14084bSEnrico Granata if (error.Fail()) 1829d14084bSEnrico Granata return error; 1839d14084bSEnrico Granata m_current_value.assign(new_value); 1849d14084bSEnrico Granata } 1859d14084bSEnrico Granata else 1869d14084bSEnrico Granata m_current_value.append (value); 1879d14084bSEnrico Granata } 1889d14084bSEnrico Granata return Error(); 1899d14084bSEnrico Granata } 190