// Common/Wildcard.h #ifndef __COMMON_WILDCARD_H #define __COMMON_WILDCARD_H #include "MyString.h" int CompareFileNames(const wchar_t *s1, const wchar_t *s2) STRING_UNICODE_THROW; #ifndef USE_UNICODE_FSTRING int CompareFileNames(const char *s1, const char *s2); #endif bool IsPath1PrefixedByPath2(const wchar_t *s1, const wchar_t *s2); inline bool IsCharDirLimiter(wchar_t c) { return c == WCHAR_PATH_SEPARATOR #ifdef _WIN32 || c == L'/' #endif ; } void SplitPathToParts(const UString &path, UStringVector &pathParts); void SplitPathToParts_2(const UString &path, UString &dirPrefix, UString &name); void SplitPathToParts_Smart(const UString &path, UString &dirPrefix, UString &name); // ignores dir delimiter at the end of (path) UString ExtractDirPrefixFromPath(const UString &path); UString ExtractFileNameFromPath(const UString &path); bool DoesNameContainWildcard(const UString &path); bool DoesWildcardMatchName(const UString &mask, const UString &name); namespace NWildcard { #ifdef _WIN32 // returns true, if name is like "a:", "c:", ... bool IsDriveColonName(const wchar_t *s); #endif struct CItem { UStringVector PathParts; bool Recursive; bool ForFile; bool ForDir; bool WildcardMatching; #ifdef _WIN32 bool IsDriveItem() const { return PathParts.Size() == 1 && !ForFile && ForDir && IsDriveColonName(PathParts[0]); } #endif // CItem(): WildcardMatching(true) {} bool AreAllAllowed() const; bool CheckPath(const UStringVector &pathParts, bool isFile) const; }; class CCensorNode { CCensorNode *Parent; bool CheckPathCurrent(bool include, const UStringVector &pathParts, bool isFile) const; void AddItemSimple(bool include, CItem &item); bool CheckPathVect(const UStringVector &pathParts, bool isFile, bool &include) const; public: CCensorNode(): Parent(0) { }; CCensorNode(const UString &name, CCensorNode *parent): Parent(parent), Name(name) { }; UString Name; // wildcard is not allowed here CObjectVector SubNodes; CObjectVector IncludeItems; CObjectVector ExcludeItems; bool AreAllAllowed() const; int FindSubNode(const UString &path) const; void AddItem(bool include, CItem &item); void AddItem(bool include, const UString &path, bool recursive, bool forFile, bool forDir, bool wildcardMatching); void AddItem2(bool include, const UString &path, bool recursive, bool wildcardMatching); bool NeedCheckSubDirs() const; bool AreThereIncludeItems() const; bool CheckPath2(bool isAltStream, const UString &path, bool isFile, bool &include) const; bool CheckPath(bool isAltStream, const UString &path, bool isFile) const; bool CheckPathToRoot(bool include, UStringVector &pathParts, bool isFile) const; // bool CheckPathToRoot(const UString &path, bool isFile, bool include) const; void ExtendExclude(const CCensorNode &fromNodes); }; struct CPair { UString Prefix; CCensorNode Head; CPair(const UString &prefix): Prefix(prefix) { }; }; enum ECensorPathMode { k_RelatPath, // absolute prefix as Prefix, remain path in Tree k_FullPath, // drive prefix as Prefix, remain path in Tree k_AbsPath // full path in Tree }; struct CCensorPath { UString Path; bool Include; bool Recursive; bool WildcardMatching; CCensorPath(): Include(true), Recursive(false), WildcardMatching(true) {} }; class CCensor { int FindPrefix(const UString &prefix) const; public: CObjectVector Pairs; CObjectVector CensorPaths; bool AllAreRelative() const { return (Pairs.Size() == 1 && Pairs.Front().Prefix.IsEmpty()); } void AddItem(ECensorPathMode pathMode, bool include, const UString &path, bool recursive, bool wildcardMatching); bool CheckPath(bool isAltStream, const UString &path, bool isFile) const; void ExtendExclude(); void AddPathsToCensor(NWildcard::ECensorPathMode censorPathMode); void AddPreItem(bool include, const UString &path, bool recursive, bool wildcardMatching); void AddPreItem(const UString &path) { AddPreItem(true, path, false, false); } void AddPreItem_Wildcard() { AddPreItem(true, L"*", false, true); } }; } #endif