1 //===-- OptionValueUUID.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/OptionValueUUID.h" 11 12 // C Includes 13 // C++ Includes 14 // Other libraries and framework includes 15 // Project includes 16 #include "lldb/Core/Module.h" 17 #include "lldb/Core/Stream.h" 18 #include "lldb/Core/StringList.h" 19 #include "lldb/Interpreter/CommandInterpreter.h" 20 21 using namespace lldb; 22 using namespace lldb_private; 23 24 void OptionValueUUID::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, 25 uint32_t dump_mask) { 26 if (dump_mask & eDumpOptionType) 27 strm.Printf("(%s)", GetTypeAsCString()); 28 if (dump_mask & eDumpOptionValue) { 29 if (dump_mask & eDumpOptionType) 30 strm.PutCString(" = "); 31 m_uuid.Dump(&strm); 32 } 33 } 34 35 Error OptionValueUUID::SetValueFromString(llvm::StringRef value, 36 VarSetOperationType op) { 37 Error error; 38 switch (op) { 39 case eVarSetOperationClear: 40 Clear(); 41 NotifyValueChanged(); 42 break; 43 44 case eVarSetOperationReplace: 45 case eVarSetOperationAssign: { 46 if (m_uuid.SetFromCString(value.str().c_str()) == 0) 47 error.SetErrorStringWithFormat("invalid uuid string value '%s'", 48 value.str().c_str()); 49 else { 50 m_value_was_set = true; 51 NotifyValueChanged(); 52 } 53 } break; 54 55 case eVarSetOperationInsertBefore: 56 case eVarSetOperationInsertAfter: 57 case eVarSetOperationRemove: 58 case eVarSetOperationAppend: 59 case eVarSetOperationInvalid: 60 error = OptionValue::SetValueFromString(value, op); 61 break; 62 } 63 return error; 64 } 65 66 lldb::OptionValueSP OptionValueUUID::DeepCopy() const { 67 return OptionValueSP(new OptionValueUUID(*this)); 68 } 69 70 size_t OptionValueUUID::AutoComplete(CommandInterpreter &interpreter, 71 const char *s, int match_start_point, 72 int max_return_elements, 73 bool &word_complete, StringList &matches) { 74 word_complete = false; 75 matches.Clear(); 76 ExecutionContext exe_ctx(interpreter.GetExecutionContext()); 77 Target *target = exe_ctx.GetTargetPtr(); 78 if (target) { 79 const size_t num_modules = target->GetImages().GetSize(); 80 if (num_modules > 0) { 81 UUID::ValueType uuid_bytes; 82 const size_t num_bytes_decoded = 83 UUID::DecodeUUIDBytesFromCString(s, uuid_bytes, nullptr); 84 for (size_t i = 0; i < num_modules; ++i) { 85 ModuleSP module_sp(target->GetImages().GetModuleAtIndex(i)); 86 if (module_sp) { 87 const UUID &module_uuid = module_sp->GetUUID(); 88 if (module_uuid.IsValid()) { 89 bool add_uuid = false; 90 if (num_bytes_decoded == 0) 91 add_uuid = true; 92 else 93 add_uuid = ::memcmp(module_uuid.GetBytes(), uuid_bytes, 94 num_bytes_decoded) == 0; 95 if (add_uuid) { 96 std::string uuid_str; 97 uuid_str = module_uuid.GetAsString(); 98 if (!uuid_str.empty()) 99 matches.AppendString(uuid_str.c_str()); 100 } 101 } 102 } 103 } 104 } 105 } 106 return matches.GetSize(); 107 } 108