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

// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/Core/Stream.h"
#include "lldb/Core/StringList.h"
#include "lldb/Interpreter/Args.h"
#include "llvm/ADT/STLExtras.h"

using namespace lldb;
using namespace lldb_private;

void
OptionValueChar::DumpValue (const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask)
{
    if (dump_mask & eDumpOptionType)
        strm.Printf ("(%s)", GetTypeAsCString ());

    if (dump_mask & eDumpOptionValue)
    {
        if (dump_mask & eDumpOptionType)
            strm.PutCString (" = ");
        if (m_current_value != '\0')
            strm.PutChar(m_current_value);
        else
            strm.PutCString("(null)");
    }
}

Error
OptionValueChar::SetValueFromCString (const char *value_cstr,
                                      VarSetOperationType op)
{
    Error error;
    switch (op)
    {
    case eVarSetOperationClear:
        Clear();
        break;

    case eVarSetOperationReplace:
    case eVarSetOperationAssign:
        {
            bool success = false;
            char char_value = Args::StringToChar(value_cstr, '\0', &success);
            if (success)
            {
                m_current_value = char_value;
                m_value_was_set = true;
            }
            else
                error.SetErrorStringWithFormat("'%s' cannot be longer than 1 character", value_cstr);
        }
        break;

    default:
        error = OptionValue::SetValueFromCString (value_cstr, op);
        break;
    }
    return error;
}

lldb::OptionValueSP
OptionValueChar::DeepCopy () const
{
    return OptionValueSP(new OptionValueChar(*this));
}


