diff options
Diffstat (limited to 'src/libs/7zip/win/CPP/Common/Wildcard.cpp')
-rw-r--r-- | src/libs/7zip/win/CPP/Common/Wildcard.cpp | 615 |
1 files changed, 0 insertions, 615 deletions
diff --git a/src/libs/7zip/win/CPP/Common/Wildcard.cpp b/src/libs/7zip/win/CPP/Common/Wildcard.cpp deleted file mode 100644 index e88a1cf1c..000000000 --- a/src/libs/7zip/win/CPP/Common/Wildcard.cpp +++ /dev/null @@ -1,615 +0,0 @@ -// Common/Wildcard.cpp - -#include "StdAfx.h" - -#include "Wildcard.h" - -bool g_CaseSensitive = - #ifdef _WIN32 - false; - #else - true; - #endif - - -bool IsPath1PrefixedByPath2(const wchar_t *s1, const wchar_t *s2) -{ - if (g_CaseSensitive) - { - for (;;) - { - wchar_t c2 = *s2++; if (c2 == 0) return true; - wchar_t c1 = *s1++; - if (MyCharUpper(c1) != - MyCharUpper(c2)) - return false; - } - } - - for (;;) - { - wchar_t c2 = *s2++; if (c2 == 0) return true; - wchar_t c1 = *s1++; if (c1 != c2) return false; - } -} - -int CompareFileNames(const wchar_t *s1, const wchar_t *s2) STRING_UNICODE_THROW -{ - if (g_CaseSensitive) - return wcscmp(s1, s2); - return MyStringCompareNoCase(s1, s2); -} - -#ifndef USE_UNICODE_FSTRING -int CompareFileNames(const char *s1, const char *s2) -{ - if (g_CaseSensitive) - return wcscmp(fs2us(s1), fs2us(s2)); - return MyStringCompareNoCase(fs2us(s1), fs2us(s2)); -} -#endif - -// ----------------------------------------- -// this function compares name with mask -// ? - any char -// * - any char or empty - -static bool EnhancedMaskTest(const wchar_t *mask, const wchar_t *name) -{ - for (;;) - { - wchar_t m = *mask; - wchar_t c = *name; - if (m == 0) - return (c == 0); - if (m == '*') - { - if (EnhancedMaskTest(mask + 1, name)) - return true; - if (c == 0) - return false; - } - else - { - if (m == '?') - { - if (c == 0) - return false; - } - else if (m != c) - if (g_CaseSensitive || MyCharUpper(m) != MyCharUpper(c)) - return false; - mask++; - } - name++; - } -} - -// -------------------------------------------------- -// Splits path to strings - -void SplitPathToParts(const UString &path, UStringVector &pathParts) -{ - pathParts.Clear(); - unsigned len = path.Len(); - if (len == 0) - return; - UString name; - unsigned prev = 0; - for (unsigned i = 0; i < len; i++) - if (IsCharDirLimiter(path[i])) - { - name.SetFrom(path.Ptr(prev), i - prev); - pathParts.Add(name); - prev = i + 1; - } - name.SetFrom(path.Ptr(prev), len - prev); - pathParts.Add(name); -} - -void SplitPathToParts_2(const UString &path, UString &dirPrefix, UString &name) -{ - const wchar_t *start = path; - const wchar_t *p = start + path.Len(); - for (; p != start; p--) - if (IsCharDirLimiter(*(p - 1))) - break; - dirPrefix.SetFrom(path, (unsigned)(p - start)); - name = p; -} - -void SplitPathToParts_Smart(const UString &path, UString &dirPrefix, UString &name) -{ - const wchar_t *start = path; - const wchar_t *p = start + path.Len(); - if (p != start) - { - if (IsCharDirLimiter(*(p - 1))) - p--; - for (; p != start; p--) - if (IsCharDirLimiter(*(p - 1))) - break; - } - dirPrefix.SetFrom(path, (unsigned)(p - start)); - name = p; -} - -UString ExtractDirPrefixFromPath(const UString &path) -{ - const wchar_t *start = path; - const wchar_t *p = start + path.Len(); - for (; p != start; p--) - if (IsCharDirLimiter(*(p - 1))) - break; - return path.Left((unsigned)(p - start)); -} - -UString ExtractFileNameFromPath(const UString &path) -{ - const wchar_t *start = path; - const wchar_t *p = start + path.Len(); - for (; p != start; p--) - if (IsCharDirLimiter(*(p - 1))) - break; - return p; -} - - -bool DoesWildcardMatchName(const UString &mask, const UString &name) -{ - return EnhancedMaskTest(mask, name); -} - -bool DoesNameContainWildcard(const UString &path) -{ - for (unsigned i = 0; i < path.Len(); i++) - { - wchar_t c = path[i]; - if (c == '*' || c == '?') - return true; - } - return false; -} - - -// ----------------------------------------------------------' -// NWildcard - -namespace NWildcard { - - -#ifdef _WIN32 -bool IsDriveColonName(const wchar_t *s) -{ - wchar_t c = s[0]; - return c != 0 && s[1] == ':' && s[2] == 0 && (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z'); -} -#endif - -/* - -M = MaskParts.Size(); -N = TestNameParts.Size(); - - File Dir -ForFile rec M<=N [N-M, N) - -!ForDir nonrec M=N [0, M) - - -ForDir rec M<N [0, M) ... [N-M-1, N-1) same as ForBoth-File -!ForFile nonrec [0, M) same as ForBoth-File - -ForFile rec m<=N [0, M) ... [N-M, N) same as ForBoth-File -ForDir nonrec [0, M) same as ForBoth-File - -*/ - -bool CItem::AreAllAllowed() const -{ - return ForFile && ForDir && WildcardMatching && PathParts.Size() == 1 && PathParts.Front() == L"*"; -} - -bool CItem::CheckPath(const UStringVector &pathParts, bool isFile) const -{ - if (!isFile && !ForDir) - return false; - int delta = (int)pathParts.Size() - (int)PathParts.Size(); - if (delta < 0) - return false; - int start = 0; - int finish = 0; - - if (isFile) - { - if (!ForDir) - { - if (Recursive) - start = delta; - else if (delta !=0) - return false; - } - if (!ForFile && delta == 0) - return false; - } - - if (Recursive) - { - finish = delta; - if (isFile && !ForFile) - finish = delta - 1; - } - - for (int d = start; d <= finish; d++) - { - unsigned i; - for (i = 0; i < PathParts.Size(); i++) - { - if (WildcardMatching) - { - if (!DoesWildcardMatchName(PathParts[i], pathParts[i + d])) - break; - } - else - { - if (CompareFileNames(PathParts[i], pathParts[i + d]) != 0) - break; - } - } - if (i == PathParts.Size()) - return true; - } - return false; -} - -bool CCensorNode::AreAllAllowed() const -{ - if (!Name.IsEmpty() || - !SubNodes.IsEmpty() || - !ExcludeItems.IsEmpty() || - IncludeItems.Size() != 1) - return false; - return IncludeItems.Front().AreAllAllowed(); -} - -int CCensorNode::FindSubNode(const UString &name) const -{ - FOR_VECTOR (i, SubNodes) - if (CompareFileNames(SubNodes[i].Name, name) == 0) - return i; - return -1; -} - -void CCensorNode::AddItemSimple(bool include, CItem &item) -{ - if (include) - IncludeItems.Add(item); - else - ExcludeItems.Add(item); -} - -void CCensorNode::AddItem(bool include, CItem &item) -{ - if (item.PathParts.Size() <= 1) - { - if (item.PathParts.Size() != 0 && item.WildcardMatching) - { - if (!DoesNameContainWildcard(item.PathParts.Front())) - item.WildcardMatching = false; - } - AddItemSimple(include, item); - return; - } - const UString &front = item.PathParts.Front(); - - // We can't ignore wildcard, since we don't allow wildcard in SubNodes[].Name - // if (item.Wildcard) - if (DoesNameContainWildcard(front)) - { - AddItemSimple(include, item); - return; - } - int index = FindSubNode(front); - if (index < 0) - index = SubNodes.Add(CCensorNode(front, this)); - item.PathParts.Delete(0); - SubNodes[index].AddItem(include, item); -} - -void CCensorNode::AddItem(bool include, const UString &path, bool recursive, bool forFile, bool forDir, bool wildcardMatching) -{ - CItem item; - SplitPathToParts(path, item.PathParts); - item.Recursive = recursive; - item.ForFile = forFile; - item.ForDir = forDir; - item.WildcardMatching = wildcardMatching; - AddItem(include, item); -} - -bool CCensorNode::NeedCheckSubDirs() const -{ - FOR_VECTOR (i, IncludeItems) - { - const CItem &item = IncludeItems[i]; - if (item.Recursive || item.PathParts.Size() > 1) - return true; - } - return false; -} - -bool CCensorNode::AreThereIncludeItems() const -{ - if (IncludeItems.Size() > 0) - return true; - FOR_VECTOR (i, SubNodes) - if (SubNodes[i].AreThereIncludeItems()) - return true; - return false; -} - -bool CCensorNode::CheckPathCurrent(bool include, const UStringVector &pathParts, bool isFile) const -{ - const CObjectVector<CItem> &items = include ? IncludeItems : ExcludeItems; - FOR_VECTOR (i, items) - if (items[i].CheckPath(pathParts, isFile)) - return true; - return false; -} - -bool CCensorNode::CheckPathVect(const UStringVector &pathParts, bool isFile, bool &include) const -{ - if (CheckPathCurrent(false, pathParts, isFile)) - { - include = false; - return true; - } - include = true; - bool finded = CheckPathCurrent(true, pathParts, isFile); - if (pathParts.Size() <= 1) - return finded; - int index = FindSubNode(pathParts.Front()); - if (index >= 0) - { - UStringVector pathParts2 = pathParts; - pathParts2.Delete(0); - if (SubNodes[index].CheckPathVect(pathParts2, isFile, include)) - return true; - } - return finded; -} - -bool CCensorNode::CheckPath2(bool isAltStream, const UString &path, bool isFile, bool &include) const -{ - UStringVector pathParts; - SplitPathToParts(path, pathParts); - if (CheckPathVect(pathParts, isFile, include)) - { - if (!include || !isAltStream) - return true; - } - if (isAltStream && !pathParts.IsEmpty()) - { - UString &back = pathParts.Back(); - int pos = back.Find(L':'); - if (pos > 0) - { - back.DeleteFrom(pos); - return CheckPathVect(pathParts, isFile, include); - } - } - return false; -} - -bool CCensorNode::CheckPath(bool isAltStream, const UString &path, bool isFile) const -{ - bool include; - if (CheckPath2(isAltStream, path, isFile, include)) - return include; - return false; -} - -bool CCensorNode::CheckPathToRoot(bool include, UStringVector &pathParts, bool isFile) const -{ - if (CheckPathCurrent(include, pathParts, isFile)) - return true; - if (Parent == 0) - return false; - pathParts.Insert(0, Name); - return Parent->CheckPathToRoot(include, pathParts, isFile); -} - -/* -bool CCensorNode::CheckPathToRoot(bool include, const UString &path, bool isFile) const -{ - UStringVector pathParts; - SplitPathToParts(path, pathParts); - return CheckPathToRoot(include, pathParts, isFile); -} -*/ - -void CCensorNode::AddItem2(bool include, const UString &path, bool recursive, bool wildcardMatching) -{ - if (path.IsEmpty()) - return; - bool forFile = true; - bool forFolder = true; - UString path2 = path; - if (IsCharDirLimiter(path.Back())) - { - path2.DeleteBack(); - forFile = false; - } - AddItem(include, path2, recursive, forFile, forFolder, wildcardMatching); -} - -void CCensorNode::ExtendExclude(const CCensorNode &fromNodes) -{ - ExcludeItems += fromNodes.ExcludeItems; - FOR_VECTOR (i, fromNodes.SubNodes) - { - const CCensorNode &node = fromNodes.SubNodes[i]; - int subNodeIndex = FindSubNode(node.Name); - if (subNodeIndex < 0) - subNodeIndex = SubNodes.Add(CCensorNode(node.Name, this)); - SubNodes[subNodeIndex].ExtendExclude(node); - } -} - -int CCensor::FindPrefix(const UString &prefix) const -{ - FOR_VECTOR (i, Pairs) - if (CompareFileNames(Pairs[i].Prefix, prefix) == 0) - return i; - return -1; -} - -void CCensor::AddItem(ECensorPathMode pathMode, bool include, const UString &path, bool recursive, bool wildcardMatching) -{ - UStringVector pathParts; - if (path.IsEmpty()) - throw "Empty file path"; - SplitPathToParts(path, pathParts); - bool forFile = true; - if (pathParts.Back().IsEmpty()) - { - forFile = false; - pathParts.DeleteBack(); - } - - UString prefix; - - if (pathMode != k_AbsPath) - { - const UString &front = pathParts.Front(); - bool isAbs = false; - - if (front.IsEmpty()) - isAbs = true; - else - { - #ifdef _WIN32 - - if (IsDriveColonName(front)) - isAbs = true; - else - - #endif - - FOR_VECTOR (i, pathParts) - { - const UString &part = pathParts[i]; - if (part == L".." || part == L".") - { - isAbs = true; - break; - } - } - } - - unsigned numAbsParts = 0; - if (isAbs) - if (pathParts.Size() > 1) - numAbsParts = pathParts.Size() - 1; - else - numAbsParts = 1; - - #ifdef _WIN32 - - // \\?\ case - if (numAbsParts >= 3) - { - if (pathParts[0].IsEmpty() && - pathParts[1].IsEmpty() && - pathParts[2] == L"?") - { - prefix = - WSTRING_PATH_SEPARATOR - WSTRING_PATH_SEPARATOR L"?" - WSTRING_PATH_SEPARATOR; - numAbsParts -= 3; - pathParts.DeleteFrontal(3); - } - } - - #endif - - if (numAbsParts > 1 && pathMode == k_FullPath) - numAbsParts = 1; - - // We can't ignore wildcard, since we don't allow wildcard in SubNodes[].Name - // if (wildcardMatching) - for (unsigned i = 0; i < numAbsParts; i++) - { - { - const UString &front = pathParts.Front(); - if (DoesNameContainWildcard(front)) - break; - prefix += front; - prefix += WCHAR_PATH_SEPARATOR; - } - pathParts.Delete(0); - } - } - - int index = FindPrefix(prefix); - if (index < 0) - index = Pairs.Add(CPair(prefix)); - - CItem item; - item.PathParts = pathParts; - item.ForDir = true; - item.ForFile = forFile; - item.Recursive = recursive; - item.WildcardMatching = wildcardMatching; - Pairs[index].Head.AddItem(include, item); -} - -bool CCensor::CheckPath(bool isAltStream, const UString &path, bool isFile) const -{ - bool finded = false; - FOR_VECTOR (i, Pairs) - { - bool include; - if (Pairs[i].Head.CheckPath2(isAltStream, path, isFile, include)) - { - if (!include) - return false; - finded = true; - } - } - return finded; -} - -void CCensor::ExtendExclude() -{ - unsigned i; - for (i = 0; i < Pairs.Size(); i++) - if (Pairs[i].Prefix.IsEmpty()) - break; - if (i == Pairs.Size()) - return; - unsigned index = i; - for (i = 0; i < Pairs.Size(); i++) - if (index != i) - Pairs[i].Head.ExtendExclude(Pairs[index].Head); -} - -void CCensor::AddPathsToCensor(ECensorPathMode censorPathMode) -{ - FOR_VECTOR(i, CensorPaths) - { - const CCensorPath &cp = CensorPaths[i]; - AddItem(censorPathMode, cp.Include, cp.Path, cp.Recursive, cp.WildcardMatching); - } - CensorPaths.Clear(); -} - -void CCensor::AddPreItem(bool include, const UString &path, bool recursive, bool wildcardMatching) -{ - CCensorPath &cp = CensorPaths.AddNew(); - cp.Path = path; - cp.Include = include; - cp.Recursive = recursive; - cp.WildcardMatching = wildcardMatching; -} - -} |