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