2012-03-26 22:03:20 +00:00
|
|
|
//
|
|
|
|
// Common non-engine code/data for EDuke32 and Mapster32
|
|
|
|
//
|
|
|
|
|
|
|
|
#include "compat.h"
|
2012-03-26 22:05:23 +00:00
|
|
|
#include "scriptfile.h"
|
2012-03-28 19:41:39 +00:00
|
|
|
#include "cache1d.h"
|
|
|
|
#include "kplib.h"
|
|
|
|
#include "baselayer.h"
|
2012-03-26 22:03:20 +00:00
|
|
|
|
|
|
|
#include "common.h"
|
|
|
|
|
|
|
|
|
|
|
|
struct strllist *CommandPaths, *CommandGrps;
|
|
|
|
|
|
|
|
void G_AddGroup(const char *buffer)
|
|
|
|
{
|
|
|
|
char buf[BMAX_PATH];
|
|
|
|
|
|
|
|
struct strllist *s = Bcalloc(1,sizeof(struct strllist));
|
|
|
|
|
|
|
|
Bstrcpy(buf, buffer);
|
|
|
|
|
|
|
|
if (Bstrchr(buf,'.') == 0)
|
|
|
|
Bstrcat(buf,".grp");
|
|
|
|
|
|
|
|
s->str = Bstrdup(buf);
|
|
|
|
|
|
|
|
if (CommandGrps)
|
|
|
|
{
|
|
|
|
struct strllist *t;
|
|
|
|
for (t = CommandGrps; t->next; t=t->next) ;
|
|
|
|
t->next = s;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
CommandGrps = s;
|
|
|
|
}
|
|
|
|
|
|
|
|
void G_AddPath(const char *buffer)
|
|
|
|
{
|
|
|
|
struct strllist *s = Bcalloc(1,sizeof(struct strllist));
|
|
|
|
s->str = Bstrdup(buffer);
|
|
|
|
|
|
|
|
if (CommandPaths)
|
|
|
|
{
|
|
|
|
struct strllist *t;
|
|
|
|
for (t = CommandPaths; t->next; t=t->next) ;
|
|
|
|
t->next = s;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
CommandPaths = s;
|
|
|
|
}
|
2012-03-26 22:05:23 +00:00
|
|
|
|
|
|
|
//////////
|
|
|
|
|
|
|
|
int32_t getatoken(scriptfile *sf, const tokenlist *tl, int32_t ntokens)
|
|
|
|
{
|
|
|
|
char *tok;
|
|
|
|
int32_t i;
|
|
|
|
|
|
|
|
if (!sf) return T_ERROR;
|
|
|
|
tok = scriptfile_gettoken(sf);
|
|
|
|
if (!tok) return T_EOF;
|
|
|
|
|
|
|
|
for (i=ntokens-1; i>=0; i--)
|
|
|
|
{
|
|
|
|
if (!Bstrcasecmp(tok, tl[i].text))
|
|
|
|
return tl[i].tokenid;
|
|
|
|
}
|
|
|
|
return T_ERROR;
|
|
|
|
}
|
2012-03-28 19:41:39 +00:00
|
|
|
|
|
|
|
//////////
|
|
|
|
|
|
|
|
// checks from path and in ZIPs, returns 1 if NOT found
|
|
|
|
int32_t check_file_exist(const char *fn)
|
|
|
|
{
|
|
|
|
int32_t opsm = pathsearchmode;
|
|
|
|
char *tfn;
|
|
|
|
|
|
|
|
pathsearchmode = 1;
|
|
|
|
if (findfrompath(fn,&tfn) < 0)
|
|
|
|
{
|
|
|
|
char buf[BMAX_PATH];
|
|
|
|
|
|
|
|
Bstrcpy(buf,fn);
|
|
|
|
kzfindfilestart(buf);
|
|
|
|
if (!kzfindfile(buf))
|
|
|
|
{
|
|
|
|
initprintf("Error: file \"%s\" does not exist\n",fn);
|
|
|
|
pathsearchmode = opsm;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else Bfree(tfn);
|
|
|
|
pathsearchmode = opsm;
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2012-03-28 19:41:57 +00:00
|
|
|
|
|
|
|
|
|
|
|
//// 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);
|
|
|
|
}
|
2012-03-28 19:43:39 +00:00
|
|
|
|
|
|
|
////
|
|
|
|
|
|
|
|
// returns a buffer of size BMAX_PATH
|
|
|
|
char *dup_filename(const char *fn)
|
|
|
|
{
|
|
|
|
char *buf = Bmalloc(BMAX_PATH);
|
|
|
|
|
|
|
|
return Bstrncpyz(buf, fn, BMAX_PATH);
|
|
|
|
}
|