xref: /aosp_15_r20/external/lzma/CPP/Common/Wildcard.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Common/Wildcard.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_COMMON_WILDCARD_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_COMMON_WILDCARD_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "MyString.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker int CompareFileNames(const wchar_t *s1, const wchar_t *s2) STRING_UNICODE_THROW;
9*f6dc9357SAndroid Build Coastguard Worker #ifndef USE_UNICODE_FSTRING
10*f6dc9357SAndroid Build Coastguard Worker   int CompareFileNames(const char *s1, const char *s2);
11*f6dc9357SAndroid Build Coastguard Worker #endif
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker bool IsPath1PrefixedByPath2(const wchar_t *s1, const wchar_t *s2);
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker void SplitPathToParts(const UString &path, UStringVector &pathParts);
16*f6dc9357SAndroid Build Coastguard Worker void SplitPathToParts_2(const UString &path, UString &dirPrefix, UString &name);
17*f6dc9357SAndroid Build Coastguard Worker void SplitPathToParts_Smart(const UString &path, UString &dirPrefix, UString &name); // ignores dir delimiter at the end of (path)
18*f6dc9357SAndroid Build Coastguard Worker 
19*f6dc9357SAndroid Build Coastguard Worker UString ExtractDirPrefixFromPath(const UString &path);
20*f6dc9357SAndroid Build Coastguard Worker UString ExtractFileNameFromPath(const UString &path);
21*f6dc9357SAndroid Build Coastguard Worker 
22*f6dc9357SAndroid Build Coastguard Worker bool DoesNameContainWildcard(const UString &path);
23*f6dc9357SAndroid Build Coastguard Worker bool DoesWildcardMatchName(const UString &mask, const UString &name);
24*f6dc9357SAndroid Build Coastguard Worker 
25*f6dc9357SAndroid Build Coastguard Worker namespace NWildcard {
26*f6dc9357SAndroid Build Coastguard Worker 
27*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
28*f6dc9357SAndroid Build Coastguard Worker // returns true, if name is like "a:", "c:", ...
29*f6dc9357SAndroid Build Coastguard Worker bool IsDriveColonName(const wchar_t *s);
30*f6dc9357SAndroid Build Coastguard Worker unsigned GetNumPrefixParts_if_DrivePath(UStringVector &pathParts);
31*f6dc9357SAndroid Build Coastguard Worker #endif
32*f6dc9357SAndroid Build Coastguard Worker 
33*f6dc9357SAndroid Build Coastguard Worker struct CItem
34*f6dc9357SAndroid Build Coastguard Worker {
35*f6dc9357SAndroid Build Coastguard Worker   UStringVector PathParts;
36*f6dc9357SAndroid Build Coastguard Worker   bool Recursive;
37*f6dc9357SAndroid Build Coastguard Worker   bool ForFile;
38*f6dc9357SAndroid Build Coastguard Worker   bool ForDir;
39*f6dc9357SAndroid Build Coastguard Worker   bool WildcardMatching;
40*f6dc9357SAndroid Build Coastguard Worker 
41*f6dc9357SAndroid Build Coastguard Worker   #ifdef _WIN32
IsDriveItemCItem42*f6dc9357SAndroid Build Coastguard Worker   bool IsDriveItem() const
43*f6dc9357SAndroid Build Coastguard Worker   {
44*f6dc9357SAndroid Build Coastguard Worker     return PathParts.Size() == 1 && !ForFile && ForDir && IsDriveColonName(PathParts[0]);
45*f6dc9357SAndroid Build Coastguard Worker   }
46*f6dc9357SAndroid Build Coastguard Worker   #endif
47*f6dc9357SAndroid Build Coastguard Worker 
48*f6dc9357SAndroid Build Coastguard Worker   // CItem(): WildcardMatching(true) {}
49*f6dc9357SAndroid Build Coastguard Worker 
50*f6dc9357SAndroid Build Coastguard Worker   bool AreAllAllowed() const;
51*f6dc9357SAndroid Build Coastguard Worker   bool CheckPath(const UStringVector &pathParts, bool isFile) const;
52*f6dc9357SAndroid Build Coastguard Worker };
53*f6dc9357SAndroid Build Coastguard Worker 
54*f6dc9357SAndroid Build Coastguard Worker 
55*f6dc9357SAndroid Build Coastguard Worker 
56*f6dc9357SAndroid Build Coastguard Worker const Byte kMark_FileOrDir = 0;
57*f6dc9357SAndroid Build Coastguard Worker const Byte kMark_StrictFile = 1;
58*f6dc9357SAndroid Build Coastguard Worker const Byte kMark_StrictFile_IfWildcard = 2;
59*f6dc9357SAndroid Build Coastguard Worker 
60*f6dc9357SAndroid Build Coastguard Worker struct CCensorPathProps
61*f6dc9357SAndroid Build Coastguard Worker {
62*f6dc9357SAndroid Build Coastguard Worker   bool Recursive;
63*f6dc9357SAndroid Build Coastguard Worker   bool WildcardMatching;
64*f6dc9357SAndroid Build Coastguard Worker   Byte MarkMode;
65*f6dc9357SAndroid Build Coastguard Worker 
CCensorPathPropsCCensorPathProps66*f6dc9357SAndroid Build Coastguard Worker   CCensorPathProps():
67*f6dc9357SAndroid Build Coastguard Worker       Recursive(false),
68*f6dc9357SAndroid Build Coastguard Worker       WildcardMatching(true),
69*f6dc9357SAndroid Build Coastguard Worker       MarkMode(kMark_FileOrDir)
70*f6dc9357SAndroid Build Coastguard Worker       {}
71*f6dc9357SAndroid Build Coastguard Worker };
72*f6dc9357SAndroid Build Coastguard Worker 
73*f6dc9357SAndroid Build Coastguard Worker 
74*f6dc9357SAndroid Build Coastguard Worker class CCensorNode  MY_UNCOPYABLE
75*f6dc9357SAndroid Build Coastguard Worker {
76*f6dc9357SAndroid Build Coastguard Worker   CCensorNode *Parent;
77*f6dc9357SAndroid Build Coastguard Worker 
78*f6dc9357SAndroid Build Coastguard Worker   bool CheckPathCurrent(bool include, const UStringVector &pathParts, bool isFile) const;
79*f6dc9357SAndroid Build Coastguard Worker   void AddItemSimple(bool include, CItem &item);
80*f6dc9357SAndroid Build Coastguard Worker public:
81*f6dc9357SAndroid Build Coastguard Worker   // bool ExcludeDirItems;
82*f6dc9357SAndroid Build Coastguard Worker 
CCensorNode()83*f6dc9357SAndroid Build Coastguard Worker   CCensorNode():
84*f6dc9357SAndroid Build Coastguard Worker       Parent(NULL)
85*f6dc9357SAndroid Build Coastguard Worker       // , ExcludeDirItems(false)
86*f6dc9357SAndroid Build Coastguard Worker       {}
87*f6dc9357SAndroid Build Coastguard Worker 
CCensorNode(const UString & name,CCensorNode * parent)88*f6dc9357SAndroid Build Coastguard Worker   CCensorNode(const UString &name, CCensorNode *parent):
89*f6dc9357SAndroid Build Coastguard Worker       Parent(parent)
90*f6dc9357SAndroid Build Coastguard Worker       // , ExcludeDirItems(false)
91*f6dc9357SAndroid Build Coastguard Worker       , Name(name)
92*f6dc9357SAndroid Build Coastguard Worker       {}
93*f6dc9357SAndroid Build Coastguard Worker 
94*f6dc9357SAndroid Build Coastguard Worker   UString Name; // WIN32 doesn't support wildcards in file names
95*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CCensorNode> SubNodes;
96*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CItem> IncludeItems;
97*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CItem> ExcludeItems;
98*f6dc9357SAndroid Build Coastguard Worker 
Find_SubNode_Or_Add_New(const UString & name)99*f6dc9357SAndroid Build Coastguard Worker   CCensorNode &Find_SubNode_Or_Add_New(const UString &name)
100*f6dc9357SAndroid Build Coastguard Worker   {
101*f6dc9357SAndroid Build Coastguard Worker     int i = FindSubNode(name);
102*f6dc9357SAndroid Build Coastguard Worker     if (i >= 0)
103*f6dc9357SAndroid Build Coastguard Worker       return SubNodes[(unsigned)i];
104*f6dc9357SAndroid Build Coastguard Worker     // return SubNodes.Add(CCensorNode(name, this));
105*f6dc9357SAndroid Build Coastguard Worker     CCensorNode &node = SubNodes.AddNew();
106*f6dc9357SAndroid Build Coastguard Worker     node.Parent = this;
107*f6dc9357SAndroid Build Coastguard Worker     node.Name = name;
108*f6dc9357SAndroid Build Coastguard Worker     return node;
109*f6dc9357SAndroid Build Coastguard Worker   }
110*f6dc9357SAndroid Build Coastguard Worker 
111*f6dc9357SAndroid Build Coastguard Worker   bool AreAllAllowed() const;
112*f6dc9357SAndroid Build Coastguard Worker 
113*f6dc9357SAndroid Build Coastguard Worker   int FindSubNode(const UString &path) const;
114*f6dc9357SAndroid Build Coastguard Worker 
115*f6dc9357SAndroid Build Coastguard Worker   void AddItem(bool include, CItem &item, int ignoreWildcardIndex = -1);
116*f6dc9357SAndroid Build Coastguard Worker   // void AddItem(bool include, const UString &path, const CCensorPathProps &props);
Add_Wildcard()117*f6dc9357SAndroid Build Coastguard Worker   void Add_Wildcard()
118*f6dc9357SAndroid Build Coastguard Worker   {
119*f6dc9357SAndroid Build Coastguard Worker     CItem item;
120*f6dc9357SAndroid Build Coastguard Worker     item.PathParts.Add(L"*");
121*f6dc9357SAndroid Build Coastguard Worker     item.Recursive = false;
122*f6dc9357SAndroid Build Coastguard Worker     item.ForFile = true;
123*f6dc9357SAndroid Build Coastguard Worker     item.ForDir = true;
124*f6dc9357SAndroid Build Coastguard Worker     item.WildcardMatching = true;
125*f6dc9357SAndroid Build Coastguard Worker     AddItem(
126*f6dc9357SAndroid Build Coastguard Worker         true // include
127*f6dc9357SAndroid Build Coastguard Worker         , item);
128*f6dc9357SAndroid Build Coastguard Worker   }
129*f6dc9357SAndroid Build Coastguard Worker 
130*f6dc9357SAndroid Build Coastguard Worker   // NeedCheckSubDirs() returns true, if there are IncludeItems rules that affect items in subdirs
131*f6dc9357SAndroid Build Coastguard Worker   bool NeedCheckSubDirs() const;
132*f6dc9357SAndroid Build Coastguard Worker   bool AreThereIncludeItems() const;
133*f6dc9357SAndroid Build Coastguard Worker 
134*f6dc9357SAndroid Build Coastguard Worker   /*
135*f6dc9357SAndroid Build Coastguard Worker   CheckPathVect() doesn't check path in Parent CCensorNode
136*f6dc9357SAndroid Build Coastguard Worker   so use CheckPathVect() for root CCensorNode
137*f6dc9357SAndroid Build Coastguard Worker   OUT:
138*f6dc9357SAndroid Build Coastguard Worker     returns (true) && (include = false) - file in exlude list
139*f6dc9357SAndroid Build Coastguard Worker     returns (true) && (include = true)  - file in include list and is not in exlude list
140*f6dc9357SAndroid Build Coastguard Worker     returns (false)  - file is not in (include/exlude) list
141*f6dc9357SAndroid Build Coastguard Worker   */
142*f6dc9357SAndroid Build Coastguard Worker   bool CheckPathVect(const UStringVector &pathParts, bool isFile, bool &include) const;
143*f6dc9357SAndroid Build Coastguard Worker 
144*f6dc9357SAndroid Build Coastguard Worker   // bool CheckPath2(bool isAltStream, const UString &path, bool isFile, bool &include) const;
145*f6dc9357SAndroid Build Coastguard Worker   // bool CheckPath(bool isAltStream, const UString &path, bool isFile) const;
146*f6dc9357SAndroid Build Coastguard Worker 
147*f6dc9357SAndroid Build Coastguard Worker   // CheckPathToRoot_Change() changes pathParts !!!
148*f6dc9357SAndroid Build Coastguard Worker   bool CheckPathToRoot_Change(bool include, UStringVector &pathParts, bool isFile) const;
149*f6dc9357SAndroid Build Coastguard Worker   bool CheckPathToRoot(bool include, const UStringVector &pathParts, bool isFile) const;
150*f6dc9357SAndroid Build Coastguard Worker 
151*f6dc9357SAndroid Build Coastguard Worker   // bool CheckPathToRoot(const UString &path, bool isFile, bool include) const;
152*f6dc9357SAndroid Build Coastguard Worker   void ExtendExclude(const CCensorNode &fromNodes);
153*f6dc9357SAndroid Build Coastguard Worker };
154*f6dc9357SAndroid Build Coastguard Worker 
155*f6dc9357SAndroid Build Coastguard Worker 
156*f6dc9357SAndroid Build Coastguard Worker struct CPair  MY_UNCOPYABLE
157*f6dc9357SAndroid Build Coastguard Worker {
158*f6dc9357SAndroid Build Coastguard Worker   UString Prefix;
159*f6dc9357SAndroid Build Coastguard Worker   CCensorNode Head;
160*f6dc9357SAndroid Build Coastguard Worker 
161*f6dc9357SAndroid Build Coastguard Worker   // CPair(const UString &prefix): Prefix(prefix) { };
162*f6dc9357SAndroid Build Coastguard Worker };
163*f6dc9357SAndroid Build Coastguard Worker 
164*f6dc9357SAndroid Build Coastguard Worker 
165*f6dc9357SAndroid Build Coastguard Worker enum ECensorPathMode
166*f6dc9357SAndroid Build Coastguard Worker {
167*f6dc9357SAndroid Build Coastguard Worker   k_RelatPath,  // absolute prefix as Prefix, remain path in Tree
168*f6dc9357SAndroid Build Coastguard Worker   k_FullPath,   // drive prefix as Prefix, remain path in Tree
169*f6dc9357SAndroid Build Coastguard Worker   k_AbsPath     // full path in Tree
170*f6dc9357SAndroid Build Coastguard Worker };
171*f6dc9357SAndroid Build Coastguard Worker 
172*f6dc9357SAndroid Build Coastguard Worker 
173*f6dc9357SAndroid Build Coastguard Worker struct CCensorPath
174*f6dc9357SAndroid Build Coastguard Worker {
175*f6dc9357SAndroid Build Coastguard Worker   UString Path;
176*f6dc9357SAndroid Build Coastguard Worker   bool Include;
177*f6dc9357SAndroid Build Coastguard Worker   CCensorPathProps Props;
178*f6dc9357SAndroid Build Coastguard Worker 
CCensorPathCCensorPath179*f6dc9357SAndroid Build Coastguard Worker   CCensorPath():
180*f6dc9357SAndroid Build Coastguard Worker       Include(true)
181*f6dc9357SAndroid Build Coastguard Worker       {}
182*f6dc9357SAndroid Build Coastguard Worker };
183*f6dc9357SAndroid Build Coastguard Worker 
184*f6dc9357SAndroid Build Coastguard Worker 
185*f6dc9357SAndroid Build Coastguard Worker class CCensor  MY_UNCOPYABLE
186*f6dc9357SAndroid Build Coastguard Worker {
187*f6dc9357SAndroid Build Coastguard Worker   int FindPairForPrefix(const UString &prefix) const;
188*f6dc9357SAndroid Build Coastguard Worker public:
189*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CPair> Pairs;
190*f6dc9357SAndroid Build Coastguard Worker 
191*f6dc9357SAndroid Build Coastguard Worker   bool ExcludeDirItems;
192*f6dc9357SAndroid Build Coastguard Worker   bool ExcludeFileItems;
193*f6dc9357SAndroid Build Coastguard Worker 
CCensor()194*f6dc9357SAndroid Build Coastguard Worker   CCensor():
195*f6dc9357SAndroid Build Coastguard Worker       ExcludeDirItems(false),
196*f6dc9357SAndroid Build Coastguard Worker       ExcludeFileItems(false)
197*f6dc9357SAndroid Build Coastguard Worker       {}
198*f6dc9357SAndroid Build Coastguard Worker 
199*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<NWildcard::CCensorPath> CensorPaths;
200*f6dc9357SAndroid Build Coastguard Worker 
AllAreRelative()201*f6dc9357SAndroid Build Coastguard Worker   bool AllAreRelative() const
202*f6dc9357SAndroid Build Coastguard Worker     { return (Pairs.Size() == 1 && Pairs.Front().Prefix.IsEmpty()); }
203*f6dc9357SAndroid Build Coastguard Worker 
204*f6dc9357SAndroid Build Coastguard Worker   void AddItem(ECensorPathMode pathMode, bool include, const UString &path, const CCensorPathProps &props);
205*f6dc9357SAndroid Build Coastguard Worker   // bool CheckPath(bool isAltStream, const UString &path, bool isFile) const;
206*f6dc9357SAndroid Build Coastguard Worker   void ExtendExclude();
207*f6dc9357SAndroid Build Coastguard Worker 
208*f6dc9357SAndroid Build Coastguard Worker   void AddPathsToCensor(NWildcard::ECensorPathMode censorPathMode);
209*f6dc9357SAndroid Build Coastguard Worker   void AddPreItem(bool include, const UString &path, const CCensorPathProps &props);
210*f6dc9357SAndroid Build Coastguard Worker 
AddPreItem_NoWildcard(const UString & path)211*f6dc9357SAndroid Build Coastguard Worker   void AddPreItem_NoWildcard(const UString &path)
212*f6dc9357SAndroid Build Coastguard Worker   {
213*f6dc9357SAndroid Build Coastguard Worker     CCensorPathProps props;
214*f6dc9357SAndroid Build Coastguard Worker     props.WildcardMatching = false;
215*f6dc9357SAndroid Build Coastguard Worker     AddPreItem(
216*f6dc9357SAndroid Build Coastguard Worker         true,  // include
217*f6dc9357SAndroid Build Coastguard Worker         path, props);
218*f6dc9357SAndroid Build Coastguard Worker   }
AddPreItem_Wildcard()219*f6dc9357SAndroid Build Coastguard Worker   void AddPreItem_Wildcard()
220*f6dc9357SAndroid Build Coastguard Worker   {
221*f6dc9357SAndroid Build Coastguard Worker     CCensorPathProps props;
222*f6dc9357SAndroid Build Coastguard Worker     // props.WildcardMatching = true;
223*f6dc9357SAndroid Build Coastguard Worker     AddPreItem(
224*f6dc9357SAndroid Build Coastguard Worker         true,  // include
225*f6dc9357SAndroid Build Coastguard Worker         UString("*"), props);
226*f6dc9357SAndroid Build Coastguard Worker   }
227*f6dc9357SAndroid Build Coastguard Worker };
228*f6dc9357SAndroid Build Coastguard Worker 
229*f6dc9357SAndroid Build Coastguard Worker }
230*f6dc9357SAndroid Build Coastguard Worker 
231*f6dc9357SAndroid Build Coastguard Worker #endif
232