/* * This file is a part of Winix * and is not publicly distributed * * Copyright (c) 2011-2014, Tomasz Sowa * All rights reserved. * */ #include "patterns.h" #include "core/log.h" namespace Winix { Patterns::Patterns() { utf8 = false; del_white_items = false; ezc_fun = 0; locale = 0; locale_filter = 0; } void Patterns::SetUTF8(bool _utf8) { utf8 = _utf8; } void Patterns::SetDeleteWhiteItems(bool del_white) { del_white_items = del_white; } void Patterns::SetDirectories(const std::wstring & tmpl_dir, const std::wstring & tmpl_dir_def) { templates_dir = tmpl_dir; templates_dir_def = tmpl_dir_def; } void Patterns::SetLocale(Locale * plocale) { locale = plocale; } void Patterns::SetLocaleFilter(LocaleFilter * plocale_filter) { locale_filter = plocale_filter; } void Patterns::SetEzcFunctions(TemplatesFunctions::EzcFun * fun) { ezc_fun = fun; } size_t Patterns::Add(const wchar_t * file_name, bool read_pattern) { for(size_t i=0 ; i 0 && pat_tab[i].file_name == file_name ) { pat_tab[i].references += 1; return i; } } template_temp.to_delete = false; template_temp.file_name = file_name; template_temp.references = 1; template_temp.patterns.clear(); pat_tab.push_back(template_temp); if( read_pattern ) ReadPatterns(pat_tab.back()); return pat_tab.size()-1; } size_t Patterns::Add(const std::wstring & file_name, bool read_pattern) { return Add(file_name.c_str(), read_pattern); } void Patterns::ReadPatterns(Template & templ) { size_t len = locale->Size(); templ.patterns.resize(len); for(size_t i=0 ; iFilter(templ.patterns[i], *locale, i); } } Ezc::Pattern * Patterns::Get(size_t index, size_t lang_id) { if( index >= pat_tab.size() || pat_tab[index].references == 0 ) return 0; size_t lang_index = locale->IdToIndex(lang_id); if( lang_index >= pat_tab[index].patterns.size() ) return 0; return &pat_tab[index].patterns[lang_index]; } const std::wstring & Patterns::GetFileName(size_t index) { if( index >= pat_tab.size() || pat_tab[index].references == 0 ) return empty_str; return pat_tab[index].file_name; } void Patterns::Reload() { for(size_t i=0 ; i 0 ) ReadPatterns(pat_tab[i]); } void Patterns::Clear() { pat_tab.clear(); } void Patterns::Erase(size_t index) { if( index < pat_tab.size() && pat_tab[index].references > 0 ) { pat_tab[index].references -= 1; if( pat_tab[index].references == 0 ) { log << log3 << "Patterns: removing pattern: " << pat_tab[index].file_name << logend; pat_tab[index].file_name.clear(); pat_tab[index].patterns.clear(); // don't erase pat_tab.erase() here // because indices would be invalidated // those gaps will be cleared when Clear() method is called // normally in reload/templates winix function } } } size_t Patterns::Size() { return pat_tab.size(); } } // namespace Winix