1 //===-- OptionValueEnumeration.cpp ------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "lldb/Interpreter/OptionValueEnumeration.h" 11 12 // C Includes 13 // C++ Includes 14 // Other libraries and framework includes 15 // Project includes 16 #include "lldb/Core/StringList.h" 17 18 using namespace lldb; 19 using namespace lldb_private; 20 21 OptionValueEnumeration::OptionValueEnumeration( 22 const OptionEnumValueElement *enumerators, enum_type value) 23 : OptionValue(), m_current_value(value), m_default_value(value), 24 m_enumerations() { 25 SetEnumerations(enumerators); 26 } 27 28 OptionValueEnumeration::~OptionValueEnumeration() {} 29 30 void OptionValueEnumeration::DumpValue(const ExecutionContext *exe_ctx, 31 Stream &strm, uint32_t dump_mask) { 32 if (dump_mask & eDumpOptionType) 33 strm.Printf("(%s)", GetTypeAsCString()); 34 if (dump_mask & eDumpOptionValue) { 35 if (dump_mask & eDumpOptionType) 36 strm.PutCString(" = "); 37 const size_t count = m_enumerations.GetSize(); 38 for (size_t i = 0; i < count; ++i) { 39 if (m_enumerations.GetValueAtIndexUnchecked(i).value == m_current_value) { 40 strm.PutCString(m_enumerations.GetCStringAtIndex(i)); 41 return; 42 } 43 } 44 strm.Printf("%" PRIu64, (uint64_t)m_current_value); 45 } 46 } 47 48 Error OptionValueEnumeration::SetValueFromString(llvm::StringRef value, 49 VarSetOperationType op) { 50 Error error; 51 switch (op) { 52 case eVarSetOperationClear: 53 Clear(); 54 NotifyValueChanged(); 55 break; 56 57 case eVarSetOperationReplace: 58 case eVarSetOperationAssign: { 59 ConstString const_enumerator_name(value.trim()); 60 const EnumerationMapEntry *enumerator_entry = 61 m_enumerations.FindFirstValueForName( 62 const_enumerator_name.GetStringRef()); 63 if (enumerator_entry) { 64 m_current_value = enumerator_entry->value.value; 65 NotifyValueChanged(); 66 } else { 67 StreamString error_strm; 68 error_strm.Printf("invalid enumeration value '%s'", value.str().c_str()); 69 const size_t count = m_enumerations.GetSize(); 70 if (count) { 71 error_strm.Printf(", valid values are: %s", 72 m_enumerations.GetCStringAtIndex(0).str().c_str()); 73 for (size_t i = 1; i < count; ++i) { 74 error_strm.Printf(", %s", 75 m_enumerations.GetCStringAtIndex(i).str().c_str()); 76 } 77 } 78 error.SetErrorString(error_strm.GetData()); 79 } 80 break; 81 } 82 83 case eVarSetOperationInsertBefore: 84 case eVarSetOperationInsertAfter: 85 case eVarSetOperationRemove: 86 case eVarSetOperationAppend: 87 case eVarSetOperationInvalid: 88 error = OptionValue::SetValueFromString(value, op); 89 break; 90 } 91 return error; 92 } 93 94 void OptionValueEnumeration::SetEnumerations( 95 const OptionEnumValueElement *enumerators) { 96 m_enumerations.Clear(); 97 if (enumerators) { 98 for (size_t i = 0; enumerators[i].string_value != nullptr; ++i) { 99 ConstString const_enumerator_name(enumerators[i].string_value); 100 EnumeratorInfo enumerator_info = {enumerators[i].value, 101 enumerators[i].usage}; 102 m_enumerations.Append(const_enumerator_name.GetStringRef(), 103 enumerator_info); 104 } 105 m_enumerations.Sort(); 106 } 107 } 108 109 lldb::OptionValueSP OptionValueEnumeration::DeepCopy() const { 110 return OptionValueSP(new OptionValueEnumeration(*this)); 111 } 112 113 size_t OptionValueEnumeration::AutoComplete( 114 CommandInterpreter &interpreter, const char *s, int match_start_point, 115 int max_return_elements, bool &word_complete, StringList &matches) { 116 word_complete = false; 117 matches.Clear(); 118 119 const uint32_t num_enumerators = m_enumerations.GetSize(); 120 if (s && s[0]) { 121 for (size_t i = 0; i < num_enumerators; ++i) { 122 llvm::StringRef name = m_enumerations.GetCStringAtIndex(i); 123 if (name.startswith(s)) 124 matches.AppendString(name); 125 } 126 } else { 127 // only suggest "true" or "false" by default 128 for (size_t i = 0; i < num_enumerators; ++i) 129 matches.AppendString(m_enumerations.GetCStringAtIndex(i)); 130 } 131 return matches.GetSize(); 132 } 133