1254721Semaste//===-- OptionValueEnumeration.cpp ------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#include "lldb/Interpreter/OptionValueEnumeration.h"
11254721Semaste
12254721Semaste// C Includes
13254721Semaste// C++ Includes
14254721Semaste// Other libraries and framework includes
15254721Semaste// Project includes
16254721Semaste#include "lldb/Core/StringList.h"
17254721Semaste
18254721Semasteusing namespace lldb;
19254721Semasteusing namespace lldb_private;
20254721Semaste
21254721SemasteOptionValueEnumeration::OptionValueEnumeration (const OptionEnumValueElement *enumerators,
22254721Semaste                                                enum_type value) :
23254721Semaste    OptionValue(),
24254721Semaste    m_current_value (value),
25254721Semaste    m_default_value (value),
26254721Semaste    m_enumerations ()
27254721Semaste{
28254721Semaste    SetEnumerations(enumerators);
29254721Semaste}
30254721Semaste
31254721SemasteOptionValueEnumeration::~OptionValueEnumeration()
32254721Semaste{
33254721Semaste}
34254721Semaste
35254721Semastevoid
36254721SemasteOptionValueEnumeration::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask)
37254721Semaste{
38254721Semaste    if (dump_mask & eDumpOptionType)
39254721Semaste        strm.Printf ("(%s)", GetTypeAsCString ());
40254721Semaste    if (dump_mask & eDumpOptionValue)
41254721Semaste    {
42254721Semaste        if (dump_mask & eDumpOptionType)
43254721Semaste            strm.PutCString (" = ");
44254721Semaste        const size_t count = m_enumerations.GetSize ();
45254721Semaste        for (size_t i=0; i<count; ++i)
46254721Semaste        {
47254721Semaste            if (m_enumerations.GetValueAtIndexUnchecked(i).value == m_current_value)
48254721Semaste            {
49254721Semaste                strm.PutCString(m_enumerations.GetCStringAtIndex(i));
50254721Semaste                return;
51254721Semaste            }
52254721Semaste        }
53254721Semaste        strm.Printf("%" PRIu64, (uint64_t)m_current_value);
54254721Semaste    }
55254721Semaste}
56254721Semaste
57254721SemasteError
58288943SdimOptionValueEnumeration::SetValueFromString (llvm::StringRef value, VarSetOperationType op)
59254721Semaste{
60254721Semaste    Error error;
61254721Semaste    switch (op)
62254721Semaste    {
63254721Semaste        case eVarSetOperationClear:
64254721Semaste            Clear ();
65280031Sdim            NotifyValueChanged();
66254721Semaste            break;
67254721Semaste
68254721Semaste        case eVarSetOperationReplace:
69254721Semaste        case eVarSetOperationAssign:
70254721Semaste            {
71288943Sdim                ConstString const_enumerator_name(value.trim());
72254721Semaste                const EnumerationMapEntry *enumerator_entry = m_enumerations.FindFirstValueForName (const_enumerator_name.GetCString());
73254721Semaste                if (enumerator_entry)
74254721Semaste                {
75254721Semaste                    m_current_value = enumerator_entry->value.value;
76280031Sdim                    NotifyValueChanged();
77254721Semaste                }
78254721Semaste                else
79254721Semaste                {
80254721Semaste                    StreamString error_strm;
81288943Sdim                    error_strm.Printf("invalid enumeration value '%s'", value.str().c_str());
82254721Semaste                    const size_t count = m_enumerations.GetSize ();
83254721Semaste                    if (count)
84254721Semaste                    {
85254721Semaste                        error_strm.Printf(", valid values are: %s", m_enumerations.GetCStringAtIndex(0));
86254721Semaste                        for (size_t i=1; i<count; ++i)
87254721Semaste                        {
88254721Semaste                            error_strm.Printf (", %s", m_enumerations.GetCStringAtIndex(i));
89254721Semaste                        }
90254721Semaste                    }
91254721Semaste                    error.SetErrorString(error_strm.GetData());
92254721Semaste                }
93288943Sdim                break;
94254721Semaste            }
95254721Semaste
96254721Semaste        case eVarSetOperationInsertBefore:
97254721Semaste        case eVarSetOperationInsertAfter:
98254721Semaste        case eVarSetOperationRemove:
99254721Semaste        case eVarSetOperationAppend:
100254721Semaste        case eVarSetOperationInvalid:
101288943Sdim            error = OptionValue::SetValueFromString (value, op);
102254721Semaste            break;
103254721Semaste    }
104254721Semaste    return error;
105254721Semaste}
106254721Semaste
107254721Semastevoid
108254721SemasteOptionValueEnumeration::SetEnumerations (const OptionEnumValueElement *enumerators)
109254721Semaste{
110254721Semaste    m_enumerations.Clear();
111254721Semaste    if (enumerators)
112254721Semaste    {
113276479Sdim        for (size_t i=0; enumerators[i].string_value != nullptr; ++i)
114254721Semaste        {
115254721Semaste            ConstString const_enumerator_name(enumerators[i].string_value);
116254721Semaste            EnumeratorInfo enumerator_info = { enumerators[i].value, enumerators[i].usage };
117254721Semaste            m_enumerations.Append (const_enumerator_name.GetCString(), enumerator_info);
118254721Semaste        }
119254721Semaste        m_enumerations.Sort();
120254721Semaste    }
121254721Semaste}
122254721Semaste
123254721Semaste
124254721Semastelldb::OptionValueSP
125254721SemasteOptionValueEnumeration::DeepCopy () const
126254721Semaste{
127254721Semaste    return OptionValueSP(new OptionValueEnumeration(*this));
128254721Semaste}
129254721Semaste
130254721Semastesize_t
131254721SemasteOptionValueEnumeration::AutoComplete (CommandInterpreter &interpreter,
132254721Semaste                                      const char *s,
133254721Semaste                                      int match_start_point,
134254721Semaste                                      int max_return_elements,
135254721Semaste                                      bool &word_complete,
136254721Semaste                                      StringList &matches)
137254721Semaste{
138254721Semaste    word_complete = false;
139254721Semaste    matches.Clear();
140254721Semaste
141254721Semaste    const uint32_t num_enumerators = m_enumerations.GetSize();
142254721Semaste    if (s && s[0])
143254721Semaste    {
144254721Semaste        const size_t s_len = strlen(s);
145254721Semaste        for (size_t i=0; i<num_enumerators; ++i)
146254721Semaste        {
147254721Semaste            const char *name = m_enumerations.GetCStringAtIndex(i);
148254721Semaste            if (::strncmp(s, name, s_len) == 0)
149254721Semaste                matches.AppendString(name);
150254721Semaste        }
151254721Semaste    }
152254721Semaste    else
153254721Semaste    {
154254721Semaste        // only suggest "true" or "false" by default
155254721Semaste        for (size_t i=0; i<num_enumerators; ++i)
156254721Semaste            matches.AppendString(m_enumerations.GetCStringAtIndex(i));
157254721Semaste    }
158254721Semaste    return matches.GetSize();
159254721Semaste}
160254721Semaste
161254721Semaste
162254721Semaste
163254721Semaste
164