1 //===-- OptionValueEnumeration.cpp ------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "lldb/Interpreter/OptionValueEnumeration.h"
14 // Other libraries and framework includes
16 #include "lldb/Core/StringList.h"
19 using namespace lldb_private;
21 OptionValueEnumeration::OptionValueEnumeration (const OptionEnumValueElement *enumerators,
24 m_current_value (value),
25 m_default_value (value),
28 SetEnumerations(enumerators);
31 OptionValueEnumeration::~OptionValueEnumeration()
36 OptionValueEnumeration::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask)
38 if (dump_mask & eDumpOptionType)
39 strm.Printf ("(%s)", GetTypeAsCString ());
40 if (dump_mask & eDumpOptionValue)
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)
47 if (m_enumerations.GetValueAtIndexUnchecked(i).value == m_current_value)
49 strm.PutCString(m_enumerations.GetCStringAtIndex(i));
53 strm.Printf("%" PRIu64, (uint64_t)m_current_value);
58 OptionValueEnumeration::SetValueFromCString (const char *value, VarSetOperationType op)
63 case eVarSetOperationClear:
67 case eVarSetOperationReplace:
68 case eVarSetOperationAssign:
69 if (value && value[0])
71 ConstString const_enumerator_name(value);
72 const EnumerationMapEntry *enumerator_entry = m_enumerations.FindFirstValueForName (const_enumerator_name.GetCString());
75 m_current_value = enumerator_entry->value.value;
79 StreamString error_strm;
80 error_strm.Printf("invalid enumeration value '%s'", value);
81 const size_t count = m_enumerations.GetSize ();
84 error_strm.Printf(", valid values are: %s", m_enumerations.GetCStringAtIndex(0));
85 for (size_t i=1; i<count; ++i)
87 error_strm.Printf (", %s", m_enumerations.GetCStringAtIndex(i));
90 error.SetErrorString(error_strm.GetData());
95 error.SetErrorString("invalid enumeration value");
99 case eVarSetOperationInsertBefore:
100 case eVarSetOperationInsertAfter:
101 case eVarSetOperationRemove:
102 case eVarSetOperationAppend:
103 case eVarSetOperationInvalid:
104 error = OptionValue::SetValueFromCString (value, op);
111 OptionValueEnumeration::SetEnumerations (const OptionEnumValueElement *enumerators)
113 m_enumerations.Clear();
116 for (size_t i=0; enumerators[i].string_value != NULL; ++i)
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);
122 m_enumerations.Sort();
128 OptionValueEnumeration::DeepCopy () const
130 return OptionValueSP(new OptionValueEnumeration(*this));
134 OptionValueEnumeration::AutoComplete (CommandInterpreter &interpreter,
136 int match_start_point,
137 int max_return_elements,
141 word_complete = false;
144 const uint32_t num_enumerators = m_enumerations.GetSize();
147 const size_t s_len = strlen(s);
148 for (size_t i=0; i<num_enumerators; ++i)
150 const char *name = m_enumerations.GetCStringAtIndex(i);
151 if (::strncmp(s, name, s_len) == 0)
152 matches.AppendString(name);
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));
161 return matches.GetSize();