mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-04-20 00:02:55 +00:00
Add ParserMultiInputStream
This commit is contained in:
parent
d5a8d038a6
commit
dcffa3d14d
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include "LocalizeFileParser.h"
|
#include "LocalizeFileParser.h"
|
||||||
#include "Parsing/Impl/CommentRemovingStreamProxy.h"
|
#include "Parsing/Impl/CommentRemovingStreamProxy.h"
|
||||||
#include "Parsing/Impl/ParserInputStream.h"
|
#include "Parsing/Impl/ParserSingleInputStream.h"
|
||||||
|
|
||||||
LocalizeFileReader::LocalizeFileReader(std::istream& stream, std::string fileName, GameLanguage language)
|
LocalizeFileReader::LocalizeFileReader(std::istream& stream, std::string fileName, GameLanguage language)
|
||||||
: m_file_name(std::move(fileName)),
|
: m_file_name(std::move(fileName)),
|
||||||
@ -16,7 +16,7 @@ LocalizeFileReader::LocalizeFileReader(std::istream& stream, std::string fileNam
|
|||||||
|
|
||||||
bool LocalizeFileReader::OpenBaseStream(std::istream& stream)
|
bool LocalizeFileReader::OpenBaseStream(std::istream& stream)
|
||||||
{
|
{
|
||||||
m_open_streams.emplace_back(std::make_unique<ParserInputStream>(stream, m_file_name));
|
m_open_streams.emplace_back(std::make_unique<ParserSingleInputStream>(stream, m_file_name));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
#include "Parsing/Impl/ParserInputStream.h"
|
#include "Parsing/Impl/ParserSingleInputStream.h"
|
||||||
#include "Parsing/Simple/SimpleLexer.h"
|
#include "Parsing/Simple/SimpleLexer.h"
|
||||||
|
|
||||||
AbstractMenuDumper::AbstractMenuDumper(std::ostream& stream)
|
AbstractMenuDumper::AbstractMenuDumper(std::ostream& stream)
|
||||||
@ -65,7 +65,7 @@ std::vector<std::string> AbstractMenuDumper::CreateScriptTokenList(const char* s
|
|||||||
{
|
{
|
||||||
const std::string scriptString(script);
|
const std::string scriptString(script);
|
||||||
std::istringstream stringStream(scriptString);
|
std::istringstream stringStream(scriptString);
|
||||||
ParserInputStream inputStream(stringStream, "MenuScript");
|
ParserSingleInputStream inputStream(stringStream, "MenuScript");
|
||||||
SimpleLexer lexer(&inputStream, SimpleLexer::Config{false, true, false});
|
SimpleLexer lexer(&inputStream, SimpleLexer::Config{false, true, false});
|
||||||
|
|
||||||
std::vector<std::string> result;
|
std::vector<std::string> result;
|
||||||
|
@ -65,7 +65,7 @@ bool IncludingStreamProxy::MatchIncludeDirective(const ParserLine& line, unsigne
|
|||||||
unsigned filenameStart, filenameEnd;
|
unsigned filenameStart, filenameEnd;
|
||||||
|
|
||||||
if (!ExtractIncludeFilename(line, directivePosition, filenameStart, filenameEnd))
|
if (!ExtractIncludeFilename(line, directivePosition, filenameStart, filenameEnd))
|
||||||
throw ParsingException(TokenPos(line.m_filename, line.m_line_number, directivePosition), INCLUDE_QUOTES_ERROR);
|
throw ParsingException(TokenPos(line.m_filename, line.m_line_number, static_cast<int>(directivePosition)), INCLUDE_QUOTES_ERROR);
|
||||||
|
|
||||||
if (filenameEnd <= filenameStart)
|
if (filenameEnd <= filenameStart)
|
||||||
throw ParsingException(CreatePos(line, directivePosition), "No filename specified");
|
throw ParsingException(CreatePos(line, directivePosition), "No filename specified");
|
||||||
|
104
src/Parser/Parsing/Impl/ParserMultiInputStream.cpp
Normal file
104
src/Parser/Parsing/Impl/ParserMultiInputStream.cpp
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
#include "ParserMultiInputStream.h"
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
ParserMultiInputStream::FileInfo::FileInfo(std::unique_ptr<std::istream> stream, std::string filePath)
|
||||||
|
: m_owned_stream(std::move(stream)),
|
||||||
|
m_stream(*m_owned_stream),
|
||||||
|
m_file_path(std::move(filePath)),
|
||||||
|
m_line_number(1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ParserMultiInputStream::FileInfo::FileInfo(std::istream& stream, std::string filePath)
|
||||||
|
: m_stream(stream),
|
||||||
|
m_file_path(std::move(filePath)),
|
||||||
|
m_line_number(1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ParserMultiInputStream::ParserMultiInputStream(std::unique_ptr<std::istream> stream, std::string fileName, include_callback_t includeCallback)
|
||||||
|
: m_include_callback(std::move(includeCallback))
|
||||||
|
{
|
||||||
|
m_files.emplace(std::move(stream), std::move(fileName));
|
||||||
|
}
|
||||||
|
|
||||||
|
ParserMultiInputStream::ParserMultiInputStream(std::istream& stream, std::string fileName, include_callback_t includeCallback)
|
||||||
|
: m_include_callback(std::move(includeCallback))
|
||||||
|
{
|
||||||
|
m_files.emplace(stream, std::move(fileName));
|
||||||
|
}
|
||||||
|
|
||||||
|
ParserLine ParserMultiInputStream::NextLine()
|
||||||
|
{
|
||||||
|
std::ostringstream str;
|
||||||
|
auto hasLength = false;
|
||||||
|
|
||||||
|
if (m_files.empty())
|
||||||
|
return ParserLine();
|
||||||
|
|
||||||
|
while (!m_files.empty())
|
||||||
|
{
|
||||||
|
auto& fileInfo = m_files.top();
|
||||||
|
|
||||||
|
auto c = fileInfo.m_stream.get();
|
||||||
|
while (c != EOF)
|
||||||
|
{
|
||||||
|
switch (c)
|
||||||
|
{
|
||||||
|
case '\r':
|
||||||
|
c = fileInfo.m_stream.get();
|
||||||
|
if (c == '\n')
|
||||||
|
return ParserLine(fileInfo.m_file_path, fileInfo.m_line_number++, str.str());
|
||||||
|
str << '\r';
|
||||||
|
hasLength = true;
|
||||||
|
continue;
|
||||||
|
|
||||||
|
case '\n':
|
||||||
|
return ParserLine(fileInfo.m_file_path, fileInfo.m_line_number++, str.str());
|
||||||
|
|
||||||
|
default:
|
||||||
|
str << static_cast<char>(c);
|
||||||
|
hasLength = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
c = fileInfo.m_stream.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasLength)
|
||||||
|
return ParserLine(fileInfo.m_file_path, fileInfo.m_line_number, str.str());
|
||||||
|
m_files.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
return ParserLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ParserMultiInputStream::IncludeFile(const std::string& filename)
|
||||||
|
{
|
||||||
|
if (!m_include_callback)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
auto newFile = m_include_callback(filename);
|
||||||
|
if (!newFile)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
m_files.emplace(std::move(newFile), filename);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ParserMultiInputStream::PopCurrentFile()
|
||||||
|
{
|
||||||
|
if (!m_files.empty())
|
||||||
|
m_files.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ParserMultiInputStream::IsOpen() const
|
||||||
|
{
|
||||||
|
return !m_files.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ParserMultiInputStream::Eof() const
|
||||||
|
{
|
||||||
|
return m_files.empty();
|
||||||
|
}
|
40
src/Parser/Parsing/Impl/ParserMultiInputStream.h
Normal file
40
src/Parser/Parsing/Impl/ParserMultiInputStream.h
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <istream>
|
||||||
|
#include <stack>
|
||||||
|
#include <memory>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
#include "Parsing/IParserLineStream.h"
|
||||||
|
|
||||||
|
class ParserMultiInputStream final : public IParserLineStream
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using include_callback_t = std::function<std::unique_ptr<std::istream>(const std::string& filename)>;
|
||||||
|
|
||||||
|
private:
|
||||||
|
class FileInfo
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
std::unique_ptr<std::istream> m_owned_stream;
|
||||||
|
std::istream& m_stream;
|
||||||
|
std::string m_file_path;
|
||||||
|
int m_line_number;
|
||||||
|
|
||||||
|
FileInfo(std::unique_ptr<std::istream> stream, std::string filePath);
|
||||||
|
FileInfo(std::istream& stream, std::string filePath);
|
||||||
|
};
|
||||||
|
|
||||||
|
const include_callback_t m_include_callback;
|
||||||
|
std::stack<FileInfo> m_files;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ParserMultiInputStream(std::unique_ptr<std::istream> stream, std::string fileName, include_callback_t includeCallback);
|
||||||
|
ParserMultiInputStream(std::istream& stream, std::string fileName, include_callback_t includeCallback);
|
||||||
|
|
||||||
|
ParserLine NextLine() override;
|
||||||
|
bool IncludeFile(const std::string& filename) override;
|
||||||
|
void PopCurrentFile() override;
|
||||||
|
_NODISCARD bool IsOpen() const override;
|
||||||
|
_NODISCARD bool Eof() const override;
|
||||||
|
};
|
@ -1,15 +1,15 @@
|
|||||||
#include "ParserInputStream.h"
|
#include "ParserSingleInputStream.h"
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
ParserInputStream::ParserInputStream(std::istream& stream, std::string fileName)
|
ParserSingleInputStream::ParserSingleInputStream(std::istream& stream, std::string fileName)
|
||||||
: m_stream(stream),
|
: m_stream(stream),
|
||||||
m_file_name(std::move(fileName)),
|
m_file_name(std::move(fileName)),
|
||||||
m_line_number(1)
|
m_line_number(1)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ParserLine ParserInputStream::NextLine()
|
ParserLine ParserSingleInputStream::NextLine()
|
||||||
{
|
{
|
||||||
std::ostringstream str;
|
std::ostringstream str;
|
||||||
auto hasLength = false;
|
auto hasLength = false;
|
||||||
@ -45,21 +45,21 @@ ParserLine ParserInputStream::NextLine()
|
|||||||
return ParserLine();
|
return ParserLine();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ParserInputStream::IncludeFile(const std::string& filename)
|
bool ParserSingleInputStream::IncludeFile(const std::string& filename)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ParserInputStream::PopCurrentFile()
|
void ParserSingleInputStream::PopCurrentFile()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ParserInputStream::IsOpen() const
|
bool ParserSingleInputStream::IsOpen() const
|
||||||
{
|
{
|
||||||
return !m_stream.eof();
|
return !m_stream.eof();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ParserInputStream::Eof() const
|
bool ParserSingleInputStream::Eof() const
|
||||||
{
|
{
|
||||||
return !m_stream.eof();
|
return !m_stream.eof();
|
||||||
}
|
}
|
@ -4,14 +4,14 @@
|
|||||||
|
|
||||||
#include "Parsing/IParserLineStream.h"
|
#include "Parsing/IParserLineStream.h"
|
||||||
|
|
||||||
class ParserInputStream final : public IParserLineStream
|
class ParserSingleInputStream final : public IParserLineStream
|
||||||
{
|
{
|
||||||
std::istream& m_stream;
|
std::istream& m_stream;
|
||||||
std::string m_file_name;
|
std::string m_file_name;
|
||||||
int m_line_number;
|
int m_line_number;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ParserInputStream(std::istream& stream, std::string fileName);
|
ParserSingleInputStream(std::istream& stream, std::string fileName);
|
||||||
|
|
||||||
ParserLine NextLine() override;
|
ParserLine NextLine() override;
|
||||||
bool IncludeFile(const std::string& filename) override;
|
bool IncludeFile(const std::string& filename) override;
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
|
||||||
#include "Parsing/Impl/ParserInputStream.h"
|
#include "Parsing/Impl/ParserSingleInputStream.h"
|
||||||
#include <Parsing/Impl/CommentRemovingStreamProxy.h>
|
#include <Parsing/Impl/CommentRemovingStreamProxy.h>
|
||||||
|
|
||||||
#include "Parsing/Impl/DefinesStreamProxy.h"
|
#include "Parsing/Impl/DefinesStreamProxy.h"
|
||||||
@ -22,7 +22,7 @@ ZoneDefinitionInputStream::ZoneDefinitionInputStream(std::istream& stream, std::
|
|||||||
|
|
||||||
bool ZoneDefinitionInputStream::OpenBaseStream(std::istream& stream)
|
bool ZoneDefinitionInputStream::OpenBaseStream(std::istream& stream)
|
||||||
{
|
{
|
||||||
m_open_streams.emplace_back(std::make_unique<ParserInputStream>(stream, m_file_name));
|
m_open_streams.emplace_back(std::make_unique<ParserSingleInputStream>(stream, m_file_name));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user