//===-- OptionValue.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/OptionValue.h"

// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/Core/StringList.h"
#include "lldb/Interpreter/OptionValues.h"

using namespace lldb;
using namespace lldb_private;


//-------------------------------------------------------------------------
// Get this value as a uint64_t value if it is encoded as a boolean,
// uint64_t or int64_t. Other types will cause "fail_value" to be 
// returned
//-------------------------------------------------------------------------
uint64_t
OptionValue::GetUInt64Value (uint64_t fail_value, bool *success_ptr)
{
    if (success_ptr)
        *success_ptr = true;
    switch (GetType())
    {
    case OptionValue::eTypeBoolean: return static_cast<OptionValueBoolean *>(this)->GetCurrentValue();
    case OptionValue::eTypeSInt64:  return static_cast<OptionValueSInt64 *>(this)->GetCurrentValue();
    case OptionValue::eTypeUInt64:  return static_cast<OptionValueUInt64 *>(this)->GetCurrentValue();
    default: 
        break;
    }
    if (success_ptr)
        *success_ptr = false;
    return fail_value;
}

Error
OptionValue::SetSubValue (const ExecutionContext *exe_ctx,
                          VarSetOperationType op,
                          const char *name,
                          const char *value)
{
    Error error;
    error.SetErrorStringWithFormat("SetSubValue is not supported");
    return error;
}


OptionValueBoolean *
OptionValue::GetAsBoolean ()
{
    if (GetType () == OptionValue::eTypeBoolean)
        return static_cast<OptionValueBoolean *>(this);
    return NULL;
}

const OptionValueBoolean *
OptionValue::GetAsBoolean () const
{
    if (GetType () == OptionValue::eTypeBoolean)
        return static_cast<const OptionValueBoolean *>(this);
    return NULL;
}


OptionValueFileSpec *
OptionValue::GetAsFileSpec ()
{
    if (GetType () == OptionValue::eTypeFileSpec)
        return static_cast<OptionValueFileSpec *>(this);
    return NULL;
    
}

const OptionValueFileSpec *
OptionValue::GetAsFileSpec () const
{
    if (GetType () == OptionValue::eTypeFileSpec)
        return static_cast<const OptionValueFileSpec *>(this);
    return NULL;
    
}

OptionValueFileSpecList *
OptionValue::GetAsFileSpecList ()
{
    if (GetType () == OptionValue::eTypeFileSpecList)
        return static_cast<OptionValueFileSpecList *>(this);
    return NULL;
    
}

const OptionValueFileSpecList *
OptionValue::GetAsFileSpecList () const
{
    if (GetType () == OptionValue::eTypeFileSpecList)
        return static_cast<const OptionValueFileSpecList *>(this);
    return NULL;
    
}

OptionValueArch *
OptionValue::GetAsArch ()
{
    if (GetType () == OptionValue::eTypeArch)
        return static_cast<OptionValueArch *>(this);
    return NULL;
}


const OptionValueArch *
OptionValue::GetAsArch () const
{
    if (GetType () == OptionValue::eTypeArch)
        return static_cast<const OptionValueArch *>(this);
    return NULL;
}

OptionValueArray *
OptionValue::GetAsArray ()
{
    if (GetType () == OptionValue::eTypeArray)
        return static_cast<OptionValueArray *>(this);
    return NULL;
}


const OptionValueArray *
OptionValue::GetAsArray () const
{
    if (GetType () == OptionValue::eTypeArray)
        return static_cast<const OptionValueArray *>(this);
    return NULL;
}

OptionValueArgs *
OptionValue::GetAsArgs ()
{
    if (GetType () == OptionValue::eTypeArgs)
        return static_cast<OptionValueArgs *>(this);
    return NULL;
}


const OptionValueArgs *
OptionValue::GetAsArgs () const
{
    if (GetType () == OptionValue::eTypeArgs)
        return static_cast<const OptionValueArgs *>(this);
    return NULL;
}

OptionValueDictionary *
OptionValue::GetAsDictionary ()
{
    if (GetType () == OptionValue::eTypeDictionary)
        return static_cast<OptionValueDictionary *>(this);
    return NULL;
}

