Added the start of a new option value system that we can use for many things
around the debugger. The class isn't hooked into anything yet, but it will be
soon. 



git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@129843 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Interpreter/NamedOptionValue.cpp b/source/Interpreter/NamedOptionValue.cpp
new file mode 100644
index 0000000..e3b6357
--- /dev/null
+++ b/source/Interpreter/NamedOptionValue.cpp
@@ -0,0 +1,264 @@
+//===-- NamedOptionValue.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/NamedOptionValue.h"
+
+// C Includes
+// C++ Includes
+// Other libraries and framework includes
+// Project includes
+#include "lldb/Core/Stream.h"
+#include "lldb/Interpreter/Args.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+//-------------------------------------------------------------------------
+// NamedOptionValue
+//-------------------------------------------------------------------------
+
+void
+NamedOptionValue::GetQualifiedName (Stream &strm)
+{
+    if (m_parent)
+    {
+        m_parent->GetQualifiedName (strm);
+        strm.PutChar('.');
+    }
+    strm << m_name;
+}
+
+OptionValue::Type
+NamedOptionValue::GetValueType ()
+{
+    if (m_value_sp)
+        return m_value_sp->GetType();
+    return OptionValue::eTypeInvalid;
+}
+
+bool
+NamedOptionValue::DumpValue (Stream &strm)
+{
+    if (m_value_sp)
+    {
+        m_value_sp->DumpValue (strm);
+        return true;
+    }
+    return false;
+}
+
+bool
+NamedOptionValue::SetValueFromCString (const char *value_cstr)
+{
+    if (m_value_sp)
+        return m_value_sp->SetValueFromCString (value_cstr);
+    return false;
+}
+
+bool
+NamedOptionValue::ResetValueToDefault ()
+{
+    if (m_value_sp)
+        return m_value_sp->ResetValueToDefault ();
+    return false;
+}
+
+
+OptionValueBoolean *
+NamedOptionValue::GetBooleanValue ()
+{
+    if (GetValueType() == OptionValue::eTypeBoolean)
+        return static_cast<OptionValueBoolean *>(m_value_sp.get());
+    return NULL;
+}
+
+OptionValueSInt64 *
+NamedOptionValue::GetSInt64Value ()
+{
+    if (GetValueType() == OptionValue::eTypeSInt64)
+        return static_cast<OptionValueSInt64 *>(m_value_sp.get());
+    return NULL;
+}
+
+OptionValueUInt64 *
+NamedOptionValue::GetUInt64Value ()
+{
+    if (GetValueType() == OptionValue::eTypeUInt64)
+        return static_cast<OptionValueUInt64 *>(m_value_sp.get());
+    return NULL;
+}
+
+
+OptionValueFileSpec *
+NamedOptionValue::GetFileSpecValue ()
+{
+    if (GetValueType() == OptionValue::eTypeFileSpec)
+        return static_cast<OptionValueFileSpec *>(m_value_sp.get());
+    return NULL;
+}
+
+OptionValueArray *
+NamedOptionValue::GetArrayValue ()
+{
+    if (GetValueType() == OptionValue::eTypeArray)
+        return static_cast<OptionValueArray *>(m_value_sp.get());
+    return NULL;
+}
+
+OptionValueDictionary *
+NamedOptionValue::GetDictionaryValue ()
+{
+    if (GetValueType() == OptionValue::eTypeDictionary)
+        return static_cast<OptionValueDictionary *>(m_value_sp.get());
+    return NULL;
+}
+
+//-------------------------------------------------------------------------
+// OptionValueBoolean
+//-------------------------------------------------------------------------
+void
+OptionValueBoolean::DumpValue (Stream &strm)
+{
+    strm.PutCString (m_current_value ? "true" : "false");
+}
+
+bool
+OptionValueBoolean::SetValueFromCString (const char *value_cstr)
+{
+    bool success = false;
+    bool value = Args::StringToBoolean(value_cstr, false, &success);
+    if (success)
+    {
+        m_current_value = value;
+        return true;
+    }
+    return false;
+}
+
+//-------------------------------------------------------------------------
+// OptionValueSInt64
+//-------------------------------------------------------------------------
+void
+OptionValueSInt64::DumpValue (Stream &strm)
+{
+    strm.Printf ("%lli", m_current_value);
+}
+
+bool
+OptionValueSInt64::SetValueFromCString (const char *value_cstr)
+{
+    bool success = false;
+    int64_t value = Args::StringToSInt64 (value_cstr, 0, 0, &success);
+    if (success)
+    {
+        m_current_value = value;
+        return true;
+    }
+    return false;
+}
+
+//-------------------------------------------------------------------------
+// OptionValueUInt64
+//-------------------------------------------------------------------------
+void
+OptionValueUInt64::DumpValue (Stream &strm)
+{
+    strm.Printf ("0x%llx", m_current_value);
+}
+
+bool
+OptionValueUInt64::SetValueFromCString (const char *value_cstr)
+{
+    bool success = false;
+    uint64_t value = Args::StringToUInt64 (value_cstr, 0, 0, &success);
+    if (success)
+    {
+        m_current_value = value;
+        return true;
+    }
+    return false;
+}
+
+//-------------------------------------------------------------------------
+// OptionValueFileSpec
+//-------------------------------------------------------------------------
+void
+OptionValueFileSpec::DumpValue (Stream &strm)
+{
+    if (m_current_value)
+    {
+        if (m_current_value.GetDirectory())
+        {
+            strm << '"' << m_current_value.GetDirectory();
+            if (m_current_value.GetFilename())
+                strm << '/' << m_current_value.GetFilename();
+            strm << '"';
+        }
+        else
+        {
+            strm << '"' << m_current_value.GetFilename() << '"';
+        }
+    }
+}
+
+bool
+OptionValueFileSpec::SetValueFromCString (const char *value_cstr)
+{
+    if (value_cstr && value_cstr[0])
+        m_current_value.SetFile(value_cstr, false);
+    else
+        m_current_value.Clear();
+    return true;
+}
+
+
+//-------------------------------------------------------------------------
+// OptionValueArray
+//-------------------------------------------------------------------------
+void
+OptionValueArray::DumpValue (Stream &strm)
+{
+    const uint32_t size = m_values.size();
+    for (uint32_t i = 0; i<size; ++i)
+    {
+        strm.Printf("[%u] ", i);
+        m_values[i]->DumpValue (strm);
+    }
+}
+
+bool
+OptionValueArray::SetValueFromCString (const char *value_cstr)
+{
+    // We must be able to set this using the array specific functions
+    return false;
+}
+
+//-------------------------------------------------------------------------
+// OptionValueDictionary
+//-------------------------------------------------------------------------
+void
+OptionValueDictionary::DumpValue (Stream &strm)
+{
+    collection::iterator pos, end = m_values.end();
+
+    for (pos = m_values.begin(); pos != end; ++pos)
+    {
+        strm.Printf("%s=", pos->first.GetCString());
+        pos->second->DumpValue (strm);
+    }
+}
+
+bool
+OptionValueDictionary::SetValueFromCString (const char *value_cstr)
+{
+    // We must be able to set this using the array specific functions
+    return false;
+}
+
+