1 //===-- OptionValueString.cpp ------------------------------------*- C++ 2 //-*-===// 3 // 4 // The LLVM Compiler Infrastructure 5 // 6 // This file is distributed under the University of Illinois Open Source 7 // License. See LICENSE.TXT for details. 8 // 9 //===----------------------------------------------------------------------===// 10 11 #include "lldb/Interpreter/OptionValueString.h" 12 13 #include "lldb/Host/OptionParser.h" 14 #include "lldb/Utility/Args.h" 15 #include "lldb/Utility/Stream.h" 16 17 using namespace lldb; 18 using namespace lldb_private; 19 20 void OptionValueString::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, 21 uint32_t dump_mask) { 22 if (dump_mask & eDumpOptionType) 23 strm.Printf("(%s)", GetTypeAsCString()); 24 if (dump_mask & eDumpOptionValue) { 25 if (dump_mask & eDumpOptionType) 26 strm.PutCString(" = "); 27 if (!m_current_value.empty() || m_value_was_set) { 28 if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) { 29 std::string expanded_escape_value; 30 Args::ExpandEscapedCharacters(m_current_value.c_str(), 31 expanded_escape_value); 32 if (dump_mask & eDumpOptionRaw) 33 strm.Printf("%s", expanded_escape_value.c_str()); 34 else 35 strm.Printf("\"%s\"", expanded_escape_value.c_str()); 36 } else { 37 if (dump_mask & eDumpOptionRaw) 38 strm.Printf("%s", m_current_value.c_str()); 39 else 40 strm.Printf("\"%s\"", m_current_value.c_str()); 41 } 42 } 43 } 44 } 45 46 Status OptionValueString::SetValueFromString(llvm::StringRef value, 47 VarSetOperationType op) { 48 Status error; 49 50 std::string value_str = value.str(); 51 value = value.trim(); 52 if (value.size() > 0) { 53 switch (value.front()) { 54 case '"': 55 case '\'': { 56 if (value.size() <= 1 || value.back() != value.front()) { 57 error.SetErrorString("mismatched quotes"); 58 return error; 59 } 60 value = value.drop_front().drop_back(); 61 } break; 62 } 63 value_str = value.str(); 64 } 65 66 switch (op) { 67 case eVarSetOperationInvalid: 68 case eVarSetOperationInsertBefore: 69 case eVarSetOperationInsertAfter: 70 case eVarSetOperationRemove: 71 if (m_validator) { 72 error = m_validator(value_str.c_str(), m_validator_baton); 73 if (error.Fail()) 74 return error; 75 } 76 error = OptionValue::SetValueFromString(value, op); 77 break; 78 79 case eVarSetOperationAppend: { 80 std::string new_value(m_current_value); 81 if (value.size() > 0) { 82 if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) { 83 std::string str; 84 Args::EncodeEscapeSequences(value_str.c_str(), str); 85 new_value.append(str); 86 } else 87 new_value.append(value); 88 } 89 if (m_validator) { 90 error = m_validator(new_value.c_str(), m_validator_baton); 91 if (error.Fail()) 92 return error; 93 } 94 m_current_value.assign(new_value); 95 NotifyValueChanged(); 96 } break; 97 98 case eVarSetOperationClear: 99 Clear(); 100 NotifyValueChanged(); 101 break; 102 103 case eVarSetOperationReplace: 104 case eVarSetOperationAssign: 105 if (m_validator) { 106 error = m_validator(value_str.c_str(), m_validator_baton); 107 if (error.Fail()) 108 return error; 109 } 110 m_value_was_set = true; 111 if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) { 112 Args::EncodeEscapeSequences(value_str.c_str(), m_current_value); 113 } else { 114 SetCurrentValue(value_str); 115 } 116 NotifyValueChanged(); 117 break; 118 } 119 return error; 120 } 121 122 lldb::OptionValueSP OptionValueString::DeepCopy() const { 123 return OptionValueSP(new OptionValueString(*this)); 124 } 125 126 Status OptionValueString::SetCurrentValue(llvm::StringRef value) { 127 if (m_validator) { 128 Status error(m_validator(value.str().c_str(), m_validator_baton)); 129 if (error.Fail()) 130 return error; 131 } 132 m_current_value.assign(value); 133 return Status(); 134 } 135 136 Status OptionValueString::AppendToCurrentValue(const char *value) { 137 if (value && value[0]) { 138 if (m_validator) { 139 std::string new_value(m_current_value); 140 new_value.append(value); 141 Status error(m_validator(value, m_validator_baton)); 142 if (error.Fail()) 143 return error; 144 m_current_value.assign(new_value); 145 } else 146 m_current_value.append(value); 147 } 148 return Status(); 149 } 150