const OptionValueDictionary *
OptionValue::GetAsDictionary () const
{
    if (GetType () == OptionValue::eTypeDictionary)
        return static_cast<const OptionValueDictionary *>(this);
    return NULL;
}

OptionValueEnumeration *
OptionValue::GetAsEnumeration ()
{
    if (GetType () == OptionValue::eTypeEnum)
        return static_cast<OptionValueEnumeration *>(this);
    return NULL;
}

const OptionValueEnumeration *
OptionValue::GetAsEnumeration () const
{
    if (GetType () == OptionValue::eTypeEnum)
        return static_cast<const OptionValueEnumeration *>(this);
    return NULL;
}

OptionValueFormat *
OptionValue::GetAsFormat ()
{
    if (GetType () == OptionValue::eTypeFormat)
        return static_cast<OptionValueFormat *>(this);
    return NULL;
}

const OptionValueFormat *
OptionValue::GetAsFormat () const
{
    if (GetType () == OptionValue::eTypeFormat)
        return static_cast<const OptionValueFormat *>(this);
    return NULL;
}

OptionValuePathMappings *
OptionValue::GetAsPathMappings ()
{
    if (GetType () == OptionValue::eTypePathMap)
        return static_cast<OptionValuePathMappings *>(this);
    return NULL;
}

const OptionValuePathMappings *
OptionValue::GetAsPathMappings () const
{
    if (GetType () == OptionValue::eTypePathMap)
        return static_cast<const OptionValuePathMappings *>(this);
    return NULL;
}

OptionValueProperties *
OptionValue::GetAsProperties ()
{
    if (GetType () == OptionValue::eTypeProperties)
        return static_cast<OptionValueProperties *>(this);
    return NULL;
}

const OptionValueProperties *
OptionValue::GetAsProperties () const
{
    if (GetType () == OptionValue::eTypeProperties)
        return static_cast<const OptionValueProperties *>(this);
    return NULL;
}

OptionValueRegex *
OptionValue::GetAsRegex ()
{
    if (GetType () == OptionValue::eTypeRegex)
        return static_cast<OptionValueRegex *>(this);
    return NULL;
}

const OptionValueRegex *
OptionValue::GetAsRegex () const
{
    if (GetType () == OptionValue::eTypeRegex)
        return static_cast<const OptionValueRegex *>(this);
    return NULL;
}

OptionValueSInt64 *
OptionValue::GetAsSInt64 ()
{
    if (GetType () == OptionValue::eTypeSInt64)
        return static_cast<OptionValueSInt64 *>(this);
    return NULL;
}

const OptionValueSInt64 *
OptionValue::GetAsSInt64 () const
{
    if (GetType () == OptionValue::eTypeSInt64)
        return static_cast<const OptionValueSInt64 *>(this);
    return NULL;
}

OptionValueString *
OptionValue::GetAsString ()
{
    if (GetType () == OptionValue::eTypeString)
        return static_cast<OptionValueString *>(this);
    return NULL;
}

const OptionValueString *
OptionValue::GetAsString () const
{
    if (GetType () == OptionValue::eTypeString)
        return static_cast<const OptionValueString *>(this);
    return NULL;
}

OptionValueUInt64 *
OptionValue::GetAsUInt64 ()
{
    if (GetType () == OptionValue::eTypeUInt64)
        return static_cast<OptionValueUInt64 *>(this);
    return NULL;
}

const OptionValueUInt64 *
OptionValue::GetAsUInt64 () const
{
    if (GetType () == OptionValue::eTypeUInt64)
        return static_cast<const OptionValueUInt64 *>(this);
    return NULL;
}

OptionValueUUID *
OptionValue::GetAsUUID ()
{
    if (GetType () == OptionValue::eTypeUUID)
        return static_cast<OptionValueUUID *>(this);
    return NULL;
    
}

const OptionValueUUID *
OptionValue::GetAsUUID () const
{
    if (GetType () == OptionValue::eTypeUUID)
        return static_cast<const OptionValueUUID *>(this);
    return NULL;
    
}

bool
OptionValue::GetBooleanValue (bool fail_value) const
{
    const OptionValueBoolean *option_value = GetAsBoolean ();
    if (option_value)
        return option_value->GetCurrentValue();
    return fail_value;
}

