| Greg Clayton | 67cc063 | 2012-08-22 17:17:09 +0000 | [diff] [blame] | 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 | 
| Greg Clayton | 754a936 | 2012-08-23 00:22:02 +0000 | [diff] [blame] | 16 | #include "lldb/Core/StringList.h" | 
| Greg Clayton | 67cc063 | 2012-08-22 17:17:09 +0000 | [diff] [blame] | 17 |  | 
|  | 18 | using namespace lldb; | 
|  | 19 | using namespace lldb_private; | 
|  | 20 |  | 
|  | 21 | OptionValueEnumeration::OptionValueEnumeration (const OptionEnumValueElement *enumerators, | 
|  | 22 | enum_type value) : | 
|  | 23 | OptionValue(), | 
|  | 24 | m_current_value (value), | 
|  | 25 | m_default_value (value), | 
|  | 26 | m_enumerations () | 
|  | 27 | { | 
|  | 28 | SetEnumerations(enumerators); | 
|  | 29 | } | 
|  | 30 |  | 
|  | 31 | OptionValueEnumeration::~OptionValueEnumeration() | 
|  | 32 | { | 
|  | 33 | } | 
|  | 34 |  | 
|  | 35 | void | 
|  | 36 | OptionValueEnumeration::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask) | 
|  | 37 | { | 
|  | 38 | if (dump_mask & eDumpOptionType) | 
|  | 39 | strm.Printf ("(%s)", GetTypeAsCString ()); | 
|  | 40 | if (dump_mask & eDumpOptionValue) | 
|  | 41 | { | 
|  | 42 | if (dump_mask & eDumpOptionType) | 
|  | 43 | strm.PutCString (" = "); | 
|  | 44 | const size_t count = m_enumerations.GetSize (); | 
|  | 45 | for (size_t i=0; i<count; ++i) | 
|  | 46 | { | 
|  | 47 | if (m_enumerations.GetValueAtIndexUnchecked(i).value == m_current_value) | 
|  | 48 | { | 
|  | 49 | strm.PutCString(m_enumerations.GetCStringAtIndex(i)); | 
|  | 50 | return; | 
|  | 51 | } | 
|  | 52 | } | 
| Daniel Malea | d01b295 | 2012-11-29 21:49:15 +0000 | [diff] [blame] | 53 | strm.Printf("%" PRIu64, (uint64_t)m_current_value); | 
| Greg Clayton | 67cc063 | 2012-08-22 17:17:09 +0000 | [diff] [blame] | 54 | } | 
|  | 55 | } | 
|  | 56 |  | 
|  | 57 | Error | 
|  | 58 | OptionValueEnumeration::SetValueFromCString (const char *value, VarSetOperationType op) | 
|  | 59 | { | 
|  | 60 | Error error; | 
|  | 61 | switch (op) | 
|  | 62 | { | 
|  | 63 | case eVarSetOperationClear: | 
|  | 64 | Clear (); | 
|  | 65 | break; | 
|  | 66 |  | 
|  | 67 | case eVarSetOperationReplace: | 
|  | 68 | case eVarSetOperationAssign: | 
|  | 69 | if (value && value[0]) | 
|  | 70 | { | 
|  | 71 | ConstString const_enumerator_name(value); | 
|  | 72 | const EnumerationMapEntry *enumerator_entry = m_enumerations.FindFirstValueForName (const_enumerator_name.GetCString()); | 
|  | 73 | if (enumerator_entry) | 
|  | 74 | { | 
|  | 75 | m_current_value = enumerator_entry->value.value; | 
|  | 76 | } | 
|  | 77 | else | 
|  | 78 | { | 
|  | 79 | StreamString error_strm; | 
|  | 80 | error_strm.Printf("invalid enumeration value '%s'", value); | 
|  | 81 | const size_t count = m_enumerations.GetSize (); | 
|  | 82 | if (count) | 
|  | 83 | { | 
|  | 84 | error_strm.Printf(", valid values are: %s", m_enumerations.GetCStringAtIndex(0)); | 
|  | 85 | for (size_t i=1; i<count; ++i) | 
|  | 86 | { | 
|  | 87 | error_strm.Printf (", %s", m_enumerations.GetCStringAtIndex(i)); | 
|  | 88 | } | 
|  | 89 | } | 
|  | 90 | error.SetErrorString(error_strm.GetData()); | 
|  | 91 | } | 
|  | 92 | } | 
|  | 93 | else | 
|  | 94 | { | 
|  | 95 | error.SetErrorString("invalid enumeration value"); | 
|  | 96 | } | 
|  | 97 | break; | 
|  | 98 |  | 
|  | 99 | case eVarSetOperationInsertBefore: | 
|  | 100 | case eVarSetOperationInsertAfter: | 
|  | 101 | case eVarSetOperationRemove: | 
|  | 102 | case eVarSetOperationAppend: | 
|  | 103 | case eVarSetOperationInvalid: | 
|  | 104 | error = OptionValue::SetValueFromCString (value, op); | 
|  | 105 | break; | 
|  | 106 | } | 
|  | 107 | return error; | 
|  | 108 | } | 
|  | 109 |  | 
|  | 110 | void | 
|  | 111 | OptionValueEnumeration::SetEnumerations (const OptionEnumValueElement *enumerators) | 
|  | 112 | { | 
|  | 113 | m_enumerations.Clear(); | 
|  | 114 | if (enumerators) | 
|  | 115 | { | 
| Ed Maste | d78c957 | 2014-04-20 00:31:37 +0000 | [diff] [blame] | 116 | for (size_t i=0; enumerators[i].string_value != nullptr; ++i) | 
| Greg Clayton | 67cc063 | 2012-08-22 17:17:09 +0000 | [diff] [blame] | 117 | { | 
|  | 118 | ConstString const_enumerator_name(enumerators[i].string_value); | 
|  | 119 | EnumeratorInfo enumerator_info = { enumerators[i].value, enumerators[i].usage }; | 
|  | 120 | m_enumerations.Append (const_enumerator_name.GetCString(), enumerator_info); | 
|  | 121 | } | 
|  | 122 | m_enumerations.Sort(); | 
|  | 123 | } | 
|  | 124 | } | 
|  | 125 |  | 
|  | 126 |  | 
|  | 127 | lldb::OptionValueSP | 
|  | 128 | OptionValueEnumeration::DeepCopy () const | 
|  | 129 | { | 
|  | 130 | return OptionValueSP(new OptionValueEnumeration(*this)); | 
|  | 131 | } | 
|  | 132 |  | 
| Greg Clayton | 754a936 | 2012-08-23 00:22:02 +0000 | [diff] [blame] | 133 | size_t | 
|  | 134 | OptionValueEnumeration::AutoComplete (CommandInterpreter &interpreter, | 
|  | 135 | const char *s, | 
|  | 136 | int match_start_point, | 
|  | 137 | int max_return_elements, | 
|  | 138 | bool &word_complete, | 
|  | 139 | StringList &matches) | 
|  | 140 | { | 
|  | 141 | word_complete = false; | 
|  | 142 | matches.Clear(); | 
|  | 143 |  | 
|  | 144 | const uint32_t num_enumerators = m_enumerations.GetSize(); | 
|  | 145 | if (s && s[0]) | 
|  | 146 | { | 
|  | 147 | const size_t s_len = strlen(s); | 
|  | 148 | for (size_t i=0; i<num_enumerators; ++i) | 
|  | 149 | { | 
|  | 150 | const char *name = m_enumerations.GetCStringAtIndex(i); | 
|  | 151 | if (::strncmp(s, name, s_len) == 0) | 
|  | 152 | matches.AppendString(name); | 
|  | 153 | } | 
|  | 154 | } | 
|  | 155 | else | 
|  | 156 | { | 
|  | 157 | // only suggest "true" or "false" by default | 
|  | 158 | for (size_t i=0; i<num_enumerators; ++i) | 
|  | 159 | matches.AppendString(m_enumerations.GetCStringAtIndex(i)); | 
|  | 160 | } | 
|  | 161 | return matches.GetSize(); | 
|  | 162 | } | 
|  | 163 |  | 
|  | 164 |  | 
|  | 165 |  | 
|  | 166 |  |