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
DumpValue(const ExecutionContext * exe_ctx,Stream & strm,uint32_t dump_mask)25 OptionValueUUID::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 & eDumpOptionValue)
30 {
31 if (dump_mask & eDumpOptionType)
32 strm.PutCString (" = ");
33 m_uuid.Dump (&strm);
34 }
35 }
36
37 Error
SetValueFromString(llvm::StringRef value,VarSetOperationType op)38 OptionValueUUID::SetValueFromString (llvm::StringRef value,
39 VarSetOperationType op)
40 {
41 Error error;
42 switch (op)
43 {
44 case eVarSetOperationClear:
45 Clear();
46 NotifyValueChanged();
47 break;
48
49 case eVarSetOperationReplace:
50 case eVarSetOperationAssign:
51 {
52 if (m_uuid.SetFromCString(value.str().c_str()) == 0)
53 error.SetErrorStringWithFormat ("invalid uuid string value '%s'", value.str().c_str());
54 else
55 {
56 m_value_was_set = true;
57 NotifyValueChanged();
58 }
59 }
60 break;
61
62 case eVarSetOperationInsertBefore:
63 case eVarSetOperationInsertAfter:
64 case eVarSetOperationRemove:
65 case eVarSetOperationAppend:
66 case eVarSetOperationInvalid:
67 error = OptionValue::SetValueFromString (value, op);
68 break;
69 }
70 return error;
71 }
72
73 lldb::OptionValueSP
DeepCopy() const74 OptionValueUUID::DeepCopy () const
75 {
76 return OptionValueSP(new OptionValueUUID(*this));
77 }
78
79 size_t
AutoComplete(CommandInterpreter & interpreter,const char * s,int match_start_point,int max_return_elements,bool & word_complete,StringList & matches)80 OptionValueUUID::AutoComplete (CommandInterpreter &interpreter,
81 const char *s,
82 int match_start_point,
83 int max_return_elements,
84 bool &word_complete,
85 StringList &matches)
86 {
87 word_complete = false;
88 matches.Clear();
89 ExecutionContext exe_ctx(interpreter.GetExecutionContext());
90 Target *target = exe_ctx.GetTargetPtr();
91 if (target)
92 {
93 const size_t num_modules = target->GetImages().GetSize();
94 if (num_modules > 0)
95 {
96 UUID::ValueType uuid_bytes;
97 const size_t num_bytes_decoded = UUID::DecodeUUIDBytesFromCString(s, uuid_bytes, nullptr);
98 for (size_t i=0; i<num_modules; ++i)
99 {
100 ModuleSP module_sp (target->GetImages().GetModuleAtIndex(i));
101 if (module_sp)
102 {
103 const UUID &module_uuid = module_sp->GetUUID();
104 if (module_uuid.IsValid())
105 {
106 bool add_uuid = false;
107 if (num_bytes_decoded == 0)
108 add_uuid = true;
109 else
110 add_uuid = ::memcmp(module_uuid.GetBytes(), uuid_bytes, num_bytes_decoded) == 0;
111 if (add_uuid)
112 {
113 std::string uuid_str;
114 uuid_str = module_uuid.GetAsString();
115 if (!uuid_str.empty())
116 matches.AppendString(uuid_str.c_str());
117 }
118 }
119 }
120 }
121 }
122 }
123 return matches.GetSize();
124 }
125
126