1//===- ScriptReader.cpp ---------------------------------------------------===//
2//
3//                     The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#include "mcld/Script/ScriptReader.h"
10
11#include "mcld/MC/Input.h"
12#include "mcld/Script/ScriptFile.h"
13#include "mcld/Script/ScriptScanner.h"
14#include "mcld/Support/MemoryArea.h"
15
16#include <llvm/ADT/StringRef.h>
17
18#include <istream>
19#include <sstream>
20
21namespace mcld {
22
23ScriptReader::ScriptReader(ObjectReader& pObjectReader,
24                           ArchiveReader& pArchiveReader,
25                           DynObjReader& pDynObjReader,
26                           GroupReader& pGroupReader)
27    : m_ObjectReader(pObjectReader),
28      m_ArchiveReader(pArchiveReader),
29      m_DynObjReader(pDynObjReader),
30      m_GroupReader(pGroupReader) {
31}
32
33ScriptReader::~ScriptReader() {
34}
35
36/// isMyFormat
37bool ScriptReader::isMyFormat(Input& input, bool& doContinue) const {
38  doContinue = true;
39  // always return true now
40  return true;
41}
42
43bool ScriptReader::readScript(const LinkerConfig& pConfig,
44                              ScriptFile& pScriptFile) {
45  Input& input = pScriptFile.input();
46  size_t size = input.memArea()->size();
47  llvm::StringRef region = input.memArea()->request(input.fileOffset(), size);
48  std::stringbuf buf(region.data());
49
50  std::istream in(&buf);
51  ScriptScanner scanner(&in);
52  ScriptParser parser(pConfig,
53                      pScriptFile,
54                      scanner,
55                      m_ObjectReader,
56                      m_ArchiveReader,
57                      m_DynObjReader,
58                      m_GroupReader);
59  return parser.parse() == 0;
60}
61
62}  // namespace mcld
63