//===-- MICmnMIValueConst.cpp -----------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

// In-house headers:
#include "MICmnMIValueConst.h"

// Instantiations:
const CMIUtilString CMICmnMIValueConst::ms_constStrDblQuote("\"");

//++ ------------------------------------------------------------------------------------
// Details: CMICmnMIValueConst constructor.
// Type:    Method.
// Args:    vString - (R) MI Const c-string value.
// Return:  None.
// Throws:  None.
//--
CMICmnMIValueConst::CMICmnMIValueConst(const CMIUtilString &vString)
    : m_strPartConst(vString)
    , m_bNoQuotes(false)
{
    BuildConst();
}

//++ ------------------------------------------------------------------------------------
// Details: CMICmnMIValueConst constructor.
// Type:    Method.
// Args:    vString     - (R) MI Const c-string value.
//          vbNoQuotes  - (R) True = return string not surrounded with quotes, false = use quotes.
// Return:  None.
// Throws:  None.
//--
CMICmnMIValueConst::CMICmnMIValueConst(const CMIUtilString &vString, const bool vbNoQuotes)
    : m_strPartConst(vString)
    , m_bNoQuotes(vbNoQuotes)
{
    BuildConst();
}

//++ ------------------------------------------------------------------------------------
// Details: CMICmnMIValueConst destructor.
// Type:    Overrideable.
// Args:    None.
// Return:  None.
// Throws:  None.
//--
CMICmnMIValueConst::~CMICmnMIValueConst()
{
}

//++ ------------------------------------------------------------------------------------
// Details: Build the Value Const data.
// Type:    Method.
// Args:    None.
// Return:  MIstatus::success - Functional succeeded.
//          MIstatus::failure - Functional failed.
// Throws:  None.
//--
bool
CMICmnMIValueConst::BuildConst()
{
    if (m_strPartConst.length() != 0)
    {
        const CMIUtilString strValue(m_strPartConst.StripCREndOfLine());
        if (m_bNoQuotes)
        {
            m_strValue = strValue;
        }
        else
        {
            const char *pFormat = "%s%s%s";
            m_strValue = CMIUtilString::Format(pFormat, ms_constStrDblQuote.c_str(), strValue.c_str(), ms_constStrDblQuote.c_str());
        }
    }
    else
    {
        const char *pFormat = "%s%s";
        m_strValue = CMIUtilString::Format(pFormat, ms_constStrDblQuote.c_str(), ms_constStrDblQuote.c_str());
    }

    return MIstatus::success;
}
