From 098821e35d2cc94b3ddd30b7a4e98695a1c2c291 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Sun, 20 Jan 2013 14:07:57 +0900 Subject: [PATCH] Fix QFS_FilelistFill to work with vpaths. --- libs/util/quakefs.c | 66 ++++++++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/libs/util/quakefs.c b/libs/util/quakefs.c index b73b9b6bc..f96361a0e 100644 --- a/libs/util/quakefs.c +++ b/libs/util/quakefs.c @@ -1587,45 +1587,57 @@ QFS_FilelistAdd (filelist_t *filelist, const char *fname, const char *ext) filelist->list[filelist->count++] = str; } +static void +qfs_filelistfill_do (filelist_t *list, const searchpath_t *search, const char *cp, const char *ext, int strip) +{ + const char *separator = "/"; + + if (*cp && cp[strlen (cp) - 1] == '/') + separator = ""; + + if (search->pack) { + int i; + pack_t *pak = search->pack; + + for (i = 0; i < pak->numfiles; i++) { + char *name = pak->files[i].name; + if (!fnmatch (va("%s%s*.%s", cp, separator, ext), name, + FNM_PATHNAME) + || !fnmatch (va("%s%s*.%s.gz", cp, separator, ext), name, + FNM_PATHNAME)) + QFS_FilelistAdd (list, name, strip ? ext : 0); + } + } else { + DIR *dir_ptr; + struct dirent *dirent; + + dir_ptr = opendir (va ("%s/%s", search->filename, cp)); + if (!dir_ptr) + return; + while ((dirent = readdir (dir_ptr))) + if (!fnmatch (va("*.%s", ext), dirent->d_name, 0) + || !fnmatch (va("*.%s.gz", ext), dirent->d_name, 0)) + QFS_FilelistAdd (list, dirent->d_name, strip ? ext : 0); + closedir (dir_ptr); + } +} + VISIBLE void QFS_FilelistFill (filelist_t *list, const char *path, const char *ext, int strip) { + vpath_t *vpath; searchpath_t *search; - DIR *dir_ptr; - struct dirent *dirent; char *cpath, *cp; - const char *separator = "/"; if (strchr (ext, '/') || strchr (ext, '\\')) return; cp = cpath = QFS_CompressPath (path); - if (*cp && cp[strlen (cp) - 1] == '/') - separator = ""; - for (search = qfs_searchpaths; search != NULL; search = search->next) { - if (search->pack) { - int i; - pack_t *pak = search->pack; - - for (i = 0; i < pak->numfiles; i++) { - char *name = pak->files[i].name; - if (!fnmatch (va("%s%s*.%s", cp, separator, ext), name, - FNM_PATHNAME) - || !fnmatch (va("%s%s*.%s.gz", cp, separator, ext), name, - FNM_PATHNAME)) - QFS_FilelistAdd (list, name, strip ? ext : 0); - } - } else { - dir_ptr = opendir (va ("%s/%s", search->filename, cp)); - if (!dir_ptr) - continue; - while ((dirent = readdir (dir_ptr))) - if (!fnmatch (va("*.%s", ext), dirent->d_name, 0) - || !fnmatch (va("*.%s.gz", ext), dirent->d_name, 0)) - QFS_FilelistAdd (list, dirent->d_name, strip ? ext : 0); - closedir (dir_ptr); + for (vpath = qfs_vpaths; vpath; vpath = vpath->next) { + for (search = vpath->user; search; search = search->next) { + qfs_filelistfill_do (list, search, cp, ext, strip); } } free (cpath);