bool
OptionValue::SetBooleanValue (bool new_value)
{
    OptionValueBoolean *option_value = GetAsBoolean ();
    if (option_value)
    {
        option_value->SetCurrentValue(new_value);
        return true;
    }
    return false;
}

int64_t
OptionValue::GetEnumerationValue (int64_t fail_value) const
{
    const OptionValueEnumeration *option_value = GetAsEnumeration();
    if (option_value)
        return option_value->GetCurrentValue();
    return fail_value;
}

bool
OptionValue::SetEnumerationValue (int64_t value)
{
    OptionValueEnumeration *option_value = GetAsEnumeration();
    if (option_value)
    {
        option_value->SetCurrentValue(value);
        return true;
    }
    return false;
}

FileSpec
OptionValue::GetFileSpecValue () const
{
    const OptionValueFileSpec *option_value = GetAsFileSpec ();
    if (option_value)
        return option_value->GetCurrentValue();
    return FileSpec();
}


bool
OptionValue::SetFileSpecValue (const FileSpec &file_spec)
{
    OptionValueFileSpec *option_value = GetAsFileSpec ();
    if (option_value)
    {
        option_value->SetCurrentValue(file_spec, false);
        return true;
    }
    return false;
}

FileSpecList
OptionValue::GetFileSpecListValue () const
{
    const OptionValueFileSpecList *option_value = GetAsFileSpecList ();
    if (option_value)
        return option_value->GetCurrentValue();
    return FileSpecList();
}


lldb::Format
OptionValue::GetFormatValue (lldb::Format fail_value) const
{
    const OptionValueFormat *option_value = GetAsFormat ();
    if (option_value)
        return option_value->GetCurrentValue();
    return fail_value;
}

bool
OptionValue::SetFormatValue (lldb::Format new_value)
{
    OptionValueFormat *option_value = GetAsFormat ();
    if (option_value)
    {
        option_value->SetCurrentValue(new_value);
        return true;
    }
    return false;
}

const RegularExpression *
OptionValue::GetRegexValue () const
{
    const OptionValueRegex *option_value = GetAsRegex ();
    if (option_value)
        return option_value->GetCurrentValue();
    return NULL;
}


int64_t
OptionValue::GetSInt64Value (int64_t fail_value) const
{
    const OptionValueSInt64 *option_value = GetAsSInt64 ();
    if (option_value)
        return option_value->GetCurrentValue();
    return fail_value;
}

bool
OptionValue::SetSInt64Value (int64_t new_value)
{
    OptionValueSInt64 *option_value = GetAsSInt64 ();
    if (option_value)
    {
        option_value->SetCurrentValue(new_value);
        return true;
    }
    return false;
}

const char *
OptionValue::GetStringValue (const char *fail_value) const
{
    const OptionValueString *option_value = GetAsString ();
    if (option_value)
        return option_value->GetCurrentValue();
    return fail_value;
}

bool
OptionValue::SetStringValue (const char *new_value)
{
    OptionValueString *option_value = GetAsString ();
    if (option_value)
    {
        option_value->SetCurrentValue(new_value);
        return true;
    }
    return false;
}

uint64_t
OptionValue::GetUInt64Value (uint64_t fail_value) const
{
    const OptionValueUInt64 *option_value = GetAsUInt64 ();
    if (option_value)
        return option_value->GetCurrentValue();
    return fail_value;
}

bool
OptionValue::SetUInt64Value (uint64_t new_value)
{
    OptionValueUInt64 *option_value = GetAsUInt64 ();
    if (option_value)
    {
        option_value->SetCurrentValue(new_value);
        return true;
    }
    return false;
}

UUID
OptionValue::GetUUIDValue () const
{
    const OptionValueUUID *option_value = GetAsUUID();
    if (option_value)
        return option_value->GetCurrentValue();
    return UUID();
}

bool
OptionValue::SetUUIDValue (const UUID &uuid)
{
    OptionValueUUID *option_value = GetAsUUID();
    if (option_value)
    {
        option_value->SetCurrentValue(uuid);
        return true;
    }
    return false;
}

