173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//===-- OptionValueBoolean.cpp ------------------------------------*- C++ -*-===//
273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//
373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//                     The LLVM Compiler Infrastructure
473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//
573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// This file is distributed under the University of Illinois Open Source
673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// License. See LICENSE.TXT for details.
773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//
873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//===----------------------------------------------------------------------===//
973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
1073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/OptionValueBoolean.h"
1173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
1273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// C Includes
1373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// C++ Includes
1473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// Other libraries and framework includes
1573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// Project includes
1673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Core/Stream.h"
179f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton#include "lldb/Core/StringList.h"
1873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/Args.h"
1973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
2073844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonusing namespace lldb;
2173844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonusing namespace lldb_private;
2273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
2373844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonvoid
2473844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValueBoolean::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask)
2573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{
2673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    if (dump_mask & eDumpOptionType)
2773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        strm.Printf ("(%s)", GetTypeAsCString ());
2873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//    if (dump_mask & eDumpOptionName)
2973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//        DumpQualifiedName (strm);
3073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    if (dump_mask & eDumpOptionValue)
3173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    {
3273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        if (dump_mask & eDumpOptionType)
3373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            strm.PutCString (" = ");
3473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        strm.PutCString (m_current_value ? "true" : "false");
3573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    }
3673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}
3773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
3873844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonError
3973844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValueBoolean::SetValueFromCString (const char *value_cstr,
4073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                                         VarSetOperationType op)
4173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{
4273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    Error error;
4373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    switch (op)
4473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    {
4573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    case eVarSetOperationClear:
4673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        Clear();
4773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        break;
4873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
4973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    case eVarSetOperationReplace:
5073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    case eVarSetOperationAssign:
5173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        {
5273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            bool success = false;
5373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            bool value = Args::StringToBoolean(value_cstr, false, &success);
5473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            if (success)
5573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            {
5673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                m_value_was_set = true;
5773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                m_current_value = value;
5873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            }
5973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            else
6073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            {
6173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                if (value_cstr == NULL)
6273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    error.SetErrorString ("invalid boolean string value: NULL");
6373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                else if (value_cstr[0] == '\0')
6473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    error.SetErrorString ("invalid boolean string value <empty>");
6573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                else
6673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    error.SetErrorStringWithFormat ("invalid boolean string value: '%s'", value_cstr);
6773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            }
6873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        }
6973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        break;
7073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
7173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    case eVarSetOperationInsertBefore:
7273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    case eVarSetOperationInsertAfter:
7373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    case eVarSetOperationRemove:
7473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    case eVarSetOperationAppend:
7573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    case eVarSetOperationInvalid:
7673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        error = OptionValue::SetValueFromCString (value_cstr, op);
7773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        break;
7873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    }
7973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    return error;
8073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}
8173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
8273844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonlldb::OptionValueSP
8373844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValueBoolean::DeepCopy () const
8473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{
8573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    return OptionValueSP(new OptionValueBoolean(*this));
8673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}
8773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
889f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Claytonsize_t
899f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg ClaytonOptionValueBoolean::AutoComplete (CommandInterpreter &interpreter,
909f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton                                  const char *s,
919f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton                                  int match_start_point,
929f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton                                  int max_return_elements,
939f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton                                  bool &word_complete,
949f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton                                  StringList &matches)
959f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton{
969f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    word_complete = false;
979f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    matches.Clear();
989f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    struct StringEntry {
999f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton        const char *string;
1009f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton        const size_t length;
1019f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    };
1029f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    static const StringEntry g_autocomplete_entries[] =
1039f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    {
1049f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton        { "true" , 4 },
1059f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton        { "false", 5 },
1069f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton        { "on"   , 2 },
1079f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton        { "off"  , 3 },
1089f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton        { "yes"  , 3 },
1099f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton        { "no"   , 2 },
1109f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton        { "1"    , 1 },
1119f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton        { "0"    , 1 },
1129f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    };
1139f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    const size_t k_num_autocomplete_entries = sizeof(g_autocomplete_entries)/sizeof(StringEntry);
1149f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton
1159f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    if (s && s[0])
1169f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    {
1179f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton        const size_t s_len = strlen(s);
1189f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton        for (size_t i=0; i<k_num_autocomplete_entries; ++i)
1199f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton        {
1209f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton            if (s_len <= g_autocomplete_entries[i].length)
1219f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton                if (::strncasecmp(s, g_autocomplete_entries[i].string, s_len) == 0)
1229f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton                    matches.AppendString(g_autocomplete_entries[i].string);
1239f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton        }
1249f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    }
1259f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    else
1269f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    {
1279f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton        // only suggest "true" or "false" by default
1289f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton        for (size_t i=0; i<2; ++i)
1299f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton            matches.AppendString(g_autocomplete_entries[i].string);
1309f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    }
1319f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    return matches.GetSize();
1329f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton}
1339f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton
1349f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton
13573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
136