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 #include "llvm/ADT/STLExtras.h" 20 21 using namespace lldb; 22 using namespace lldb_private; 23 24 void 25 OptionValueBoolean::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask) 26 { 27 if (dump_mask & eDumpOptionType) 28 strm.Printf ("(%s)", GetTypeAsCString ()); 29 // if (dump_mask & eDumpOptionName) 30 // DumpQualifiedName (strm); 31 if (dump_mask & eDumpOptionValue) 32 { 33 if (dump_mask & eDumpOptionType) 34 strm.PutCString (" = "); 35 strm.PutCString (m_current_value ? "true" : "false"); 36 } 37 } 38 39 Error 40 OptionValueBoolean::SetValueFromCString (const char *value_cstr, 41 VarSetOperationType op) 42 { 43 Error error; 44 switch (op) 45 { 46 case eVarSetOperationClear: 47 Clear(); 48 NotifyValueChanged(); 49 break; 50 51 case eVarSetOperationReplace: 52 case eVarSetOperationAssign: 53 { 54 bool success = false; 55 bool value = Args::StringToBoolean(value_cstr, false, &success); 56 if (success) 57 { 58 m_value_was_set = true; 59 m_current_value = value; 60 NotifyValueChanged(); 61 } 62 else 63 { 64 if (value_cstr == nullptr) 65 error.SetErrorString ("invalid boolean string value: NULL"); 66 else if (value_cstr[0] == '\0') 67 error.SetErrorString ("invalid boolean string value <empty>"); 68 else 69 error.SetErrorStringWithFormat ("invalid boolean string value: '%s'", value_cstr); 70 } 71 } 72 break; 73 74 case eVarSetOperationInsertBefore: 75 case eVarSetOperationInsertAfter: 76 case eVarSetOperationRemove: 77 case eVarSetOperationAppend: 78 case eVarSetOperationInvalid: 79 error = OptionValue::SetValueFromCString (value_cstr, 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