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