Ticket #4014: patch_match_v2.patch

File patch_match_v2.patch, 1.4 KB (added by lordhoto, 15 years ago)

Patch against r35157.

  • common/archive.cpp

     
    234234        _cached = true;
    235235}
    236236
     237bool matchPath(const char *str, const char *pat) {
     238        assert(str);
     239        assert(pat);
     240
     241        const char *p = 0;
     242        const char *q = 0;
     243
     244        for (;;) {
     245                if (*str == '/') {
     246                        p = 0;
     247                        q = 0;
     248                }
     249
     250                switch (*pat) {
     251                case '*':
     252                        // Record pattern / string possition for backtracking
     253                        p = ++pat;
     254                        q = str;
     255                        // If pattern ended with * -> match
     256                        if (!*pat)
     257                                return true;
     258                        break;
     259
     260                default:
     261                        if (*pat != *str) {
     262                                if (p) {
     263                                        // No match, oops -> try to backtrack
     264                                        pat = p;
     265                                        str = ++q;
     266                                        if (!*str)
     267                                                return !*pat;
     268                                        break;
     269                                }
     270                                else
     271                                        return false;
     272                        }
     273                        if (!*str)
     274                                return !*pat;
     275                        pat++;
     276                        str++;
     277                        break;
     278
     279                case '?':
     280                        if (!*str || *str == '/')
     281                                return !*pat;
     282                        pat++;
     283                        str++;
     284                }
     285        }
     286}
     287
    237288int FSDirectory::listMatchingMembers(ArchiveMemberList &list, const String &pattern) {
    238289        if (!_node.isDirectory())
    239290                return 0;
     
    247298        int matches = 0;
    248299        NodeCache::iterator it = _fileCache.begin();
    249300        for ( ; it != _fileCache.end(); it++) {
    250                 if (it->_key.matchString(lowercasePattern)) {
     301                if (matchPath(it->_key.c_str(), lowercasePattern.c_str())) {
    251302                        list.push_back(ArchiveMemberPtr(new FSDirectoryMember(it->_value)));
    252303                        matches++;
    253304                }