From 44407c2a4b1bf4e07d64179d8defc1ac410f247e Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Mon, 12 Jul 2021 23:00:11 +0200 Subject: [PATCH] changed: added two new parameters to Generator class: template class Generator changed: added one new parameter to Outstreams class: template class OutStreams removed macros: EZC_GENERATOR_HAS_PT_STREAM, EZC_GENERATOR_HAS_WINIX_STREAM --- src/generator.h | 560 ++++++++++++++++++++++++----------------------- src/outstreams.h | 47 ++-- 2 files changed, 305 insertions(+), 302 deletions(-) diff --git a/src/generator.h b/src/generator.h index e83d30d..230b7c9 100644 --- a/src/generator.h +++ b/src/generator.h @@ -67,7 +67,7 @@ namespace Ezc StreamType we use only method write(const wchar_t * str, size_t len) from the stream */ -template +template class Generator { public: @@ -133,8 +133,8 @@ public: // the main methods for generating void Generate(StreamType & out); - void Generate(StreamType & out, OutStreams & out_streams); - void Generate(OutStreams & out_streams); + void Generate(StreamType & out, OutStreams & out_streams); + void Generate(OutStreams & out_streams); @@ -202,7 +202,7 @@ private: // pointer to the output streams map (can be null) // output stream will be created when [ezc frame "stream_name"] statement is found - OutStreams * output_frames_streams; + OutStreams * output_frames_streams; // temporary error messages std::wstring temp_msg; @@ -425,8 +425,8 @@ private: -template -Generator::Generator() : empty_stream() +template +Generator::Generator() : empty_stream() { ppattern = nullptr; pblocks = nullptr; @@ -456,16 +456,17 @@ Generator::Generator() : empty_stream() } -template -Generator::Generator(const Generator & n) +template +Generator::Generator(const Generator & n) { operator=(n); } -template -Generator & Generator::operator=(const Generator & n) +template +Generator & +Generator::operator=(const Generator & n) { ppattern = n.ppattern; pblocks = n.pblocks; @@ -511,8 +512,8 @@ return *this; -template -Generator::~Generator() +template +Generator::~Generator() { ClearFilterTab(); ClearForStack(); @@ -522,8 +523,8 @@ Generator::~Generator() -template -void Generator::SetPattern(Pattern & pattern) +template +void Generator::SetPattern(Pattern & pattern) { ppattern = &pattern; } @@ -531,36 +532,36 @@ void Generator::SetPattern(Pattern & pattern) -template -void Generator::SetBlocks(Blocks & blocks) +template +void Generator::SetBlocks(Blocks & blocks) { pblocks = &blocks; } -template -void Generator::SetFunctions(Functions & functions) +template +void Generator::SetFunctions(Functions & functions) { pfunctions = &functions; } -template -void Generator::SetObjects(Objects & objects) +template +void Generator::SetObjects(Objects & objects) { pobjects = &objects; } -template -void Generator::SetVariables(Vars & variables) +template +void Generator::SetVariables(Vars & variables) { pvars = &variables; } -template -void Generator::SetLogger(pt::Log & logger) +template +void Generator::SetLogger(pt::Log & logger) { plog = &logger; } @@ -568,34 +569,34 @@ void Generator::SetLogger(pt::Log & logger) #ifdef EZC_HAS_MORM_LIBRARY -template -void Generator::SetModels(Models & models) +template +void Generator::SetModels(Models & models) { pmodels = ⊧ } #endif -template -void Generator::CanUseCache(bool can_use_cache) +template +void Generator::CanUseCache(bool can_use_cache) { can_find_in_cache = can_use_cache; } -template -void Generator::CanUseVars(bool can_use_variables) +template +void Generator::CanUseVars(bool can_use_variables) { can_use_vars = can_use_variables; } -template -void Generator::SetProgramMode(bool set_program_mode) +template +void Generator::SetProgramMode(bool set_program_mode) { this->program_mode = set_program_mode; } -template -void Generator::SetExpressionParser(ExpressionParser * expression_parser) +template +void Generator::SetExpressionParser(ExpressionParser * expression_parser) { this->expression_parser = expression_parser; } @@ -603,8 +604,8 @@ void Generator::SetExpressionParser(ExpressionParser * expression_pa -template -void Generator::ResizeStack() +template +void Generator::ResizeStack() { if( stack_tab.size() != stack_size ) { @@ -620,8 +621,8 @@ void Generator::ResizeStack() -template -void Generator::ResizeStreamStack(std::vector & stream_tab, size_t stream_tab_max_size) +template +void Generator::ResizeStreamStack(std::vector & stream_tab, size_t stream_tab_max_size) { if( stream_tab.size() != stream_tab_max_size ) { @@ -644,22 +645,22 @@ void Generator::ResizeStreamStack(std::vector & stream_ } -template -void Generator::ResizeFilterTab() +template +void Generator::ResizeFilterTab() { ResizeStreamStack(filter_tab, filter_size); } -template -void Generator::ResizeEzcFrameStack() +template +void Generator::ResizeEzcFrameStack() { ResizeStreamStack(ezc_frame_stack_tab, ezc_frames_stack_size); } -template -void Generator::ResizeBlockStack() +template +void Generator::ResizeBlockStack() { if( block_stack_tab.size() != block_stack_size ) { @@ -683,8 +684,8 @@ void Generator::ResizeBlockStack() -template -void Generator::ClearStreamStack(std::vector & stream_tab) +template +void Generator::ClearStreamStack(std::vector & stream_tab) { for(size_t i=0 ; i::ClearStreamStack(std::vector & stream_t } -template -void Generator::ClearFilterTab() +template +void Generator::ClearFilterTab() { ClearStreamStack(filter_tab); } -template -void Generator::ClearEzcFrameTab() +template +void Generator::ClearEzcFrameTab() { ClearStreamStack(ezc_frame_stack_tab); } -template -void Generator::ClearBlockStack() +template +void Generator::ClearBlockStack() { for(size_t i=0 ; i::ClearBlockStack() } -template -void Generator::ClearForStack() +template +void Generator::ClearForStack() { for(size_t i=0 ; i -void Generator::ClearStream(StreamType & str) +template +void Generator::ClearStream(StreamType & str) { - #ifdef EZC_GENERATOR_HAS_PT_STREAM + if constexpr(is_pikotools_stream) + { str.clear(); - #else + } + else + { str.str(L""); - #endif + } } -template -void Generator::CopyStreamToString(StreamType & src_stream, std::wstring & dst_string) +template +void Generator::CopyStreamToString(StreamType & src_stream, std::wstring & dst_string) { if constexpr (sizeof(wchar_t) == sizeof(typename StreamType::char_type)) { - #ifdef EZC_GENERATOR_HAS_PT_STREAM + if constexpr(is_pikotools_stream) + { src_stream.to_str(dst_string); - #else + } + else + { dst_string = src_stream.str(); - #endif + } } else { - #ifdef EZC_GENERATOR_HAS_PT_STREAM + if constexpr(is_pikotools_stream) + { src_stream.to_str(dst_string); - #else + } + else + { std::string tmp = src_stream.str(); pt::utf8_to_wide(tmp, dst_string); - #endif + } } } -template -void Generator::CopyStream(StreamType & src_stream, StreamType & dst_stream) +template +void Generator::CopyStream(StreamType & src_stream, StreamType & dst_stream) { - #ifdef EZC_GENERATOR_HAS_PT_STREAM - dst_stream << src_stream; - #else - dst_stream << src_stream.str(); - #endif -} - - -template -void Generator::CopyStream(pt::WTextStream & src_stream, StreamType & dst_stream, bool should_escape) -{ - if constexpr(sizeof(char) == sizeof(typename StreamType::char_type)) + if constexpr(is_pikotools_stream) { - // winix html stream is always wide (wchar_t) - // so if we are here then the dst_stream cannot be a Winix::HtmlTextStream - #ifndef EZC_GENERATOR_HAS_WINIX_STREAM - - wide_stream_to_utf8(src_stream, dst_stream, false); - - #endif + dst_stream << src_stream; } else { - pt::WTextStream::iterator i = src_stream.begin(); + dst_stream << src_stream.str(); + } +} - while( i != src_stream.end() ) + +template +void Generator::CopyStream(pt::WTextStream & src_stream, StreamType & dst_stream, bool should_escape) +{ + if constexpr(is_autoescape_stream) + { + dst_stream.Escape(should_escape); + dst_stream << src_stream; + } + else + { + if constexpr(is_pikotools_stream) { - #ifdef EZC_GENERATOR_HAS_WINIX_STREAM - - // IMPROVEME we need a better api from winix htmltextstream - - if( should_escape ) - { - dst_stream << *i; - } - else - { - dst_stream.write(&(*i), 1); - } - #else - dst_stream.write(&(*i), 1); - #endif - - ++i; + dst_stream << src_stream; + } + else + { + if constexpr(sizeof(char) == sizeof(typename StreamType::char_type)) + { + wide_stream_to_utf8(src_stream, dst_stream, false); + } + else + { + dst_stream << src_stream.to_str(); + } } } } -template -void Generator::RemoveStackFunData(Stack & s) +template +void Generator::RemoveStackFunData(Stack & s) { if( s.fun_data && s.auto_remove ) { @@ -824,9 +825,9 @@ void Generator::RemoveStackFunData(Stack & s) } -template +template template -CharType Generator::ToLower(CharType c) +CharType Generator::ToLower(CharType c) { if( c>='A' && c<='Z' ) return c - 'A' + 'a'; @@ -835,52 +836,52 @@ return c; } -template -bool Generator::ConvertToBool(const std::wstring & str) +template +bool Generator::ConvertToBool(const std::wstring & str) { return !str.empty(); } -template -void Generator::SetMax(size_t max_items_, size_t max_for_items_) +template +void Generator::SetMax(size_t max_items_, size_t max_for_items_) { max_items = max_items_; max_for_items = max_for_items_; } -template -void Generator::RecognizeSpecialChars(bool spec) +template +void Generator::RecognizeSpecialChars(bool spec) { special_chars = spec; } -template -void Generator::TrimWhite(bool trim) +template +void Generator::TrimWhite(bool trim) { trim_white = trim; } -template -void Generator::SkipNewLine(bool skip) +template +void Generator::SkipNewLine(bool skip) { skip_new_line = skip; } -template -void Generator::SetMaxFilters(size_t new_len) +template +void Generator::SetMaxFilters(size_t new_len) { // the table will be resized when Generate() method is called filter_size = new_len; } -template -void Generator::SetStackSize(size_t new_stack_size) +template +void Generator::SetStackSize(size_t new_stack_size) { // the stack will be resized when Generate() method is called stack_size = new_stack_size; @@ -888,8 +889,8 @@ void Generator::SetStackSize(size_t new_stack_size) -template -void Generator::Generate() +template +void Generator::Generate() { if( is_generator_working ) { @@ -933,18 +934,18 @@ void Generator::Generate() } -template -void Generator::Generate(StreamType & out) +template +void Generator::Generate(StreamType & out) { output_stream = &out; - output_frames_streams = 0; + output_frames_streams = nullptr; Generate(); } -template -void Generator::Generate(StreamType & out, OutStreams & out_streams) +template +void Generator::Generate(StreamType & out, OutStreams & out_streams) { output_stream = &out; output_frames_streams = &out_streams; @@ -952,24 +953,24 @@ void Generator::Generate(StreamType & out, OutStreams & } -template -void Generator::Generate(OutStreams & out_streams) +template +void Generator::Generate(OutStreams & out_streams) { - output_stream = 0; + output_stream = nullptr; output_frames_streams = &out_streams; Generate(); } -template -bool Generator::IsTestingFunctionExistence() +template +bool Generator::IsTestingFunctionExistence() { return is_generating_if_def || is_generating_if_not_def; } -template -bool Generator::CheckBlockArgument(int arg_index, FindHelper & find_helper) +template +bool Generator::CheckBlockArgument(int arg_index, FindHelper & find_helper) { if( arg_index < 0 ) return false; @@ -991,8 +992,8 @@ bool Generator::CheckBlockArgument(int arg_index, FindHelper & find_ -template -bool Generator::FindInCache(Item::Function & item_fun, FindHelper & find_helper) +template +bool Generator::FindInCache(Item::Function & item_fun, FindHelper & find_helper) { if( can_find_in_cache ) { @@ -1023,8 +1024,8 @@ return false; #ifdef EZC_HAS_MORM_LIBRARY -template -bool Generator::FindInModels(FindHelper & find_helper) +template +bool Generator::FindInModels(FindHelper & find_helper) { if( pmodels ) { @@ -1043,8 +1044,8 @@ bool Generator::FindInModels(FindHelper & find_helper) #endif -template -bool Generator::FindInFunctionsAndBlocks(const std::wstring & name, FindHelper & find_helper) +template +bool Generator::FindInFunctionsAndBlocks(const std::wstring & name, FindHelper & find_helper) { if( pobjects ) { @@ -1083,8 +1084,8 @@ return false; } -template -bool Generator::FindInVariables(const std::wstring & name, FindHelper & find_helper) +template +bool Generator::FindInVariables(const std::wstring & name, FindHelper & find_helper) { if( pvars ) { @@ -1106,8 +1107,8 @@ bool Generator::FindInVariables(const std::wstring & name, FindHelpe * fun_name can be null, it is used only with [let ...] statements * and if not null then means: as a funcion name we are not using item_fun.name but fun_name */ -template -bool Generator::Find(Item::Function & item_fun, FindHelper & find_helper) +template +bool Generator::Find(Item::Function & item_fun, FindHelper & find_helper) { #ifdef EZC_HAS_MORM_LIBRARY if( FindInModels(find_helper) ) @@ -1140,8 +1141,8 @@ bool Generator::Find(Item::Function & item_fun, FindHelper & find_he } -template -void Generator::PrepareEnvStruct(FunInfo & info) +template +void Generator::PrepareEnvStruct(FunInfo & info) { info.Clear(); @@ -1158,8 +1159,8 @@ void Generator::PrepareEnvStruct(FunInfo & info) -template -void Generator::CallFunction(typename Functions::UserFunction & function, FunInfo & info) +template +void Generator::CallFunction(typename Functions::UserFunction & function, FunInfo & info) { PrepareEnvStruct(info); (function)(info); @@ -1168,8 +1169,8 @@ void Generator::CallFunction(typename Functions::UserFun -template -void Generator::CallFunction(typename Functions::UserFunction & function, +template +void Generator::CallFunction(typename Functions::UserFunction & function, std::vector & parameters, StreamType & out_stream, const StreamType & in_stream) @@ -1192,8 +1193,8 @@ void Generator::CallFunction(typename Functions::UserFun -template -void Generator::CallObject(BaseObj & base_obj, int method_index, FunInfo & info) +template +void Generator::CallObject(BaseObj & base_obj, int method_index, FunInfo & info) { PrepareEnvStruct(info); base_obj.CallFun(method_index, info); @@ -1203,8 +1204,8 @@ void Generator::CallObject(BaseObj & base_obj, int metho -template -bool Generator::HasParam(std::vector & parameters, const wchar_t * param1, const wchar_t * param2) +template +bool Generator::HasParam(std::vector & parameters, const wchar_t * param1, const wchar_t * param2) { for(Var & var : parameters) { @@ -1222,37 +1223,37 @@ bool Generator::HasParam(std::vector & parameters, const wchar_ -template -bool Generator::ShouldMakeSpaceDump(std::vector & parameters) +template +bool Generator::ShouldMakeSpaceDump(std::vector & parameters) { return HasParam(parameters, L"dump", L"dump_to_space"); } -template -bool Generator::ShouldMakeJsonDump(std::vector & parameters) +template +bool Generator::ShouldMakeJsonDump(std::vector & parameters) { return HasParam(parameters, L"dump_to_json"); } -template -bool Generator::IsCurrentParam(std::vector & parameters) +template +bool Generator::IsCurrentParam(std::vector & parameters) { return HasParam(parameters, L"current"); } -template -bool Generator::IsPrettyPrint(std::vector & parameters) +template +bool Generator::IsPrettyPrint(std::vector & parameters) { return HasParam(parameters, L"pretty"); } -template -void Generator::DumpSpaceIfNeeded(std::vector & parameters, StreamType & out_stream, pt::Space * space) +template +void Generator::DumpSpaceIfNeeded(std::vector & parameters, StreamType & out_stream, pt::Space * space) { bool dump_space = ShouldMakeSpaceDump(parameters); bool dump_json = ShouldMakeJsonDump(parameters); @@ -1274,8 +1275,8 @@ void Generator::DumpSpaceIfNeeded(std::vector & parameters, Str } -template -void Generator::DumpModelIfNeeded(morm::Model & model, std::vector & parameters, StreamType & out_stream) +template +void Generator::DumpModelIfNeeded(morm::Model & model, std::vector & parameters, StreamType & out_stream) { bool dump_space = ShouldMakeSpaceDump(parameters); bool dump_json = ShouldMakeJsonDump(parameters); @@ -1303,8 +1304,8 @@ void Generator::DumpModelIfNeeded(morm::Model & model, std::vector -void Generator::PrintDate(pt::Date * date, std::vector parameters, StreamType & out_stream) +template +void Generator::PrintDate(pt::Date * date, std::vector parameters, StreamType & out_stream) { bool is_roman = HasParam(parameters, L"roman"); bool is_no_sec = HasParam(parameters, L"no_sec"); @@ -1313,8 +1314,8 @@ void Generator::PrintDate(pt::Date * date, std::vector paramete } -template -bool Generator::PrintDatePart(pt::Date * date, const std::wstring & field, std::vector parameters, StreamType & out_stream) +template +bool Generator::PrintDatePart(pt::Date * date, const std::wstring & field, std::vector parameters, StreamType & out_stream) { bool is_test = IsTestingFunctionExistence(); @@ -1369,8 +1370,8 @@ bool Generator::PrintDatePart(pt::Date * date, const std::wstring & } -template -bool Generator::CallDate(FindHelper & find_helper, std::vector & fields, std::vector parameters, StreamType & out_stream) +template +bool Generator::CallDate(FindHelper & find_helper, std::vector & fields, std::vector parameters, StreamType & out_stream) { bool found = true; bool all_fields_known = (find_helper.field_index == fields.size()); @@ -1409,8 +1410,8 @@ bool Generator::CallDate(FindHelper & find_helper, std::vector -void Generator::CallSpaceObjectForLastField(std::vector & parameters, StreamType & out_stream, pt::Space * space) +template +void Generator::CallSpaceObjectForLastField(std::vector & parameters, StreamType & out_stream, pt::Space * space) { if( !IsTestingFunctionExistence() ) { @@ -1420,8 +1421,8 @@ void Generator::CallSpaceObjectForLastField(std::vector & param } -template -pt::Space * Generator::CallSpaceObjectForMiddleField(std::wstring & root_space_name, std::vector & fields, size_t field_index, pt::Space * space) +template +pt::Space * Generator::CallSpaceObjectForMiddleField(std::wstring & root_space_name, std::vector & fields, size_t field_index, pt::Space * space) { std::wstring & next_field = fields[field_index]; space = space->get_space(next_field); @@ -1436,8 +1437,8 @@ pt::Space * Generator::CallSpaceObjectForMiddleField(std::wstring & -template -void Generator::CallSpaceTableForLastField(morm::SpaceWrapper & space_wrapper, std::vector & parameters, StreamType & out_stream, +template +void Generator::CallSpaceTableForLastField(morm::SpaceWrapper & space_wrapper, std::vector & parameters, StreamType & out_stream, pt::Space * space, size_t model_wrapper_space_table_index) { pt::Space::TableType * table = space->get_table(); @@ -1473,8 +1474,8 @@ void Generator::CallSpaceTableForLastField(morm::SpaceWrapper & spac } -template -pt::Space * Generator::CallSpaceTableForMiddleField(morm::SpaceWrapper & space_wrapper, std::wstring & root_space_name, std::vector & fields, +template +pt::Space * Generator::CallSpaceTableForMiddleField(morm::SpaceWrapper & space_wrapper, std::wstring & root_space_name, std::vector & fields, size_t field_index, pt::Space * space, size_t model_wrapper_space_table_index) { pt::Space::TableType * table = space->get_table(); @@ -1497,8 +1498,8 @@ pt::Space * Generator::CallSpaceTableForMiddleField(morm::SpaceWrapp } -template -void Generator::PrintLastSpaceField(pt::Space * space, std::vector & parameters, StreamType & out_stream) +template +void Generator::PrintLastSpaceField(pt::Space * space, std::vector & parameters, StreamType & out_stream) { bool no_escape = HasParam(parameters, L"raw", L"noescape"); @@ -1516,8 +1517,8 @@ void Generator::PrintLastSpaceField(pt::Space * space, std::vector -bool Generator::CallSpace(FindHelper & find_helper, std::vector & fields, std::vector & parameters, StreamType & out_stream) +template +bool Generator::CallSpace(FindHelper & find_helper, std::vector & fields, std::vector & parameters, StreamType & out_stream) { morm::SpaceWrapper * space_wrapper = find_helper.wrapper->space_wrapper; pt::Space * space = space_wrapper->get_space(); @@ -1602,8 +1603,8 @@ bool Generator::CallSpace(FindHelper & find_helper, std::vector -bool Generator::CallModelField(morm::Model & model, const std::wstring & field, std::vector parameters, StreamType & out_stream, const StreamType & in_stream) +template +bool Generator::CallModelField(morm::Model & model, const std::wstring & field, std::vector parameters, StreamType & out_stream, const StreamType & in_stream) { /* * if 'field' is a POD type then 'str' will be used in get_raw_value() @@ -1637,8 +1638,8 @@ bool Generator::CallModelField(morm::Model & model, const std::wstri } -template -bool Generator::CallModel(morm::Model & model, FindHelper & find_helper, std::vector & fields, +template +bool Generator::CallModel(morm::Model & model, FindHelper & find_helper, std::vector & fields, std::vector parameters, StreamType & out_stream, const StreamType & in_stream) { bool found = true; @@ -1680,8 +1681,8 @@ bool Generator::CallModel(morm::Model & model, FindHelper & find_hel -template -void Generator::FindLastModelWrapper(FindHelper & find_helper, std::vector & fields) +template +void Generator::FindLastModelWrapper(FindHelper & find_helper, std::vector & fields) { for(find_helper.field_index = 0 ; find_helper.field_index < fields.size() && find_helper.wrapper->has_model_object() ; ++find_helper.field_index) { @@ -1722,8 +1723,8 @@ void Generator::FindLastModelWrapper(FindHelper & find_helper, std:: } -template -bool Generator::CallWrapper(FindHelper & find_helper, std::vector & fields, +template +bool Generator::CallWrapper(FindHelper & find_helper, std::vector & fields, std::vector parameters, StreamType & out_stream, const StreamType & in_stream) { bool found = true; @@ -1794,8 +1795,8 @@ bool Generator::CallWrapper(FindHelper & find_helper, std::vector -void Generator::CallObject(BaseObj & base_obj, +template +void Generator::CallObject(BaseObj & base_obj, int method_index, std::vector & parameters, StreamType & out_stream, @@ -1818,8 +1819,8 @@ void Generator::CallObject(BaseObj & base_obj, -template -bool Generator::CallBlock(Item & item_block, +template +bool Generator::CallBlock(Item & item_block, std::vector & parameters, StreamType & out_stream) { @@ -1856,8 +1857,8 @@ return true; -template -bool Generator::CallVariable(Item::Function & item_fun, Var & variable, std::vector & parameters, StreamType & out_stream, const StreamType & in_stream) +template +bool Generator::CallVariable(Item::Function & item_fun, Var & variable, std::vector & parameters, StreamType & out_stream, const StreamType & in_stream) { if( variable.is_function ) { @@ -1882,8 +1883,8 @@ bool Generator::CallVariable(Item::Function & item_fun, Var & variab * * return: true if a function, variable or block was found and called (evaluated) */ -template -bool Generator::Call(Item::Function & item_fun, +template +bool Generator::Call(Item::Function & item_fun, std::wstring * fun_name, StreamType & out_stream, bool clear_out_stream, @@ -1895,6 +1896,9 @@ std::vector parameters; if( clear_out_stream ) ClearStream(out_stream); + if constexpr(is_autoescape_stream) + out_stream.Escape(true); + find_helper.fun_name = fun_name; if( !find_helper.fun_name ) @@ -1947,8 +1951,8 @@ std::vector parameters; // return: true if a function or variable was found and called -template -bool Generator::Call(Item::Function & item_fun) +template +bool Generator::Call(Item::Function & item_fun) { return Call(item_fun, nullptr, stream_temp1, true, empty_stream); } @@ -1956,8 +1960,8 @@ bool Generator::Call(Item::Function & item_fun) -template -wchar_t Generator::CreateSpecialChar(wchar_t c) +template +wchar_t Generator::CreateSpecialChar(wchar_t c) { wchar_t res = 0; @@ -1985,8 +1989,8 @@ return res; // if the special character is unknown the first slash is printing // so "\t" gives one character of code 9 // and "\x" gives "\x" -template -const wchar_t * Generator::PrintSpecialChar(const wchar_t * start, const wchar_t * end) +template +const wchar_t * Generator::PrintSpecialChar(const wchar_t * start, const wchar_t * end) { wchar_t special = 0; @@ -2010,8 +2014,8 @@ return start; } -template -void Generator::PrintSpecialText(const wchar_t * start, const wchar_t * end) +template +void Generator::PrintSpecialText(const wchar_t * start, const wchar_t * end) { if( output_stream ) { @@ -2039,8 +2043,8 @@ void Generator::PrintSpecialText(const wchar_t * start, const wchar_ } -template -void Generator::PrintNormalText(const wchar_t * start, const wchar_t * end) +template +void Generator::PrintNormalText(const wchar_t * start, const wchar_t * end) { if( output_stream ) { @@ -2074,8 +2078,8 @@ void Generator::PrintNormalText(const wchar_t * start, const wchar_t } -template -bool Generator::IsWhite(wchar_t c) +template +bool Generator::IsWhite(wchar_t c) { // 13 (\r) is from a dos file at the end of a line (\r\n) // 160 is a non-breaking space @@ -2087,8 +2091,8 @@ return false; } -template -void Generator::TrimWhite(const wchar_t *& start, const wchar_t *& end) +template +void Generator::TrimWhite(const wchar_t *& start, const wchar_t *& end) { while( start != end && IsWhite(*start) ) ++start; @@ -2098,8 +2102,8 @@ void Generator::TrimWhite(const wchar_t *& start, const wchar_t *& e } -template -void Generator::SkipWhite(const wchar_t *& str) +template +void Generator::SkipWhite(const wchar_t *& str) { while( IsWhite(*str) ) str += 1; @@ -2107,8 +2111,8 @@ void Generator::SkipWhite(const wchar_t *& str) -template -size_t Generator::StrToSize(const wchar_t * str, const wchar_t ** str_end) +template +size_t Generator::StrToSize(const wchar_t * str, const wchar_t ** str_end) { size_t res = 0; @@ -2133,8 +2137,8 @@ return res; } -template -void Generator::CopyTmpStreamToOutputStreams(Item::Function & fun, StreamType & ezc_out_tmp_stream, StreamType & previous_stream) +template +void Generator::CopyTmpStreamToOutputStreams(Item::Function & fun, StreamType & ezc_out_tmp_stream, StreamType & previous_stream) { if( output_frames_streams ) { @@ -2172,8 +2176,8 @@ void Generator::CopyTmpStreamToOutputStreams(Item::Function & fun, S -template -void Generator::CreateMsg(const wchar_t * type, const wchar_t * arg) +template +void Generator::CreateMsg(const wchar_t * type, const wchar_t * arg) { if( plog ) { @@ -2190,8 +2194,8 @@ void Generator::CreateMsg(const wchar_t * type, const wchar_t * arg) -template -void Generator::CreateMsg(const wchar_t * type, const std::wstring & model_name, std::vector & fields, size_t how_many_fields_print, +template +void Generator::CreateMsg(const wchar_t * type, const std::wstring & model_name, std::vector & fields, size_t how_many_fields_print, const wchar_t * arg, const wchar_t * arg2, const wchar_t * arg3) { if( plog ) @@ -2223,8 +2227,8 @@ void Generator::CreateMsg(const wchar_t * type, const std::wstring & } -template -void Generator::CreateMsg(const wchar_t * type, const std::wstring & model_name, std::vector & fields, +template +void Generator::CreateMsg(const wchar_t * type, const std::wstring & model_name, std::vector & fields, const wchar_t * arg, const wchar_t * arg2, const wchar_t * arg3) { @@ -2233,24 +2237,24 @@ void Generator::CreateMsg(const wchar_t * type, const std::wstring & -template -void Generator::CreateMsg(const std::wstring & type, const std::wstring & arg) +template +void Generator::CreateMsg(const std::wstring & type, const std::wstring & arg) { CreateMsg(type.c_str(), arg.c_str()); } -template -void Generator::CreateMsg(const std::wstring & type) +template +void Generator::CreateMsg(const std::wstring & type) { CreateMsg(type.c_str()); } -template -void Generator::EvaluateProgramNode(Item & item) +template +void Generator::EvaluateProgramNode(Item & item) { if( output_stream ) { @@ -2294,8 +2298,8 @@ void Generator::EvaluateProgramNode(Item & item) -template -void Generator::MakeItemText(Item & item) +template +void Generator::MakeItemText(Item & item) { const wchar_t * start = item.text.c_str(); const wchar_t * end = item.text.c_str() + item.text.size(); @@ -2310,8 +2314,8 @@ const wchar_t * end = item.text.c_str() + item.text.size(); } -template -void Generator::MakeTextContainer(Item & item) +template +void Generator::MakeTextContainer(Item & item) { std::vector::iterator i = item.item_tab.begin(); @@ -2321,8 +2325,8 @@ void Generator::MakeTextContainer(Item & item) -template -void Generator::MakeTextFunction(Item & item) +template +void Generator::MakeTextFunction(Item & item) { is_generating_normal = true; @@ -2346,8 +2350,8 @@ void Generator::MakeTextFunction(Item & item) -template -void Generator::MakeTextIf_go(Item & item, bool result) +template +void Generator::MakeTextIf_go(Item & item, bool result) { if( result ) { @@ -2364,8 +2368,8 @@ void Generator::MakeTextIf_go(Item & item, bool result) -template -void Generator::MakeTextIf(Item & item) +template +void Generator::MakeTextIf(Item & item) { is_generating_if = true; @@ -2383,8 +2387,8 @@ void Generator::MakeTextIf(Item & item) } -template -void Generator::MakeTextIfDef(Item & item) +template +void Generator::MakeTextIfDef(Item & item) { is_generating_if_def = true; @@ -2402,8 +2406,8 @@ void Generator::MakeTextIfDef(Item & item) } -template -void Generator::MakeTextIfNotDef(Item & item) +template +void Generator::MakeTextIfNotDef(Item & item) { is_generating_if_not_def = true; @@ -2421,8 +2425,8 @@ void Generator::MakeTextIfNotDef(Item & item) } -template -void Generator::MakeTextFor(Item & item) +template +void Generator::MakeTextFor(Item & item) { stack_tab[stack_index-1].is_for = true; @@ -2457,8 +2461,8 @@ void Generator::MakeTextFor(Item & item) } -template -void Generator::MakeTextDefine(Item & item, Var & var) +template +void Generator::MakeTextDefine(Item & item, Var & var) { var.str.clear(); var.res = ConvertToBool(var.str); @@ -2498,8 +2502,8 @@ void Generator::MakeTextDefine(Item & item, Var & var) } -template -void Generator::MakeTextDefine(Item & item) +template +void Generator::MakeTextDefine(Item & item) { if( !can_use_vars || !pvars ) { @@ -2512,8 +2516,8 @@ void Generator::MakeTextDefine(Item & item) } -template -void Generator::MakeTextDefineIfNotSet(Item & item) +template +void Generator::MakeTextDefineIfNotSet(Item & item) { if( !can_use_vars || !pvars ) { @@ -2533,8 +2537,8 @@ void Generator::MakeTextDefineIfNotSet(Item & item) -template -void Generator::MakeTextLet(Item & item, Var & var) +template +void Generator::MakeTextLet(Item & item, Var & var) { var.str.clear(); var.res = ConvertToBool(var.str); @@ -2563,8 +2567,8 @@ void Generator::MakeTextLet(Item & item, Var & var) } -template -void Generator::MakeTextLet(Item & item) +template +void Generator::MakeTextLet(Item & item) { if( !can_use_vars || !pvars ) { @@ -2577,8 +2581,8 @@ void Generator::MakeTextLet(Item & item) } -template -void Generator::MakeTextLetIfNotSet(Item & item) +template +void Generator::MakeTextLetIfNotSet(Item & item) { if( !can_use_vars || !pvars ) { @@ -2597,8 +2601,8 @@ void Generator::MakeTextLetIfNotSet(Item & item) -template -void Generator::MakeTextFilter(Item & item) +template +void Generator::MakeTextFilter(Item & item) { if( filter_index >= filter_tab.size() ) { @@ -2642,8 +2646,8 @@ void Generator::MakeTextFilter(Item & item) but in the future we can use more complicated class like pt::Space and then nested [ezc frame] statements can product a better output */ -template -void Generator::MakeEzcFrame(Item & item) +template +void Generator::MakeEzcFrame(Item & item) { std::vector output_stream_names; StreamType * old_stream; @@ -2684,8 +2688,8 @@ bool stream_added = true; -template -void Generator::MakeTextEzc(Item & item) +template +void Generator::MakeTextEzc(Item & item) { if( item.function.name == L"frame" ) { @@ -2702,8 +2706,8 @@ void Generator::MakeTextEzc(Item & item) } -template -void Generator::MakeTextReturn(Item & item) +template +void Generator::MakeTextReturn(Item & item) { last_res = false; @@ -2729,8 +2733,8 @@ void Generator::MakeTextReturn(Item & item) -template -bool Generator::LimitAchieved() +template +bool Generator::LimitAchieved() { if( break_generating ) return true; @@ -2761,8 +2765,8 @@ return false; } -template -void Generator::MakeText(Item & item) +template +void Generator::MakeText(Item & item) { if( LimitAchieved() ) return; @@ -2801,8 +2805,6 @@ void Generator::MakeText(Item & item) } - - } // namespace Ezc diff --git a/src/outstreams.h b/src/outstreams.h index df5840b..c8075cb 100644 --- a/src/outstreams.h +++ b/src/outstreams.h @@ -5,7 +5,7 @@ */ /* - * Copyright (c) 2015, Tomasz Sowa + * Copyright (c) 2015-2021, Tomasz Sowa * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -47,7 +47,7 @@ namespace Ezc { -template +template class OutStreams { public: @@ -65,36 +65,35 @@ public: ~OutStreams(); OutStreams(); - OutStreams(const OutStreams & o); - OutStreams & operator=(const OutStreams & o); + OutStreams(const OutStreams & o); + OutStreams & operator=(const OutStreams & o); - }; -template -OutStreams::~OutStreams() +template +OutStreams::~OutStreams() { ClearTab(); } -template -OutStreams::OutStreams() +template +OutStreams::OutStreams() { } -template -OutStreams::OutStreams(const OutStreams & o) +template +OutStreams::OutStreams(const OutStreams & o) { // we do not copy streams but creating new ones ResizeTab(o.streams_tab.size()); } -template -OutStreams & OutStreams::operator=(const OutStreams & o) +template +OutStreams & OutStreams::operator=(const OutStreams & o) { // we do not copy streams but creating new ones streams_map.clear(); @@ -104,8 +103,8 @@ return *this; } -template -void OutStreams::ClearTab() +template +void OutStreams::ClearTab() { for(size_t i=0 ; i::ClearTab() } -template -void OutStreams::ResizeTab(size_t len) +template +void OutStreams::ResizeTab(size_t len) { if( streams_tab.size() != len ) { @@ -141,8 +140,8 @@ void OutStreams::ResizeTab(size_t len) } -template -void OutStreams::ClearMap() +template +void OutStreams::ClearMap() { typename StreamsMap::iterator i; @@ -150,12 +149,14 @@ void OutStreams::ClearMap() { StreamType & str = *(i->second); - #ifdef EZC_GENERATOR_HAS_PT_STREAM + if constexpr(is_pikotools_stream) + { str.clear(); - #else + } + else + { str.str(L""); - #endif - + } } streams_map.clear();