Initial checkin of lldb code from internal Apple repo.


git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@105619 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Interpreter/StateVariable.cpp b/source/Interpreter/StateVariable.cpp
new file mode 100644
index 0000000..3f3c3fd
--- /dev/null
+++ b/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;
+}
+