From da6343166a72d897dd7d88306a6950dbd8de1457 Mon Sep 17 00:00:00 2001 From: milek7 Date: Sat, 10 Aug 2019 12:00:37 +0200 Subject: [PATCH] scn parsing with directive and trainset matching --- launcher/scenery_scanner.cpp | 49 +++++++++++++++++++++++++++++++----- launcher/scenery_scanner.h | 9 ++++--- parser.cpp | 2 +- parser.h | 1 + 4 files changed, 51 insertions(+), 10 deletions(-) diff --git a/launcher/scenery_scanner.cpp b/launcher/scenery_scanner.cpp index 47ae7b11..6ed869c0 100644 --- a/launcher/scenery_scanner.cpp +++ b/launcher/scenery_scanner.cpp @@ -1,5 +1,6 @@ #include "stdafx.h" #include "scenery_scanner.h" +#include "Logs.h" void scenery_scanner::scan() { @@ -10,24 +11,35 @@ void scenery_scanner::scan() continue; if (string_ends_with(path.string(), ".scn")) - scan_scn(path.string()); + scan_scn(path); } std::sort(scenarios.begin(), scenarios.end(), [](const scenery_desc &a, const scenery_desc &b) { return a.path < b.path; }); } -void scenery_scanner::scan_scn(std::string path) +void scenery_scanner::scan_scn(std::filesystem::path path) { scenarios.emplace_back(); scenery_desc &desc = scenarios.back(); desc.path = path; - std::ifstream stream(path, std::ios_base::binary | std::ios_base::in); + cParser parser(path.string(), cParser::buffer_FILE); + parser.expandIncludes = false; + while (!parser.eof()) { + parser.getTokens(); + if (parser.peek() == "trainset") + parse_trainset(parser); + } + std::ifstream stream(path.string(), std::ios_base::binary | std::ios_base::in); + + int line_counter = 0; std::string line; while (std::getline(stream, line)) { + line_counter++; + if (line.size() < 6 || !string_starts_with(line, "//$")) continue; @@ -49,9 +61,34 @@ void scenery_scanner::scan_scn(std::string path) desc.links.push_back(std::make_pair(file, label)); } else if (line[3] == 'o') { - desc.trainsets.emplace_back(); - trainset_desc &trainset = desc.trainsets.back(); - trainset.name = line.substr(5); + for (trainset_desc &trainset : desc.trainsets) { + if (line_counter < trainset.file_bounds.first + || line_counter > trainset.file_bounds.second) + continue; + + trainset.description = line.substr(5); + } } } + + WriteLog(path.string() + "----------"); + for (trainset_desc &trainset : desc.trainsets) { + WriteLog(trainset.name + "=" + std::to_string(trainset.file_bounds.first) + ":" + std::to_string(trainset.file_bounds.second) + "@" + trainset.description); + } +} + +void scenery_scanner::parse_trainset(cParser &parser) +{ + scenery_desc &desc = scenarios.back(); + desc.trainsets.emplace_back(); + trainset_desc &trainset = desc.trainsets.back(); + + trainset.file_bounds.first = parser.Line(); + parser.getTokens(4); + parser >> trainset.name >> trainset.track >> trainset.offset >> trainset.velocity; + + while (parser.peek() != "endtrainset") + parser.getTokens(); + + trainset.file_bounds.second = parser.Line(); } diff --git a/launcher/scenery_scanner.h b/launcher/scenery_scanner.h index d95610dc..dc388b00 100644 --- a/launcher/scenery_scanner.h +++ b/launcher/scenery_scanner.h @@ -3,8 +3,11 @@ #include #include "Texture.h" #include "utilities.h" +#include "parser.h" struct trainset_desc { + std::pair file_bounds; + std::string description; std::string name; @@ -13,8 +16,7 @@ struct trainset_desc { float offset { 0.f }; float velocity { 0.f }; - std::vector vehicles; - std::vector couplings; + std::vector> vehicles; }; struct scenery_desc { @@ -42,5 +44,6 @@ public: void scan(); private: - void scan_scn(std::string path); + void scan_scn(std::filesystem::path path); + void parse_trainset(cParser &parser); }; diff --git a/parser.cpp b/parser.cpp index c4e64547..8ebb92f5 100644 --- a/parser.cpp +++ b/parser.cpp @@ -231,7 +231,7 @@ std::string cParser::readToken( bool ToLower, const char *Break ) { } } - if( token == "include" ) { + if( expandIncludes && token == "include" ) { // launch child parser if include directive found. // NOTE: parameter collecting uses default set of token separators. std::string includefile = readToken(ToLower); // nazwa pliku diff --git a/parser.h b/parser.h index f47f349b..b909b5a0 100644 --- a/parser.h +++ b/parser.h @@ -81,6 +81,7 @@ class cParser //: public std::stringstream std::string Name() const; // returns number of currently processed line std::size_t Line() const; + bool expandIncludes = true; private: // methods: