]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/tools/lldb/source/Interpreter/OptionValueEnumeration.cpp
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / tools / lldb / source / Interpreter / OptionValueEnumeration.cpp
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 (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         }
53         strm.Printf("%" PRIu64, (uint64_t)m_current_value);
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     {
116         for (size_t i=0; enumerators[i].string_value != NULL; ++i)
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
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