OSDN Git Service

An attempt to reduce build time
[winmerge-jp/winmerge-jp.git] / Src / FileFilter.h
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /** 
3  * @file  FileFilter.h
4  *
5  * @brief Declaration file for FileFilter
6  */
7 #pragma once
8
9 #include <vector>
10 #include <memory>
11 #define POCO_NO_UNWINDOWS 1
12 #include <Poco/RegularExpression.h>
13 #include "UnicodeString.h"
14
15 /**
16  * @brief FileFilter rule.
17  *
18  * Contains one filtering element definition (rule). In addition to
19  * regular expression there is boolean value for defining if rule
20  * is inclusive or exclusive. File filters have global inclusive/exclusive
21  * selection but this per-rule setting overwrites it.
22  *
23  * We are using PCRE for regular expressions and pRegExp points to compiled
24  * regular expression. pRegExpExtra contains additional information about
25  * the expression used to optimize matching.
26  */
27 struct FileFilterElement
28 {
29         Poco::RegularExpression regexp; /**< Compiled regular expression */
30         std::string _regex; /**< Regular expression string to set to Poco::RegularExpression */
31         int _reOpts; /**< Options to set to Poco::RegularExpression */
32         bool _fileNameOnly; /**< If true, indicates that the filter matches only filenames */
33         FileFilterElement(const std::string& regex, int reOpts, bool fileFilter) :
34                 regexp(regex, reOpts), _regex(regex), _reOpts(reOpts), _fileNameOnly(fileFilter && regex.find("\\\\", 0) == String::npos && regex.find_first_of(":/") == String::npos)
35         {
36         }
37         FileFilterElement(const FileFilterElement* element) :
38                 regexp(element->_regex, element->_reOpts), _regex(element->_regex), _reOpts(element->_reOpts), _fileNameOnly(element->_fileNameOnly)
39         {
40         }
41 };
42
43 typedef std::shared_ptr<FileFilterElement> FileFilterElementPtr;
44
45 /**
46  * @brief One actual filter.
47  *
48  * For example, this might be a GNU C filter, excluding *.o files and CVS
49  * directories. That is to say, a filter is a set of file masks and
50  * directory masks. Usually FileFilter contains rules from one filter
51  * definition file. So it can be thought as filter file contents.
52  * @sa FileFilterList
53  */
54 struct FileFilter
55 {
56         bool default_include;   /**< If true, filter rules are inclusive by default */
57         String name;                    /**< Filter name (shown in UI) */
58         String description;     /**< Filter description text */
59         String fullpath;                /**< Full path to filter file */
60         std::vector<FileFilterElementPtr> filefilters; /**< List of rules for files */
61         std::vector<FileFilterElementPtr> filefiltersExclude; /**< List of rules for files (exclude) */
62         std::vector<FileFilterElementPtr> dirfilters;  /**< List of rules for directories */
63         std::vector<FileFilterElementPtr> dirfiltersExclude;  /**< List of rules for directories (exclude) */
64         FileFilter() : default_include(true) { }
65         ~FileFilter();
66         
67         static void EmptyFilterList(std::vector<FileFilterElementPtr> *filterList);
68         void CloneFrom(const FileFilter* filter);
69 };
70
71 typedef std::shared_ptr<FileFilter> FileFilterPtr;