173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//===-- OptionValueUUID.cpp ------------------------------------*- C++ -*-===//
273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//
373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//                     The LLVM Compiler Infrastructure
473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//
573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// This file is distributed under the University of Illinois Open Source
673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// License. See LICENSE.TXT for details.
773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//
873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton//===----------------------------------------------------------------------===//
973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h"
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea
1273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Interpreter/OptionValueUUID.h"
1373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
1473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// C Includes
1573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// C++ Includes
1673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// Other libraries and framework includes
1773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton// Project includes
18437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton#include "lldb/Core/Module.h"
1973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton#include "lldb/Core/Stream.h"
20437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton#include "lldb/Core/StringList.h"
21437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton#include "lldb/Interpreter/CommandInterpreter.h"
2273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
2373844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonusing namespace lldb;
2473844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonusing namespace lldb_private;
2573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
2673844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonvoid
2773844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValueUUID::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask)
2873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{
2973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    if (dump_mask & eDumpOptionType)
3073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        strm.Printf ("(%s)", GetTypeAsCString ());
3173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    if (dump_mask & eDumpOptionValue)
3273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    {
3373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        if (dump_mask & eDumpOptionType)
3473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            strm.PutCString (" = ");
3573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        m_uuid.Dump (&strm);
3673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    }
3773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}
3873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
3973844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonError
4073844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValueUUID::SetValueFromCString (const char *value_cstr,
4173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                                      VarSetOperationType op)
4273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{
4373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    Error error;
4473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    switch (op)
4573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    {
4673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        case eVarSetOperationClear:
4773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            Clear();
4873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            break;
4973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
5073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        case eVarSetOperationReplace:
5173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        case eVarSetOperationAssign:
5273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            {
53437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                if (m_uuid.SetFromCString(value_cstr) == 0)
5473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    error.SetErrorStringWithFormat ("invalid uuid string value '%s'", value_cstr);
5573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                else
5673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                    m_value_was_set = true;
5773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            }
5873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            break;
5973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
6073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        case eVarSetOperationInsertBefore:
6173844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        case eVarSetOperationInsertAfter:
6273844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        case eVarSetOperationRemove:
6373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        case eVarSetOperationAppend:
6473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton        case eVarSetOperationInvalid:
6573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            error = OptionValue::SetValueFromCString (value_cstr, op);
6673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton            break;
6773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    }
6873844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    return error;
6973844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}
7073844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton
7173844aa19a7360b662e2be710fc3c969d6c86606Greg Claytonlldb::OptionValueSP
7273844aa19a7360b662e2be710fc3c969d6c86606Greg ClaytonOptionValueUUID::DeepCopy () const
7373844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton{
7473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    return OptionValueSP(new OptionValueUUID(*this));
7573844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton}
76437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton
77437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Claytonsize_t
78437b5bccea45a5981edbbbeb4e23424aec4ce774Greg ClaytonOptionValueUUID::AutoComplete (CommandInterpreter &interpreter,
79437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                               const char *s,
80437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                               int match_start_point,
81437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                               int max_return_elements,
82437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                               bool &word_complete,
83437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                               StringList &matches)
84437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton{
85437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton    word_complete = false;
86437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton    matches.Clear();
87437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton    ExecutionContext exe_ctx(interpreter.GetExecutionContext());
88437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton    Target *target = exe_ctx.GetTargetPtr();
89437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton    if (target)
90437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton    {
91437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton        const size_t num_modules = target->GetImages().GetSize();
92437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton        if (num_modules > 0)
93437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton        {
94437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton            UUID::ValueType uuid_bytes;
95437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton            const size_t num_bytes_decoded = UUID::DecodeUUIDBytesFromCString(s, uuid_bytes, NULL);
96437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton            for (size_t i=0; i<num_modules; ++i)
97437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton            {
98437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                ModuleSP module_sp (target->GetImages().GetModuleAtIndex(i));
99437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                if (module_sp)
100437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                {
101437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                    const UUID &module_uuid = module_sp->GetUUID();
102437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                    if (module_uuid.IsValid())
103437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                    {
104437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                        bool add_uuid = false;
105437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                        if (num_bytes_decoded == 0)
106437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                            add_uuid = true;
107437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                        else
108437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                            add_uuid = ::memcmp(module_uuid.GetBytes(), uuid_bytes, num_bytes_decoded) == 0;
109437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                        if (add_uuid)
110437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                        {
11142b336cd509cad89be08f78775d3b1c8c7656a1bJason Molenda                            std::string uuid_str;
11242b336cd509cad89be08f78775d3b1c8c7656a1bJason Molenda                            uuid_str = module_uuid.GetAsString();
11342b336cd509cad89be08f78775d3b1c8c7656a1bJason Molenda                            if (!uuid_str.empty())
11442b336cd509cad89be08f78775d3b1c8c7656a1bJason Molenda                                matches.AppendString(uuid_str.c_str());
115437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                        }
116437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                    }
117437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton                }
118437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton            }
119437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton        }
120437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton    }
121437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton    return matches.GetSize();
122437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton}
123437b5bccea45a5981edbbbeb4e23424aec4ce774Greg Clayton
124