qbsp: don't modify the wadstring argument in WADList_Init()

Signed-off-by: Kevin Shanahan <kmshanah@disenchant.net>
This commit is contained in:
Kevin Shanahan 2013-02-11 18:56:44 +10:30
parent 7b285c347b
commit 6c8aa11988
2 changed files with 34 additions and 31 deletions

View File

@ -52,12 +52,13 @@ WAD_LoadInfo(wad_t *w)
int
WADList_Init(wad_t **wads, char *wadstring)
WADList_Init(wad_t **wads, const char *wadstring)
{
int i, len, numwads;
wad_t *tmp, *w;
char *fname;
int len, numwads;
wad_t *wadlist, *wad;
const char *fname;
char *fpath;
const char *pos;
int pathlen;
*wads = NULL;
@ -71,45 +72,47 @@ WADList_Init(wad_t **wads, char *wadstring)
// Count # of wads
numwads = 1;
for (i = 0; i < len; i++)
if (wadstring[i] == ';' && wadstring[i + 1] != ';')
for (pos = wadstring; *pos ; pos++)
if (pos[0] == ';' && pos[1] != ';')
numwads++;
tmp = AllocMem(OTHER, numwads * sizeof(wad_t), true);
wadlist = AllocMem(OTHER, numwads * sizeof(wad_t), true);
w = tmp;
i = 0;
while (i < len) {
fname = wadstring + i;
while (wadstring[i] != 0 && wadstring[i] != ';')
i++;
wadstring[i++] = 0;
wad = wadlist;
pos = wadstring;
while (pos - wadstring < len) {
fname = pos;
while (*pos && *pos != ';')
pos++;
if (!options.wadPath[0] || IsAbsolutePath(fname))
fpath = copystring(fname);
else {
pathlen = strlen(options.wadPath) + strlen(fname) + 1;
fpath = AllocMem(OTHER, pathlen + 1, false);
sprintf(fpath, "%s/%s", options.wadPath, fname);
if (!options.wadPath[0] || IsAbsolutePath(fname)) {
fpath = AllocMem(OTHER, (pos - fname) + 1, false);
snprintf(fpath, (pos - fname) + 1, "%s", fname);
} else {
pathlen = strlen(options.wadPath) + 1 + (pos - fname);
fpath = AllocMem(OTHER, pathlen + 1, true);
snprintf(fpath, pathlen + 1, "%s/%s", options.wadPath, fname);
}
w->file = fopen(fpath, "rb");
if (w->file) {
wad->file = fopen(fpath, "rb");
if (wad->file) {
if (options.fVerbose)
Message(msgLiteral, "Opened WAD: %s\n", fpath);
if (!WAD_LoadInfo(w)) {
if (WAD_LoadInfo(wad)) {
wad++;
} else {
Message(msgWarning, warnNotWad, fpath);
fclose(w->file);
} else
w++;
fclose(wad->file);
}
}
FreeMem(fpath, OTHER, strlen(fpath) + 1);
pos++;
}
/* Re-allocate just the required amount */
*wads = AllocMem(OTHER, (w - tmp) * sizeof(wad_t), false);
memcpy(*wads, tmp, (w - tmp) * sizeof(wad_t));
FreeMem(tmp, OTHER, numwads * sizeof(wad_t));
numwads = w - tmp;
*wads = AllocMem(OTHER, (wad - wadlist) * sizeof(wad_t), false);
memcpy(*wads, wadlist, (wad - wadlist) * sizeof(wad_t));
FreeMem(wadlist, OTHER, numwads * sizeof(wad_t));
numwads = wad - wadlist;
return numwads;
}

View File

@ -46,7 +46,7 @@ typedef struct {
FILE *file;
} wad_t;
int WADList_Init(wad_t **wads, char *wadstring);
int WADList_Init(wad_t **wads, const char *wadstring);
void WADList_Process(wad_t *wads, int numwads);
void WADList_Free(wad_t *wads, int numwads);