diff --git a/doomsday/engine/include/filesys/fs_util.h b/doomsday/engine/include/filesys/fs_util.h index 9be9600f42..aed2d4a595 100644 --- a/doomsday/engine/include/filesys/fs_util.h +++ b/doomsday/engine/include/filesys/fs_util.h @@ -170,14 +170,6 @@ boolean F_TranslatePath(ddstring_t* dst, const ddstring_t* src); */ const char* F_PrettyPath(const char* path); -/** - * This is a case-insensitive test. - * I do hope this algorithm works like it should... - * - * @return @c true, if @a filePath matches the pattern. - */ -int F_MatchFileName(const char* filePath, const char* pattern); - /** * Write the data associated with the specified lump index to @a fileName. * @@ -207,6 +199,20 @@ boolean F_Dump(void const* data, size_t size, char const* path); #ifdef __cplusplus } // extern "C" + +#include + +/** + * Performs a case-insensitive pattern match. The pattern can contain + * wildcards. + * + * @param filePath Path to match. + * @param pattern Pattern with * and ? as wildcards. + * + * @return @c true, if @a filePath matches the pattern. + */ +bool F_MatchFileName(QChar const *filePath, QChar const *pattern); + #endif #endif /// LIBDENG_FILESYS_UTIL_H diff --git a/doomsday/engine/src/filesys/fs_main.cpp b/doomsday/engine/src/filesys/fs_main.cpp index bbb50e0621..231a006392 100644 --- a/doomsday/engine/src/filesys/fs_main.cpp +++ b/doomsday/engine/src/filesys/fs_main.cpp @@ -804,7 +804,6 @@ int FS1::findAllPaths(String searchPattern, int flags, FS1::PathList& found) } de::Uri patternMap = de::Uri(searchPattern, RC_NULL); - QByteArray searchPatternUtf8 = searchPattern.toUtf8(); /* * Check the Zip directory. @@ -819,8 +818,7 @@ int FS1::findAllPaths(String searchPattern, int flags, FS1::PathList& found) if(!(flags & SearchPath::NoDescend)) { filePath = new String(lump.composePath()); - QByteArray filePathUtf8 = filePath->toUtf8(); - patternMatched = F_MatchFileName(filePathUtf8.constData(), searchPatternUtf8.constData()); + patternMatched = F_MatchFileName(filePath->constData(), searchPattern.constData()); } else { @@ -847,7 +845,7 @@ int FS1::findAllPaths(String searchPattern, int flags, FS1::PathList& found) { DENG2_FOR_EACH_CONST(LumpMappings, i, d->lumpMappings) { - if(!F_MatchFileName(i->first.toUtf8().constData(), searchPatternUtf8.constData())) continue; + if(!F_MatchFileName(i->first.constData(), searchPattern.constData())) continue; found.push_back(PathListItem(i->first, 0 /*only filepaths (i.e., leaves) can be mapped to lumps*/)); } @@ -888,8 +886,7 @@ int FS1::findAllPaths(String searchPattern, int flags, FS1::PathList& found) if(Str_Compare(&fd.name, ".") && Str_Compare(&fd.name, "..")) { String foundPath = searchDirectory / NativePath(Str_Text(&fd.name)).withSeparators('/'); - QByteArray foundPathUtf8 = foundPath.toUtf8(); - if(!F_MatchFileName(foundPathUtf8.constData(), searchPatternUtf8.constData())) continue; + if(!F_MatchFileName(foundPath.constData(), searchPattern.constData())) continue; nativeFilePaths.push_back(PathListItem(foundPath, fd.attrib)); } diff --git a/doomsday/engine/src/filesys/fs_util.cpp b/doomsday/engine/src/filesys/fs_util.cpp index e4dfc08f8f..d6214d1d2a 100644 --- a/doomsday/engine/src/filesys/fs_util.cpp +++ b/doomsday/engine/src/filesys/fs_util.cpp @@ -622,22 +622,25 @@ const char* F_PrettyPath(const char* path) #undef NUM_BUFS } -int F_MatchFileName(const char* string, const char* pattern) +bool F_MatchFileName(QChar const *string, QChar const *pattern) { - const char* in = string, *st = pattern; + static QChar const ASTERISK('*'); + static QChar const QUESTION_MARK('?'); - while(*in) + QChar const *in = string, *st = pattern; + + while(!in->isNull()) { - if(*st == '*') + if(*st == ASTERISK) { st++; continue; } - if(*st != '?' && (tolower((unsigned char) *st) != tolower((unsigned char) *in))) + if(*st != QUESTION_MARK && st->toLower() != in->toLower()) { // A mismatch. Hmm. Go back to a previous '*'. - while(st >= pattern && *st != '*') + while(st >= pattern && *st != ASTERISK) st--; if(st < pattern) return false; // No match! @@ -650,10 +653,10 @@ int F_MatchFileName(const char* string, const char* pattern) } // Match is good if the end of the pattern was reached. - while(*st == '*') + while(*st == ASTERISK) st++; // Skip remaining asterisks. - return *st == 0; + return st->isNull(); } boolean F_Dump(void const* data, size_t size, char const* path)