static int QDECL VMEnumMods(const char *match, qofs_t size, time_t modtime, void *args, searchpathfuncs_t *spath) { char *check; char desc[1024]; int newlen; int desclen; qboolean foundone; vfsfile_t *f; newlen = strlen(match)+1; if (newlen <= 2) return true; //make sure match is a directory if (match[newlen-2] != '/') return true; if (!stricmp(match, "baseq3/")) return true; //we don't want baseq3. FIXME: should be any basedir, rather than hardcoded. foundone = false; Sys_EnumerateFiles(va("%s%s/", ((vmsearch_t *)args)->dir, match), "*.pk3", IfFound, &foundone, spath); if (foundone == false) return true; //we only count directories with a pk3 file Q_strncpyz(desc, match, sizeof(desc)); f = FS_OpenVFS(va("%sdescription.txt", match), "rb", FS_ROOT); if (f) { VFS_GETS(f, desc, sizeof(desc)); VFS_CLOSE(f); } desclen = strlen(desc)+1; if (newlen+desclen+5 > ((vmsearch_t *)args)->bufferleft) return false; //too many files for the buffer check = ((vmsearch_t *)args)->initialbuffer; while(check < ((vmsearch_t *)args)->buffer) { if (!stricmp(check, match)) return true; //we found this one already check += strlen(check)+1; check += strlen(check)+1; } memcpy(((vmsearch_t *)args)->buffer, match, newlen); ((vmsearch_t *)args)->buffer+=newlen; ((vmsearch_t *)args)->bufferleft-=newlen; memcpy(((vmsearch_t *)args)->buffer, desc, desclen); ((vmsearch_t *)args)->buffer+=desclen; ((vmsearch_t *)args)->bufferleft-=desclen; ((vmsearch_t *)args)->found++; return true; }
int VM_GetFileList(const char *path, const char *ext, char *output, int buffersize) { vmsearch_t vms; vms.initialbuffer = vms.buffer = output; vms.skip = strlen(path)+1; vms.bufferleft = buffersize; vms.found=0; if (!strcmp(path, "$modlist")) { vms.skip=0; Sys_EnumerateFiles((vms.dir=com_gamepath), "*", VMEnumMods, &vms, NULL); if (*com_homepath) Sys_EnumerateFiles((vms.dir=com_homepath), "*", VMEnumMods, &vms, NULL); } else if (*(char *)ext == '.' || *(char *)ext == '/') COM_EnumerateFiles(va("%s/*%s", path, ext), VMEnum, &vms); else COM_EnumerateFiles(va("%s/*.%s", path, ext), VMEnum, &vms); return vms.found; }
static int FSOS_RebuildFSHash(char *filename, int filesize, void *data) { if (filename[strlen(filename)-1] == '/') { //this is actually a directory char childpath[256]; snprintf(childpath, sizeof (childpath), "%s*", filename); Sys_EnumerateFiles((char*)data, childpath, FSOS_RebuildFSHash, data); return true; } if (!Hash_GetInsensitive(filesystemhash, filename)) { Hash_AddInsensitive(filesystemhash, filename, data); fs_hash_files++; } else fs_hash_dups++; return true; }
static int FSOS_EnumerateFiles (void *handle, char *match, int (*func)(char *, int, void *), void *parm) { return Sys_EnumerateFiles(handle, match, func, parm); }
static void FSOS_BuildHash(void *handle) { Sys_EnumerateFiles(handle, "*", FSOS_RebuildFSHash, handle); }