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