/* ============== Sys_ListFilteredFiles ============== */ void Sys_ListFilteredFiles(const char *basedir, char *subdirs, char *filter, char **list, int *numfiles) { char search[MAX_OSPATH], newsubdirs[MAX_OSPATH]; char filename[MAX_OSPATH]; intptr_t findhandle; struct _finddata_t findinfo; if (*numfiles >= MAX_FOUND_FILES - 1) { return; } if (strlen(subdirs)) { Com_sprintf(search, sizeof(search), "%s\\%s\\*", basedir, subdirs); } else { Com_sprintf(search, sizeof(search), "%s\\*", basedir); } findhandle = _findfirst(search, &findinfo); if (findhandle == -1) { return; } do { if (findinfo.attrib & _A_SUBDIR) { if (Q_stricmp(findinfo.name, ".") && Q_stricmp(findinfo.name, "..")) { if (strlen(subdirs)) { Com_sprintf(newsubdirs, sizeof(newsubdirs), "%s\\%s", subdirs, findinfo.name); } else { Com_sprintf(newsubdirs, sizeof(newsubdirs), "%s", findinfo.name); } Sys_ListFilteredFiles(basedir, newsubdirs, filter, list, numfiles); } } if (*numfiles >= MAX_FOUND_FILES - 1) { break; } Com_sprintf(filename, sizeof(filename), "%s\\%s", subdirs, findinfo.name); if (!Com_FilterPath(filter, filename, qfalse)) { continue; } list[*numfiles] = CopyString(filename); (*numfiles)++; } while (_findnext(findhandle, &findinfo) != -1); _findclose(findhandle); }
/* ======================================================================================================================================= Sys_ListFilteredFiles ======================================================================================================================================= */ void Sys_ListFilteredFiles(const char *basedir, const char *subdirs, const char *filter, char **list, int *numfiles) { char search[MAX_OSPATH], newsubdirs[MAX_OSPATH]; char filename[MAX_OSPATH]; DIR *fdir; struct dirent *d; struct stat st; if (*numfiles >= MAX_FOUND_FILES - 1) { return; } if (strlen(subdirs)) { Com_sprintf(search, sizeof(search), "%s/%s", basedir, subdirs); } else { Com_sprintf(search, sizeof(search), "%s", basedir); } if ((fdir = opendir(search)) == NULL) { return; } while ((d = readdir(fdir)) != NULL) { Com_sprintf(filename, sizeof(filename), "%s/%s", search, d->d_name); if (stat(filename, &st) == -1) { continue; } if (st.st_mode & S_IFDIR) { if (Q_stricmp(d->d_name, ".") && Q_stricmp(d->d_name, "..")) { if (strlen(subdirs)) { Com_sprintf(newsubdirs, sizeof(newsubdirs), "%s/%s", subdirs, d->d_name); } else { Com_sprintf(newsubdirs, sizeof(newsubdirs), "%s", d->d_name); } Sys_ListFilteredFiles(basedir, newsubdirs, filter, list, numfiles); } } if (*numfiles >= MAX_FOUND_FILES - 1) { break; } Com_sprintf(filename, sizeof(filename), "%s/%s", subdirs, d->d_name); if (!Com_FilterPath(filter, filename, qfalse)) { continue; } list[*numfiles] = CopyString(filename); (*numfiles)++; } closedir(fdir); }