//===- 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"

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;
}

}  // namespace mcld