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