]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Interpreter/OptionValueBoolean.cpp
Update mandoc to cvs snaphot from 20150302
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Interpreter / OptionValueBoolean.cpp
1 //===-- OptionValueBoolean.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/OptionValueBoolean.h"
11
12 // C Includes
13 // C++ Includes
14 // Other libraries and framework includes
15 // Project includes
16 #include "lldb/Core/Stream.h"
17 #include "lldb/Core/StringList.h"
18 #include "lldb/Interpreter/Args.h"
19 #include "llvm/ADT/STLExtras.h"
20
21 using namespace lldb;
22 using namespace lldb_private;
23
24 void
25 OptionValueBoolean::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask)
26 {
27     if (dump_mask & eDumpOptionType)
28         strm.Printf ("(%s)", GetTypeAsCString ());
29 //    if (dump_mask & eDumpOptionName)
30 //        DumpQualifiedName (strm);
31     if (dump_mask & eDumpOptionValue)
32     {
33         if (dump_mask & eDumpOptionType)
34             strm.PutCString (" = ");
35         strm.PutCString (m_current_value ? "true" : "false");
36     }
37 }
38
39 Error
40 OptionValueBoolean::SetValueFromCString (const char *value_cstr,
41                                          VarSetOperationType op)
42 {
43     Error error;
44     switch (op)
45     {
46     case eVarSetOperationClear:
47         Clear();
48         break;
49
50     case eVarSetOperationReplace:
51     case eVarSetOperationAssign:
52         {
53             bool success = false;
54             bool value = Args::StringToBoolean(value_cstr, false, &success);
55             if (success)
56             {
57                 m_value_was_set = true;
58                 m_current_value = value;
59             }
60             else
61             {
62                 if (value_cstr == nullptr)
63                     error.SetErrorString ("invalid boolean string value: NULL");
64                 else if (value_cstr[0] == '\0')
65                     error.SetErrorString ("invalid boolean string value <empty>");
66                 else
67                     error.SetErrorStringWithFormat ("invalid boolean string value: '%s'", value_cstr);
68             }
69         }
70         break;
71
72     case eVarSetOperationInsertBefore:
73     case eVarSetOperationInsertAfter:
74     case eVarSetOperationRemove:
75     case eVarSetOperationAppend:
76     case eVarSetOperationInvalid:
77         error = OptionValue::SetValueFromCString (value_cstr, op);
78         break;
79     }
80     return error;
81 }
82
83 lldb::OptionValueSP
84 OptionValueBoolean::DeepCopy () const
85 {
86     return OptionValueSP(new OptionValueBoolean(*this));
87 }
88
89 size_t
90 OptionValueBoolean::AutoComplete (CommandInterpreter &interpreter,
91                                   const char *s,
92                                   int match_start_point,
93                                   int max_return_elements,
94                                   bool &word_complete,
95                                   StringList &matches)
96 {
97     word_complete = false;
98     matches.Clear();
99     struct StringEntry {
100         const char *string;
101         const size_t length;
102     };
103     static const StringEntry g_autocomplete_entries[] =
104     {
105         { "true" , 4 },
106         { "false", 5 },
107         { "on"   , 2 },
108         { "off"  , 3 },
109         { "yes"  , 3 },
110         { "no"   , 2 },
111         { "1"    , 1 },
112         { "0"    , 1 },
113     };
114     const size_t k_num_autocomplete_entries = llvm::array_lengthof(g_autocomplete_entries);
115     
116     if (s && s[0])
117     {
118         const size_t s_len = strlen(s);
119         for (size_t i=0; i<k_num_autocomplete_entries; ++i)
120         {
121             if (s_len <= g_autocomplete_entries[i].length)
122                 if (::strncasecmp(s, g_autocomplete_entries[i].string, s_len) == 0)
123                     matches.AppendString(g_autocomplete_entries[i].string);
124         }
125     }
126     else
127     {
128         // only suggest "true" or "false" by default
129         for (size_t i=0; i<2; ++i)
130             matches.AppendString(g_autocomplete_entries[i].string);
131     }
132     return matches.GetSize();
133 }
134
135
136