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/Interpreter/CommandInterpreter.h" 18 #include "lldb/Utility/Stream.h" 19 #include "lldb/Utility/StringList.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 Status OptionValueUUID::SetValueFromString(llvm::StringRef value, 36 VarSetOperationType op) { 37 Status error; 38 switch (op) { 39 case eVarSetOperationClear: 40 Clear(); 41 NotifyValueChanged(); 42 break; 43 44 case eVarSetOperationReplace: 45 case eVarSetOperationAssign: { 46 if (m_uuid.SetFromStringRef(value) == 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 llvm::StringRef 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 uint32_t num_bytes_decoded = 0; 83 UUID::DecodeUUIDBytesFromString(s, uuid_bytes, num_bytes_decoded); 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 llvm::ArrayRef<uint8_t> decoded_bytes(uuid_bytes, 90 num_bytes_decoded); 91 llvm::ArrayRef<uint8_t> module_bytes = module_uuid.GetBytes(); 92 if (module_bytes.size() >= num_bytes_decoded && 93 module_bytes.take_front(num_bytes_decoded) == decoded_bytes) { 94 matches.AppendString(module_uuid.GetAsString()); 95 } 96 } 97 } 98 } 99 } 100 } 101 return matches.GetSize(); 102 } 103