blob: 7aceac91b6012cdec8c24a71436dd2c1767d6950 [file] [log] [blame]
Greg Clayton67cc0632012-08-22 17:17:09 +00001//===-- 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 Clayton754a9362012-08-23 00:22:02 +000016#include "lldb/Core/StringList.h"
Greg Clayton67cc0632012-08-22 17:17:09 +000017
18using namespace lldb;
19using namespace lldb_private;
20
21OptionValueEnumeration::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
31OptionValueEnumeration::~OptionValueEnumeration()
32{
33}
34
35void
36OptionValueEnumeration::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 Malead01b2952012-11-29 21:49:15 +000053 strm.Printf("%" PRIu64, (uint64_t)m_current_value);
Greg Clayton67cc0632012-08-22 17:17:09 +000054 }
55}
56
57Error
58OptionValueEnumeration::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
110void
111OptionValueEnumeration::SetEnumerations (const OptionEnumValueElement *enumerators)
112{
113 m_enumerations.Clear();
114 if (enumerators)
115 {
Ed Masted78c9572014-04-20 00:31:37 +0000116 for (size_t i=0; enumerators[i].string_value != nullptr; ++i)
Greg Clayton67cc0632012-08-22 17:17:09 +0000117 {
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
127lldb::OptionValueSP
128OptionValueEnumeration::DeepCopy () const
129{
130 return OptionValueSP(new OptionValueEnumeration(*this));
131}
132
Greg Clayton754a9362012-08-23 00:22:02 +0000133size_t
134OptionValueEnumeration::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