From a7f6f3bacc21a7f84d656ed013bbf9fc29ff537a Mon Sep 17 00:00:00 2001 From: helixhorned Date: Wed, 28 Mar 2012 19:41:57 +0000 Subject: [PATCH] Factor out different {clear,get}filenames definitions into fnlist_t + functions. Don't actually replace the instances in the code now. Additions in common.h: - fnlist_t, which combines CACHE1D_FIND_REC *finddirs, *findfiles and int32_t numdirs, numfiles - the FNLIST_INITIALIZER macro, which MUST be used for automatic variables - fnlist_clearnames, fnlist_getnames functions - G_LoadGroupsInDir, G_DoAutoload, two often-occurring uses of these git-svn-id: https://svn.eduke32.com/eduke32@2555 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/build/include/common.h | 17 +++++++ polymer/eduke32/source/common.c | 70 ++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) diff --git a/polymer/eduke32/build/include/common.h b/polymer/eduke32/build/include/common.h index f32c14ff3..742c89a03 100644 --- a/polymer/eduke32/build/include/common.h +++ b/polymer/eduke32/build/include/common.h @@ -8,6 +8,7 @@ #define EDUKE32_COMMON_H_ #include "scriptfile.h" +#include "cache1d.h" //// TYPES @@ -24,6 +25,15 @@ typedef struct } tokenlist; +typedef struct +{ + CACHE1D_FIND_REC *finddirs, *findfiles; + int32_t numdirs, numfiles; +} +fnlist_t; + +#define FNLIST_INITIALIZER { NULL, NULL, 0, 0 } + enum { T_EOF = -2, @@ -43,4 +53,11 @@ int32_t getatoken(scriptfile *sf, const tokenlist *tl, int32_t ntokens); int32_t check_file_exist(const char *fn); +void fnlist_clearnames(fnlist_t *fnl); +int32_t fnlist_getnames(fnlist_t *fnl, const char *dirname, const char *pattern, + int32_t dirflags, int32_t fileflags); + +void G_LoadGroupsInDir(const char *dirname); +void G_DoAutoload(const char *dirname); + #endif diff --git a/polymer/eduke32/source/common.c b/polymer/eduke32/source/common.c index f0cac5233..651032f5e 100644 --- a/polymer/eduke32/source/common.c +++ b/polymer/eduke32/source/common.c @@ -97,3 +97,73 @@ int32_t check_file_exist(const char *fn) return 0; } + + +//// FILE NAME / DIRECTORY LISTS //// +void fnlist_clearnames(fnlist_t *fnl) +{ + klistfree(fnl->finddirs); + klistfree(fnl->findfiles); + + fnl->finddirs = fnl->findfiles = NULL; + fnl->numfiles = fnl->numdirs = 0; +} + +// dirflags, fileflags: +// -1 means "don't get dirs/files", +// otherwise ORed to flags for respective klistpath +int32_t fnlist_getnames(fnlist_t *fnl, const char *dirname, const char *pattern, + int32_t dirflags, int32_t fileflags) +{ + CACHE1D_FIND_REC *r; + + fnlist_clearnames(fnl); + + if (dirflags != -1) + fnl->finddirs = klistpath(dirname, "*", CACHE1D_FIND_DIR|dirflags); + if (fileflags != -1) + fnl->findfiles = klistpath(dirname, pattern, CACHE1D_FIND_FILE|fileflags); + + for (r=fnl->finddirs; r; r=r->next) + fnl->numdirs++; + for (r=fnl->findfiles; r; r=r->next) + fnl->numfiles++; + + return(0); +} + + +// loads all group (grp, zip, pk3) files in the given directory +void G_LoadGroupsInDir(const char *dirname) +{ + static const char *extensions[3] = { "*.grp", "*.zip", "*.pk3" }; + + char buf[BMAX_PATH]; + int32_t i; + + fnlist_t fnlist = FNLIST_INITIALIZER; + + for (i=0; i<3; i++) + { + CACHE1D_FIND_REC *rec; + + fnlist_getnames(&fnlist, dirname, extensions[i], -1, 0); + + for (rec=fnlist.findfiles; rec; rec=rec->next) + { + Bsnprintf(buf, sizeof(buf), "%s/%s", dirname, rec->name); + initprintf("Using group file \"%s\".\n", buf); + initgroupfile(buf); + } + + fnlist_clearnames(&fnlist); + } +} + +void G_DoAutoload(const char *dirname) +{ + char buf[BMAX_PATH]; + + Bsnprintf(buf, sizeof(buf), "autoload/%s", dirname); + G_LoadGroupsInDir(buf); +}