//===- MsgHandler.cpp -----------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <mcld/LD/MsgHandler.h>
#include <mcld/LD/DiagnosticEngine.h>

using namespace mcld;

MsgHandler::MsgHandler(DiagnosticEngine& pEngine)
 : m_Engine(pEngine), m_NumArgs(0) {
}

MsgHandler::~MsgHandler()
{
  emit();
}

bool MsgHandler::emit()
{
  flushCounts();
  return m_Engine.emit();
}

void MsgHandler::addString(llvm::StringRef pStr) const
{
  assert(m_NumArgs < DiagnosticEngine::MaxArguments &&
         "Too many arguments to diagnostic!");
  m_Engine.state().ArgumentKinds[m_NumArgs] = DiagnosticEngine::ak_std_string;
  m_Engine.state().ArgumentStrs[m_NumArgs++] = pStr.data();
}

void MsgHandler::addString(const std::string& pStr) const
{
  assert(m_NumArgs < DiagnosticEngine::MaxArguments &&
         "Too many arguments to diagnostic!");
  m_Engine.state().ArgumentKinds[m_NumArgs] = DiagnosticEngine::ak_std_string;
  m_Engine.state().ArgumentStrs[m_NumArgs++] = pStr;
}

void MsgHandler::addTaggedVal(intptr_t pValue, DiagnosticEngine::ArgumentKind pKind) const
{
  assert(m_NumArgs < DiagnosticEngine::MaxArguments &&
         "Too many arguments to diagnostic!");
  m_Engine.state().ArgumentKinds[m_NumArgs] = pKind;
  m_Engine.state().ArgumentVals[m_NumArgs++] = pValue;
}

