1254721Semaste//===-- OptionValueBoolean.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/OptionValueBoolean.h"
11254721Semaste
12254721Semaste// C Includes
13254721Semaste// C++ Includes
14254721Semaste// Other libraries and framework includes
15254721Semaste// Project includes
16254721Semaste#include "lldb/Core/Stream.h"
17254721Semaste#include "lldb/Core/StringList.h"
18254721Semaste#include "lldb/Interpreter/Args.h"
19254721Semaste
20254721Semasteusing namespace lldb;
21254721Semasteusing namespace lldb_private;
22254721Semaste
23254721Semastevoid
24254721SemasteOptionValueBoolean::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask)
25254721Semaste{
26254721Semaste    if (dump_mask & eDumpOptionType)
27254721Semaste        strm.Printf ("(%s)", GetTypeAsCString ());
28254721Semaste//    if (dump_mask & eDumpOptionName)
29254721Semaste//        DumpQualifiedName (strm);
30254721Semaste    if (dump_mask & eDumpOptionValue)
31254721Semaste    {
32254721Semaste        if (dump_mask & eDumpOptionType)
33254721Semaste            strm.PutCString (" = ");
34254721Semaste        strm.PutCString (m_current_value ? "true" : "false");
35254721Semaste    }
36254721Semaste}
37254721Semaste
38254721SemasteError
39254721SemasteOptionValueBoolean::SetValueFromCString (const char *value_cstr,
40254721Semaste                                         VarSetOperationType op)
41254721Semaste{
42254721Semaste    Error error;
43254721Semaste    switch (op)
44254721Semaste    {
45254721Semaste    case eVarSetOperationClear:
46254721Semaste        Clear();
47254721Semaste        break;
48254721Semaste
49254721Semaste    case eVarSetOperationReplace:
50254721Semaste    case eVarSetOperationAssign:
51254721Semaste        {
52254721Semaste            bool success = false;
53254721Semaste            bool value = Args::StringToBoolean(value_cstr, false, &success);
54254721Semaste            if (success)
55254721Semaste            {
56254721Semaste                m_value_was_set = true;
57254721Semaste                m_current_value = value;
58254721Semaste            }
59254721Semaste            else
60254721Semaste            {
61254721Semaste                if (value_cstr == NULL)
62254721Semaste                    error.SetErrorString ("invalid boolean string value: NULL");
63254721Semaste                else if (value_cstr[0] == '\0')
64254721Semaste                    error.SetErrorString ("invalid boolean string value <empty>");
65254721Semaste                else
66254721Semaste                    error.SetErrorStringWithFormat ("invalid boolean string value: '%s'", value_cstr);
67254721Semaste            }
68254721Semaste        }
69254721Semaste        break;
70254721Semaste
71254721Semaste    case eVarSetOperationInsertBefore:
72254721Semaste    case eVarSetOperationInsertAfter:
73254721Semaste    case eVarSetOperationRemove:
74254721Semaste    case eVarSetOperationAppend:
75254721Semaste    case eVarSetOperationInvalid:
76254721Semaste        error = OptionValue::SetValueFromCString (value_cstr, op);
77254721Semaste        break;
78254721Semaste    }
79254721Semaste    return error;
80254721Semaste}
81254721Semaste
82254721Semastelldb::OptionValueSP
83254721SemasteOptionValueBoolean::DeepCopy () const
84254721Semaste{
85254721Semaste    return OptionValueSP(new OptionValueBoolean(*this));
86254721Semaste}
87254721Semaste
88254721Semastesize_t
89254721SemasteOptionValueBoolean::AutoComplete (CommandInterpreter &interpreter,
90254721Semaste                                  const char *s,
91254721Semaste                                  int match_start_point,
92254721Semaste                                  int max_return_elements,
93254721Semaste                                  bool &word_complete,
94254721Semaste                                  StringList &matches)
95254721Semaste{
96254721Semaste    word_complete = false;
97254721Semaste    matches.Clear();
98254721Semaste    struct StringEntry {
99254721Semaste        const char *string;
100254721Semaste        const size_t length;
101254721Semaste    };
102254721Semaste    static const StringEntry g_autocomplete_entries[] =
103254721Semaste    {
104254721Semaste        { "true" , 4 },
105254721Semaste        { "false", 5 },
106254721Semaste        { "on"   , 2 },
107254721Semaste        { "off"  , 3 },
108254721Semaste        { "yes"  , 3 },
109254721Semaste        { "no"   , 2 },
110254721Semaste        { "1"    , 1 },
111254721Semaste        { "0"    , 1 },
112254721Semaste    };
113254721Semaste    const size_t k_num_autocomplete_entries = sizeof(g_autocomplete_entries)/sizeof(StringEntry);
114254721Semaste
115254721Semaste    if (s && s[0])
116254721Semaste    {
117254721Semaste        const size_t s_len = strlen(s);
118254721Semaste        for (size_t i=0; i<k_num_autocomplete_entries; ++i)
119254721Semaste        {
120254721Semaste            if (s_len <= g_autocomplete_entries[i].length)
121254721Semaste                if (::strncasecmp(s, g_autocomplete_entries[i].string, s_len) == 0)
122254721Semaste                    matches.AppendString(g_autocomplete_entries[i].string);
123254721Semaste        }
124254721Semaste    }
125254721Semaste    else
126254721Semaste    {
127254721Semaste        // only suggest "true" or "false" by default
128254721Semaste        for (size_t i=0; i<2; ++i)
129254721Semaste            matches.AppendString(g_autocomplete_entries[i].string);
130254721Semaste    }
131254721Semaste    return matches.GetSize();
132254721Semaste}
133254721Semaste
134254721Semaste
135254721Semaste
136