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