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