const char *
OptionValue::GetBuiltinTypeAsCString (Type t)
{
    switch (t)
    {
        case eTypeInvalid:      return "invalid";
        case eTypeArch:         return "arch";
        case eTypeArgs:         return "arguments";
        case eTypeArray:        return "array";
        case eTypeBoolean:      return "boolean";
        case eTypeDictionary:   return "dictionary";
        case eTypeEnum:         return "enum";
        case eTypeFileSpec:     return "file";
        case eTypeFileSpecList: return "file-list";
        case eTypeFormat:       return "format";
        case eTypePathMap:      return "path-map";
        case eTypeProperties:   return "properties";
        case eTypeRegex:        return "regex";
        case eTypeSInt64:       return "int";
        case eTypeString:       return "string";
        case eTypeUInt64:       return "unsigned";
        case eTypeUUID:         return "uuid";
    }
    return NULL;
}


lldb::OptionValueSP
OptionValue::CreateValueFromCStringForTypeMask (const char *value_cstr, uint32_t type_mask, Error &error)
{
    // If only 1 bit is set in the type mask for a dictionary or array
    // then we know how to decode a value from a cstring
    lldb::OptionValueSP value_sp;
    switch (type_mask)
    {
    case 1u << eTypeArch:       value_sp.reset(new OptionValueArch()); break;
    case 1u << eTypeBoolean:    value_sp.reset(new OptionValueBoolean(false)); break;
    case 1u << eTypeFileSpec:   value_sp.reset(new OptionValueFileSpec()); break;
    case 1u << eTypeFormat:     value_sp.reset(new OptionValueFormat(eFormatInvalid));    break;
    case 1u << eTypeSInt64:     value_sp.reset(new OptionValueSInt64()); break;
    case 1u << eTypeString:     value_sp.reset(new OptionValueString()); break;
    case 1u << eTypeUInt64:     value_sp.reset(new OptionValueUInt64()); break;
    case 1u << eTypeUUID:       value_sp.reset(new OptionValueUUID()); break;
    }

    if (value_sp)
        error = value_sp->SetValueFromCString (value_cstr, eVarSetOperationAssign);
    else
        error.SetErrorString("unsupported type mask");
    return value_sp;
}

bool
OptionValue::DumpQualifiedName (Stream &strm) const
{
    bool dumped_something = false;
    lldb::OptionValueSP m_parent_sp(m_parent_wp.lock());
    if (m_parent_sp)
    {
        if (m_parent_sp->DumpQualifiedName(strm))
            dumped_something = true;
    }
    ConstString name (GetName());
    if (name)
    {
        if (dumped_something)
            strm.PutChar('.');
        else
            dumped_something = true;
        strm << name;
    }
    return dumped_something;
}

size_t
OptionValue::AutoComplete (CommandInterpreter &interpreter,
                           const char *s,
                           int match_start_point,
                           int max_return_elements,
                           bool &word_complete,
                           StringList &matches)
{
    word_complete = false;
    matches.Clear();
    return matches.GetSize();
}

Error
OptionValue::SetValueFromCString (const char *value, VarSetOperationType op)
{
    Error error;
    switch (op)
    {
    case eVarSetOperationReplace:
        error.SetErrorStringWithFormat ("%s objects do not support the 'replace' operation", GetTypeAsCString());
        break;
    case eVarSetOperationInsertBefore:
        error.SetErrorStringWithFormat ("%s objects do not support the 'insert-before' operation", GetTypeAsCString());
        break;
    case eVarSetOperationInsertAfter:
        error.SetErrorStringWithFormat ("%s objects do not support the 'insert-after' operation", GetTypeAsCString());
        break;
    case eVarSetOperationRemove:
        error.SetErrorStringWithFormat ("%s objects do not support the 'remove' operation", GetTypeAsCString());
        break;
    case eVarSetOperationAppend:
        error.SetErrorStringWithFormat ("%s objects do not support the 'append' operation", GetTypeAsCString());
        break;
    case eVarSetOperationClear:
        error.SetErrorStringWithFormat ("%s objects do not support the 'clear' operation", GetTypeAsCString());
        break;
    case eVarSetOperationAssign:
        error.SetErrorStringWithFormat ("%s objects do not support the 'assign' operation", GetTypeAsCString());
        break;
    case eVarSetOperationInvalid:
        error.SetErrorStringWithFormat ("invalid operation performed on a %s object", GetTypeAsCString());
        break;
    }
    return error;
}

