diff --git a/src/patternparser.cpp b/src/patternparser.cpp index 0c7d456..82bf4c9 100644 --- a/src/patternparser.cpp +++ b/src/patternparser.cpp @@ -4,8 +4,8 @@ * Author: Tomasz Sowa */ -/* - * Copyright (c) 2007-2021, Tomasz Sowa +/* + * Copyright (c) 2007-2026, Tomasz Sowa * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -54,66 +54,148 @@ PatternParser::PatternParser() } - -void PatternParser::Directory(const char * dir, const char * dir2) +void PatternParser::AddDirectory(const char * dir) { - directory.clear(); - directory2.clear(); - - if( dir ) - pt::utf8_to_wide(dir, directory); - - if( dir2 ) - pt::utf8_to_wide(dir2, directory2); + pt::utf8_to_wide(dir, file_name); + directories.push_back(file_name); + file_name.clear(); } - -void PatternParser::Directory(const std::string & dir) +void PatternParser::AddDirectory(const wchar_t * dir) { - pt::utf8_to_wide(dir, directory); - directory2.clear(); + directories.push_back(dir); } - -void PatternParser::Directory(const std::string & dir, const std::string & dir2) +void PatternParser::AddDirectory(const std::string & dir) { - pt::utf8_to_wide(dir, directory); - pt::utf8_to_wide(dir2, directory2); + pt::utf8_to_wide(dir, file_name); + directories.push_back(file_name); + file_name.clear(); } - -void PatternParser::Directory(const wchar_t * dir, const wchar_t * dir2) +void PatternParser::AddDirectory(const std::wstring & dir) { - directory.clear(); - directory2.clear(); - - if( dir ) - directory = dir; - - if( dir2 ) - directory2 = dir2; + directories.push_back(dir); } - -void PatternParser::Directory(const std::wstring & dir) +void PatternParser::AddDirectories(const std::vector & dirs) { - directory = dir; - directory2.clear(); + for(const std::string & dir : dirs) + { + pt::utf8_to_wide(dir, file_name); + directories.push_back(file_name); + } + + file_name.clear(); } - -void PatternParser::Directory(const std::wstring & dir, const std::wstring & dir2) +void PatternParser::AddDirectories(const std::list & dirs) { - directory = dir; - directory2 = dir2; + for(const std::string & dir : dirs) + { + pt::utf8_to_wide(dir, file_name); + directories.push_back(file_name); + } + + file_name.clear(); } +void PatternParser::AddDirectories(const std::vector & dirs) +{ + for(const std::wstring & dir : dirs) + { + directories.push_back(dir); + } +} + + +void PatternParser::AddDirectories(const std::list & dirs) +{ + for(const std::wstring & dir : dirs) + { + directories.push_back(dir); + } +} + + +void PatternParser::SetDirectory(const char * dir) +{ + directories.clear(); + AddDirectory(dir); +} + + +void PatternParser::SetDirectory(const wchar_t * dir) +{ + directories.clear(); + AddDirectory(dir); +} + + +void PatternParser::SetDirectory(const std::string & dir) +{ + directories.clear(); + AddDirectory(dir); +} + + +void PatternParser::SetDirectory(const std::wstring & dir) +{ + directories.clear(); + AddDirectory(dir); +} + + +void PatternParser::SetDirectories(const std::vector & dirs) +{ + directories.clear(); + + for(const std::string & dir : dirs) + { + AddDirectory(dir); + } +} + + +void PatternParser::SetDirectories(const std::list & dirs) +{ + directories.clear(); + + for(const std::string & dir : dirs) + { + AddDirectory(dir); + } +} + + +void PatternParser::SetDirectories(const std::vector & dirs) +{ + directories = dirs; +} + + +void PatternParser::SetDirectories(const std::list & dirs) +{ + directories.clear(); + + for(const std::wstring & dir : dirs) + { + directories.push_back(dir); + } +} + + +void PatternParser::ClearDirectories() +{ + directories.clear(); +} + void PatternParser::SetBlocks(Blocks & blocks) { @@ -341,16 +423,22 @@ void PatternParser::ReadFile(const wchar_t * name, std::wstring & result) { result.clear(); - if( !ReadFileFromDir(directory, name, result) ) + bool file_read_successfully = false; + std::vector::reverse_iterator dir = directories.rbegin(); + + for( ; dir != directories.rend() ; ++dir) { - if( !ReadFileFromDir(directory2, name, result) ) + if( ReadFileFromDir(*dir, name, result) ) { - if( log ) - { - (*log) << pt::Log::log2 << "Ezc: can't open file: " << name << pt::Log::logend; - } + file_read_successfully = true; + break; } } + + if( !file_read_successfully && log ) + { + (*log) << pt::Log::log2 << "Ezc: can't open file: " << name << pt::Log::logend; + } } } diff --git a/src/patternparser.h b/src/patternparser.h index 9f981b4..f6ae6d6 100644 --- a/src/patternparser.h +++ b/src/patternparser.h @@ -4,8 +4,8 @@ * Author: Tomasz Sowa */ -/* - * Copyright (c) 2007-2021, Tomasz Sowa +/* + * Copyright (c) 2007-2026, Tomasz Sowa * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -52,16 +52,25 @@ public: PatternParser(); - // first we're trying to read a file from directory dir - // if there is no such a file there then we try read from dir2 - // (the second dir2 can be empty - it will not be used) - void Directory(const char * dir, const char * dir2 = 0); - void Directory(const std::string & dir); - void Directory(const std::string & dir, const std::string & dir2); + void AddDirectory(const char * dir); + void AddDirectory(const wchar_t * dir); + void AddDirectory(const std::string & dir); + void AddDirectory(const std::wstring & dir); + void AddDirectories(const std::vector & dirs); + void AddDirectories(const std::list & dirs); + void AddDirectories(const std::vector & dirs); + void AddDirectories(const std::list & dirs); - void Directory(const wchar_t * dir, const wchar_t * dir2 = 0); - void Directory(const std::wstring & dir); - void Directory(const std::wstring & dir, const std::wstring & dir2); + void SetDirectory(const char * dir); + void SetDirectory(const wchar_t * dir); + void SetDirectory(const std::string & dir); + void SetDirectory(const std::wstring & dir); + void SetDirectories(const std::vector & dirs); + void SetDirectories(const std::list & dirs); + void SetDirectories(const std::vector & dirs); + void SetDirectories(const std::list & dirs); + + void ClearDirectories(); void ParseFile(const char * file_name, Pattern & pattern); void ParseFile(const std::string & file_name, Pattern & pattern); @@ -115,10 +124,9 @@ private: // default: false bool delete_white_text_items; - // first we're trying to read a file from 'directory' - // if there is no such a file there then we try read from 'directory2' - // we read from these directories only if they are not empty - std::wstring directory, directory2; + // directories for templates + // we start looking for files from the last directory + std::vector directories; int include_level, include_level_max;