]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - source/Interpreter/OptionValueUUID.cpp
Vendor import of lldb trunk r290819:
[FreeBSD/FreeBSD.git] / source / Interpreter / OptionValueUUID.cpp
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                                      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             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 }