diff options
Diffstat (limited to 'lldb/source/Interpreter/StateVariable.cpp')
-rw-r--r-- | lldb/source/Interpreter/StateVariable.cpp | 320 |
1 files changed, 320 insertions, 0 deletions
diff --git a/lldb/source/Interpreter/StateVariable.cpp b/lldb/source/Interpreter/StateVariable.cpp new file mode 100644 index 00000000000..3f3c3fdb1e0 --- /dev/null +++ b/lldb/source/Interpreter/StateVariable.cpp @@ -0,0 +1,320 @@ +//===-- StateVariable.cpp ---------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Interpreter/CommandReturnObject.h" +#include "lldb/Interpreter/CommandInterpreter.h" + + +#include "lldb/Interpreter/StateVariable.h" + +using namespace lldb; +using namespace lldb_private; + +// Variables with integer values. + +StateVariable::StateVariable +( + const char *name, + int value, + const char *help, + Callback func_ptr +) : + m_name (name), + m_type (eTypeInteger), + m_help_text (help), + m_verification_func_ptr (func_ptr) +{ + m_int_value = value; +} + +// Variables with boolean values. + +StateVariable::StateVariable +( + const char *name, + bool value, + const char *help, + Callback func_ptr + ) : + m_name (name), + m_type (eTypeBoolean), + m_help_text (help), + m_verification_func_ptr (func_ptr) +{ + m_int_value = value; +} + +// Variables with string values. + +StateVariable::StateVariable +( + const char *name, + const char *value, + bool can_append, + const char *help, + Callback func_ptr + ) : + m_name (name), + m_type (eTypeString), + m_int_value (0), + m_string_values (), + m_help_text (help), + m_verification_func_ptr (func_ptr) +{ + m_string_values.AppendArgument(value); +} + +// Variables with array of strings values. + +StateVariable::StateVariable +( + const char *name, + const Args *args, + const char *help, + Callback func_ptr + ) : + m_name (name), + m_type (eTypeStringArray), + m_help_text (help), + m_string_values(), + m_verification_func_ptr (func_ptr) +{ + if (args) + m_string_values = *args; +} + +StateVariable::~StateVariable () +{ +} + +const char * +StateVariable::GetName () const +{ + return m_name.c_str(); +} + +StateVariable::Type +StateVariable::GetType () const +{ + return m_type; +} + +int +StateVariable::GetIntValue () const +{ + return m_int_value; +} + +bool +StateVariable::GetBoolValue () const +{ + return m_int_value; +} + +const char * +StateVariable::GetStringValue () const +{ + return m_string_values.GetArgumentAtIndex(0); +} + +const Args & +StateVariable::GetArgs () const +{ + return m_string_values; +} + +Args & +StateVariable::GetArgs () +{ + return m_string_values; +} + +const char * +StateVariable::GetHelp () const +{ + return m_help_text.c_str(); +} + +void +StateVariable::SetHelp (const char *help) +{ + m_help_text = help; +} + +void +StateVariable::AppendVariableInformation (CommandReturnObject &result) +{ + switch (m_type) + { + case eTypeBoolean: + if (m_int_value) + result.AppendMessageWithFormat (" %s (bool) = True\n", m_name.c_str()); + else + result.AppendMessageWithFormat (" %s (bool) = False\n", m_name.c_str()); + break; + + case eTypeInteger: + result.AppendMessageWithFormat (" %s (int) = %d\n", m_name.c_str(), m_int_value); + break; + + case eTypeString: + { + const char *cstr = m_string_values.GetArgumentAtIndex(0); + if (cstr && cstr[0]) + result.AppendMessageWithFormat (" %s (str) = '%s'\n", m_name.c_str(), cstr); + else + result.AppendMessageWithFormat (" %s (str) = <no value>\n", m_name.c_str()); + } + break; + + case eTypeStringArray: + { + const size_t argc = m_string_values.GetArgumentCount(); + result.AppendMessageWithFormat (" %s (string vector):\n", m_name.c_str()); + for (size_t i = 0; i < argc; ++i) + result.AppendMessageWithFormat (" [%d] %s\n", i, m_string_values.GetArgumentAtIndex(i)); + } + break; + + default: + break; + } +} + +void +StateVariable::SetStringValue (const char *new_value) +{ + if (m_string_values.GetArgumentCount() > 0) + m_string_values.ReplaceArgumentAtIndex(0, new_value); + else + m_string_values.AppendArgument(new_value); +} + +void +StateVariable::SetIntValue (int new_value) +{ + m_int_value = new_value; +} + +void +StateVariable::SetBoolValue (bool new_value) +{ + m_int_value = new_value; +} + +void +StateVariable::AppendStringValue (const char *cstr) +{ + if (cstr && cstr[0]) + { + if (m_string_values.GetArgumentCount() == 0) + { + m_string_values.AppendArgument(cstr); + } + else + { + const char *curr_arg = m_string_values.GetArgumentAtIndex(0); + if (curr_arg != NULL) + { + std::string new_arg_str(curr_arg); + new_arg_str += " "; + new_arg_str += cstr; + m_string_values.ReplaceArgumentAtIndex(0, new_arg_str.c_str()); + } + else + { + m_string_values.ReplaceArgumentAtIndex(0, cstr); + } + } + } +} + +bool +StateVariable::VerifyValue (CommandInterpreter *interpreter, void *data, CommandReturnObject &result) +{ + return (*m_verification_func_ptr) (interpreter, data, result); +} + +//void +//StateVariable::SetArrayValue (STLStringArray &new_value) +//{ +// m_string_values.AppendArgument.append(cstr); +// +// if (m_array_value != NULL) +// { +// if (m_array_value->size() > 0) +// { +// m_array_value->clear(); +// } +// } +// else +// m_array_value = new STLStringArray; +// +// for (int i = 0; i < new_value.size(); ++i) +// m_array_value->push_back (new_value[i]); +//} +// + +void +StateVariable::ArrayClearValues () +{ + m_string_values.Clear(); +} + + +void +StateVariable::ArrayAppendValue (const char *cstr) +{ + m_string_values.AppendArgument(cstr); +} + + +bool +StateVariable::HasVerifyFunction () +{ + return (m_verification_func_ptr != NULL); +} + +// Verification functions for various command interpreter variables. + +bool +StateVariable::VerifyScriptLanguage (CommandInterpreter *interpreter, void *data, CommandReturnObject &result) +{ + bool valid_lang = true; + interpreter->SetScriptLanguage (Args::StringToScriptLanguage((char *) data, eScriptLanguageDefault, &valid_lang)); + return valid_lang; +} + +bool +StateVariable::BroadcastPromptChange (CommandInterpreter *interpreter, void *data, CommandReturnObject &result) +{ + char *prompt = (char *) data; + if (prompt != NULL) + { + std::string tmp_prompt = prompt ; + int len = tmp_prompt.size(); + if (len > 1 + && (tmp_prompt[0] == '\'' || tmp_prompt[0] == '"') + && (tmp_prompt[len-1] == tmp_prompt[0])) + { + tmp_prompt = tmp_prompt.substr(1,len-2); + } + len = tmp_prompt.size(); + if (tmp_prompt[len-1] != ' ') + tmp_prompt.append(" "); + strcpy (prompt, tmp_prompt.c_str()); + data = (void *) prompt; + } + EventSP new_event_sp; + new_event_sp.reset (new Event(CommandInterpreter::eBroadcastBitResetPrompt, new EventDataBytes (prompt))); + interpreter->BroadcastEvent (new_event_sp); + + return true; +} + |