// ----------------------------------------------------------------------------- // Returns the namespace of the entry at [index] within [dir] // ----------------------------------------------------------------------------- string Archive::detectNamespace(size_t index, ArchiveTreeNode* dir) { if (dir && index < dir->numEntries()) return detectNamespace(dir->entryAt(index)); return "global"; }
/* DatArchive::detectNamespace * Returns the namespace that [entry] is within *******************************************************************/ string DatArchive::detectNamespace(ArchiveEntry* entry) { return detectNamespace(entryIndex(entry)); }
/* Archive::findAll * Returns a list of entries matching the search criteria in * [options] *******************************************************************/ vector<ArchiveEntry*> Archive::findAll(search_options_t& options) { // Init search variables ArchiveTreeNode* dir = options.dir; if (!dir) dir = dir_root; vector<ArchiveEntry*> ret; options.match_name.MakeLower(); // Force case-insensitive // Begin search // Search entries for (unsigned a = 0; a < dir->numEntries(); a++) { ArchiveEntry* entry = dir->getEntry(a); // Check type if (options.match_type) { if (entry->getType() == EntryType::unknownType()) { if (!options.match_type->isThisType(entry)) continue; } else if (options.match_type != entry->getType()) continue; } // Check name if (!options.match_name.IsEmpty()) { // Cut extension if ignoring wxFileName fn(entry->getName()); if (options.ignore_ext) { if (!fn.GetName().MakeLower().Matches(options.match_name)) continue; } else if (!fn.GetFullName().MakeLower().Matches(options.match_name)) continue; } // Check namespace if (!options.match_namespace.IsEmpty()) { if (!(S_CMPNOCASE(detectNamespace(entry), options.match_namespace))) continue; } // Entry passed all checks so far, so we found a match ret.push_back(entry); } // Search subdirectories (if needed) if (options.search_subdirs) { for (unsigned a = 0; a < dir->nChildren(); a++) { search_options_t opt = options; opt.dir = (ArchiveTreeNode*)dir->getChild(a); // Add any matches to the list vector<ArchiveEntry*> vec = findAll(opt); ret.insert(ret.end(), vec.begin(), vec.end()); } } // Return matches return ret; }
/* Archive::findLast * Returns the last entry matching the search criteria in [options], * or NULL if no matching entry was found *******************************************************************/ ArchiveEntry* Archive::findLast(search_options_t& options) { // Init search variables ArchiveTreeNode* dir = options.dir; if (!dir) dir = dir_root; options.match_name.MakeLower(); // Force case-insensitive // Begin search // Search subdirectories (if needed) (bottom-up) if (options.search_subdirs) { for (int a = dir->nChildren() - 1; a >= 0; a--) { search_options_t opt = options; opt.dir = (ArchiveTreeNode*)dir->getChild(a); ArchiveEntry* match = findLast(opt); // If a match was found in this subdir, return it if (match) return match; } } // Search entries (bottom-up) for (int a = dir->numEntries() - 1; a >= 0; a--) { ArchiveEntry* entry = dir->getEntry(a); // Check type if (options.match_type) { if (entry->getType() == EntryType::unknownType()) { if (!options.match_type->isThisType(entry)) continue; } else if (options.match_type != entry->getType()) continue; } // Check name if (!options.match_name.IsEmpty()) { // Cut extension if ignoring wxFileName fn(entry->getName()); if (options.ignore_ext) { if (!options.match_name.Matches(fn.GetName().MakeLower())) continue; } else if (!options.match_name.Matches(fn.GetFullName().MakeLower())) continue; } // Check namespace if (!options.match_namespace.IsEmpty()) { if (!(S_CMPNOCASE(detectNamespace(entry), options.match_namespace))) continue; } // Entry passed all checks so far, so we found a match return entry; } // No matches found return NULL; }
// ----------------------------------------------------------------------------- // Returns a list of entries matching the search criteria in [options] // ----------------------------------------------------------------------------- vector<ArchiveEntry*> Archive::findAll(SearchOptions& options) { // Init search variables auto dir = options.dir; if (!dir) dir = &dir_root_; vector<ArchiveEntry*> ret; StrUtil::upperIP(options.match_name); // Force case-insensitive // Begin search // Search entries for (unsigned a = 0; a < dir->numEntries(); a++) { auto entry = dir->entryAt(a); // Check type if (options.match_type) { if (entry->type() == EntryType::unknownType()) { if (!options.match_type->isThisType(entry)) continue; } else if (options.match_type != entry->type()) continue; } // Check name if (!options.match_name.empty()) { // Cut extension if ignoring auto check_name = options.ignore_ext ? entry->upperNameNoExt() : entry->upperName(); if (!StrUtil::matches(check_name, options.match_name)) continue; } // Check namespace if (!options.match_namespace.empty()) { if (!StrUtil::equalCI(detectNamespace(entry), options.match_namespace)) continue; } // Entry passed all checks so far, so we found a match ret.push_back(entry); } // Search subdirectories (if needed) if (options.search_subdirs) { for (unsigned a = 0; a < dir->nChildren(); a++) { auto opt = options; opt.dir = (ArchiveTreeNode*)dir->child(a); // Add any matches to the list auto vec = findAll(opt); ret.insert(ret.end(), vec.begin(), vec.end()); } } // Return matches return ret; }
// ----------------------------------------------------------------------------- // Returns the last entry matching the search criteria in [options], or null if // no matching entry was found // ----------------------------------------------------------------------------- ArchiveEntry* Archive::findLast(SearchOptions& options) { // Init search variables auto dir = options.dir; if (!dir) dir = &dir_root_; StrUtil::upperIP(options.match_name); // Force case-insensitive // Begin search // Search entries (bottom-up) for (int a = dir->numEntries() - 1; a >= 0; a--) { auto entry = dir->entryAt(a); // Check type if (options.match_type) { if (entry->type() == EntryType::unknownType()) { if (!options.match_type->isThisType(entry)) continue; } else if (options.match_type != entry->type()) continue; } // Check name if (!options.match_name.empty()) { // Cut extension if ignoring auto check_name = options.ignore_ext ? entry->upperNameNoExt() : entry->upperName(); if (!StrUtil::matches(check_name, options.match_name)) continue; } // Check namespace if (!options.match_namespace.empty()) { if (!StrUtil::equalCI(detectNamespace(entry), options.match_namespace)) continue; } // Entry passed all checks so far, so we found a match return entry; } // Search subdirectories (if needed) (bottom-up) if (options.search_subdirs) { for (int a = dir->nChildren() - 1; a >= 0; a--) { auto opt = options; opt.dir = (ArchiveTreeNode*)dir->child(a); auto match = findLast(opt); // If a match was found in this subdir, return it if (match) return match; } } // No matches found return nullptr; }