diff --git a/raw/iw4/techniques/technique_test.technique.template b/raw/iw4/techniques/technique_test.technique.template index 8024755c..291ce561 100644 --- a/raw/iw4/techniques/technique_test.technique.template +++ b/raw/iw4/techniques/technique_test.technique.template @@ -1,11 +1,14 @@ #pragma options TEST(asdf, bla) #pragma switch TEST_SWITCH + #ifdef TEST_SWITCH #define SVAL "1" #else #define SVAL "0" #endif + #pragma filename "lemao_" + TEST + SVAL + ".txt" + HAHA TEST #ifdef TEST_SWITCH kekw diff --git a/src/Parser/Parsing/Impl/SkipUntilFirstNonEmptyProxy.cpp b/src/Parser/Parsing/Impl/SkipUntilFirstNonEmptyProxy.cpp new file mode 100644 index 00000000..19b3d7db --- /dev/null +++ b/src/Parser/Parsing/Impl/SkipUntilFirstNonEmptyProxy.cpp @@ -0,0 +1,40 @@ +#include "SkipUntilFirstNonEmptyProxy.h" + +SkipUntilFirstNonEmptyProxy::SkipUntilFirstNonEmptyProxy(IParserLineStream* stream) + : m_stream(stream), + m_had_non_empty(false) +{ +} + +ParserLine SkipUntilFirstNonEmptyProxy::NextLine() +{ + auto line = m_stream->NextLine(); + if (!m_had_non_empty) + { + while (line.m_line.empty() && !m_stream->Eof()) + line = m_stream->NextLine(); + m_had_non_empty = true; + } + + return line; +} + +bool SkipUntilFirstNonEmptyProxy::IncludeFile(const std::string& filename) +{ + return m_stream->IncludeFile(filename); +} + +void SkipUntilFirstNonEmptyProxy::PopCurrentFile() +{ + m_stream->PopCurrentFile(); +} + +bool SkipUntilFirstNonEmptyProxy::IsOpen() const +{ + return m_stream->IsOpen(); +} + +bool SkipUntilFirstNonEmptyProxy::Eof() const +{ + return m_stream->Eof(); +} diff --git a/src/Parser/Parsing/Impl/SkipUntilFirstNonEmptyProxy.h b/src/Parser/Parsing/Impl/SkipUntilFirstNonEmptyProxy.h new file mode 100644 index 00000000..b4f5a753 --- /dev/null +++ b/src/Parser/Parsing/Impl/SkipUntilFirstNonEmptyProxy.h @@ -0,0 +1,19 @@ +#pragma once + +#include "Parsing/IParserLineStream.h" + +class SkipUntilFirstNonEmptyProxy final : public IParserLineStream +{ +public: + explicit SkipUntilFirstNonEmptyProxy(IParserLineStream* stream); + + ParserLine NextLine() override; + bool IncludeFile(const std::string& filename) override; + void PopCurrentFile() override; + _NODISCARD bool IsOpen() const override; + _NODISCARD bool Eof() const override; + +private: + IParserLineStream* const m_stream; + bool m_had_non_empty; +}; diff --git a/src/RawTemplater/Templating/Templater.cpp b/src/RawTemplater/Templating/Templater.cpp index bd0c23cc..26eba7a8 100644 --- a/src/RawTemplater/Templating/Templater.cpp +++ b/src/RawTemplater/Templating/Templater.cpp @@ -12,6 +12,7 @@ #include "Parsing/ParsingException.h" #include "Parsing/Impl/DefinesStreamProxy.h" #include "Parsing/Impl/ParserSingleInputStream.h" +#include "Parsing/Impl/SkipUntilFirstNonEmptyProxy.h" using namespace templating; namespace fs = std::filesystem; @@ -33,15 +34,17 @@ namespace templating m_templating_proxy = std::make_unique(m_base_stream.get(), templaterControl); m_defines_proxy = std::make_unique(m_templating_proxy.get()); m_directive_escape_proxy = std::make_unique(m_defines_proxy.get()); + m_skip_until_first_non_empty_proxy = std::make_unique(m_directive_escape_proxy.get()); m_templating_proxy->SetDefinesProxy(m_defines_proxy.get()); - m_stream = m_directive_escape_proxy.get(); + m_stream = m_skip_until_first_non_empty_proxy.get(); } std::unique_ptr m_base_stream; std::unique_ptr m_templating_proxy; std::unique_ptr m_defines_proxy; std::unique_ptr m_directive_escape_proxy; + std::unique_ptr m_skip_until_first_non_empty_proxy; IParserLineStream* m_stream; };