C++程序  |  63行  |  1.79 KB

//===- ScriptReader.cpp ---------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "mcld/Script/ScriptReader.h"

#include "mcld/MC/Input.h"
#include "mcld/Script/ScriptFile.h"
#include "mcld/Script/ScriptScanner.h"
#include "mcld/Support/MemoryArea.h"

#include <llvm/ADT/StringRef.h>

#include <istream>
#include <sstream>

namespace mcld {

ScriptReader::ScriptReader(ObjectReader& pObjectReader,
                           ArchiveReader& pArchiveReader,
                           DynObjReader& pDynObjReader,
                           GroupReader& pGroupReader)
    : m_ObjectReader(pObjectReader),
      m_ArchiveReader(pArchiveReader),
      m_DynObjReader(pDynObjReader),
      m_GroupReader(pGroupReader) {
}

ScriptReader::~ScriptReader() {
}

/// isMyFormat
bool ScriptReader::isMyFormat(Input& input, bool& doContinue) const {
  doContinue = true;
  // always return true now
  return true;
}

bool ScriptReader::readScript(const LinkerConfig& pConfig,
                              ScriptFile& pScriptFile) {
  Input& input = pScriptFile.input();
  size_t size = input.memArea()->size();
  llvm::StringRef region = input.memArea()->request(input.fileOffset(), size);
  std::stringbuf buf(region.data());

  std::istream in(&buf);
  ScriptScanner scanner(&in);
  ScriptParser parser(pConfig,
                      pScriptFile,
                      scanner,
                      m_ObjectReader,
                      m_ArchiveReader,
                      m_DynObjReader,
                      m_GroupReader);
  return parser.parse() == 0;
}

}  // namespace mcld