1f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===- ScriptReader.cpp ---------------------------------------------------===//
2f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//
3f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//                     The MCLinker Project
4f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//
5f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// This file is distributed under the University of Illinois Open Source
6f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// License. See LICENSE.TXT for details.
7f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//
8f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/ScriptReader.h"
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/MC/Input.h"
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/ScriptFile.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/ScriptScanner.h"
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MemoryArea.h"
15f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
16f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <llvm/ADT/StringRef.h>
17f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
18f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <istream>
19f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <sstream>
20f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
2137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
22f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
2337b74a387bb3993387029859c2d9d051c41c724eStephen HinesScriptReader::ScriptReader(ObjectReader& pObjectReader,
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                           ArchiveReader& pArchiveReader,
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                           DynObjReader& pDynObjReader,
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                           GroupReader& pGroupReader)
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    : m_ObjectReader(pObjectReader),
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_ArchiveReader(pArchiveReader),
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_DynObjReader(pDynObjReader),
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_GroupReader(pGroupReader) {
31f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
32f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
3337b74a387bb3993387029859c2d9d051c41c724eStephen HinesScriptReader::~ScriptReader() {
34f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
35f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
36f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/// isMyFormat
3737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ScriptReader::isMyFormat(Input& input, bool& doContinue) const {
38f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  doContinue = true;
39f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  // always return true now
40f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return true;
41f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
42f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
43f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesbool ScriptReader::readScript(const LinkerConfig& pConfig,
4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                              ScriptFile& pScriptFile) {
45f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  Input& input = pScriptFile.input();
46f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  size_t size = input.memArea()->size();
47f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  llvm::StringRef region = input.memArea()->request(input.fileOffset(), size);
48f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  std::stringbuf buf(region.data());
49f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
50f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  std::istream in(&buf);
51f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  ScriptScanner scanner(&in);
52f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  ScriptParser parser(pConfig,
53f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                      pScriptFile,
54f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                      scanner,
5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                      m_ObjectReader,
5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                      m_ArchiveReader,
5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                      m_DynObjReader,
58f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                      m_GroupReader);
5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  return parser.parse() == 0;
60f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
61f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
63