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::SetValueFromString (llvm::StringRef value_str, 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_str.str().c_str(), 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_str.size() == 0) 65 error.SetErrorString ("invalid boolean string value <empty>"); 66 else 67 error.SetErrorStringWithFormat ("invalid boolean string value: '%s'", 68 value_str.str().c_str()); 69 } 70 } 71 break; 72 73 case eVarSetOperationInsertBefore: 74 case eVarSetOperationInsertAfter: 75 case eVarSetOperationRemove: 76 case eVarSetOperationAppend: 77 case eVarSetOperationInvalid: 78 error = OptionValue::SetValueFromString (value_str, op); 79 break; 80 } 81 return error; 82 } 83 84 lldb::OptionValueSP 85 OptionValueBoolean::DeepCopy () const 86 { 87 return OptionValueSP(new OptionValueBoolean(*this)); 88 } 89 90 size_t 91 OptionValueBoolean::AutoComplete (CommandInterpreter &interpreter, 92 const char *s, 93 int match_start_point, 94 int max_return_elements, 95 bool &word_complete, 96 StringList &matches) 97 { 98 word_complete = false; 99 matches.Clear(); 100 struct StringEntry { 101 const char *string; 102 const size_t length; 103 }; 104 static const StringEntry g_autocomplete_entries[] = 105 { 106 { "true" , 4 }, 107 { "false", 5 }, 108 { "on" , 2 }, 109 { "off" , 3 }, 110 { "yes" , 3 }, 111 { "no" , 2 }, 112 { "1" , 1 }, 113 { "0" , 1 }, 114 }; 115 const size_t k_num_autocomplete_entries = llvm::array_lengthof(g_autocomplete_entries); 116 117 if (s && s[0]) 118 { 119 const size_t s_len = strlen(s); 120 for (size_t i=0; i<k_num_autocomplete_entries; ++i) 121 { 122 if (s_len <= g_autocomplete_entries[i].length) 123 if (::strncasecmp(s, g_autocomplete_entries[i].string, s_len) == 0) 124 matches.AppendString(g_autocomplete_entries[i].string); 125 } 126 } 127 else 128 { 129 // only suggest "true" or "false" by default 130 for (size_t i=0; i<2; ++i) 131 matches.AppendString(g_autocomplete_entries[i].string); 132 } 133 return matches.GetSize(); 134 } 135 136 137 138