mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-15 09:11:48 +00:00
Restore old entry searching functions and add alternate versions for long names
This commit is contained in:
parent
3cd8f62ae9
commit
212358dbba
3 changed files with 124 additions and 6 deletions
|
@ -412,9 +412,9 @@ static int libd_cachePatch(lua_State *L)
|
||||||
HUDONLY
|
HUDONLY
|
||||||
|
|
||||||
luapat = patchinfohead;
|
luapat = patchinfohead;
|
||||||
lumpnum = W_CheckNumForName(luaL_checkstring(L, 1));
|
lumpnum = W_CheckNumForLongName(luaL_checkstring(L, 1));
|
||||||
if (lumpnum == LUMPERROR)
|
if (lumpnum == LUMPERROR)
|
||||||
lumpnum = W_GetNumForName("MISSING");
|
lumpnum = W_GetNumForLongName("MISSING");
|
||||||
|
|
||||||
for (i = 0; i < numluapatches; i++)
|
for (i = 0; i < numluapatches; i++)
|
||||||
{
|
{
|
||||||
|
@ -454,7 +454,7 @@ static int libd_cachePatch(lua_State *L)
|
||||||
numluapatches++;
|
numluapatches++;
|
||||||
#else
|
#else
|
||||||
HUDONLY
|
HUDONLY
|
||||||
LUA_PushUserdata(L, W_CachePatchName(luaL_checkstring(L, 1), PU_PATCH), META_PATCH);
|
LUA_PushUserdata(L, W_CachePatchLongName(luaL_checkstring(L, 1), PU_PATCH), META_PATCH);
|
||||||
#endif
|
#endif
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
120
src/w_wad.c
120
src/w_wad.c
|
@ -920,6 +920,40 @@ const char *W_CheckNameForNum(lumpnum_t lumpnum)
|
||||||
// 'startlump' is the lump number to start the search
|
// 'startlump' is the lump number to start the search
|
||||||
//
|
//
|
||||||
UINT16 W_CheckNumForNamePwad(const char *name, UINT16 wad, UINT16 startlump)
|
UINT16 W_CheckNumForNamePwad(const char *name, UINT16 wad, UINT16 startlump)
|
||||||
|
{
|
||||||
|
UINT16 i;
|
||||||
|
static char uname[8 + 1];
|
||||||
|
|
||||||
|
if (!TestValidLump(wad,0))
|
||||||
|
return INT16_MAX;
|
||||||
|
|
||||||
|
strlcpy(uname, name, sizeof uname);
|
||||||
|
strupr(uname);
|
||||||
|
|
||||||
|
//
|
||||||
|
// scan forward
|
||||||
|
// start at 'startlump', useful parameter when there are multiple
|
||||||
|
// resources with the same name
|
||||||
|
//
|
||||||
|
if (startlump < wadfiles[wad]->numlumps)
|
||||||
|
{
|
||||||
|
lumpinfo_t *lump_p = wadfiles[wad]->lumpinfo + startlump;
|
||||||
|
for (i = startlump; i < wadfiles[wad]->numlumps; i++, lump_p++)
|
||||||
|
if (!strncmp(lump_p->name, uname, sizeof(uname) - 1))
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
// not found.
|
||||||
|
return INT16_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Like W_CheckNumForNamePwad, but can find entries with long names
|
||||||
|
//
|
||||||
|
// Should be the only version, but that's not possible until we fix
|
||||||
|
// all the instances of non null-terminated strings in the codebase...
|
||||||
|
//
|
||||||
|
UINT16 W_CheckNumForLongNamePwad(const char *name, UINT16 wad, UINT16 startlump)
|
||||||
{
|
{
|
||||||
UINT16 i;
|
UINT16 i;
|
||||||
static char uname[256 + 1];
|
static char uname[256 + 1];
|
||||||
|
@ -1025,7 +1059,8 @@ lumpnum_t W_CheckNumForName(const char *name)
|
||||||
// most recent entries first
|
// most recent entries first
|
||||||
for (i = lumpnumcacheindex + LUMPNUMCACHESIZE; i > lumpnumcacheindex; i--)
|
for (i = lumpnumcacheindex + LUMPNUMCACHESIZE; i > lumpnumcacheindex; i--)
|
||||||
{
|
{
|
||||||
if (strcmp(lumpnumcache[i & (LUMPNUMCACHESIZE - 1)].lumpname, name) == 0)
|
if (!lumpnumcache[i & (LUMPNUMCACHESIZE - 1)].lumpname[8]
|
||||||
|
&& strncmp(lumpnumcache[i & (LUMPNUMCACHESIZE - 1)].lumpname, name, 8) == 0)
|
||||||
{
|
{
|
||||||
lumpnumcacheindex = i & (LUMPNUMCACHESIZE - 1);
|
lumpnumcacheindex = i & (LUMPNUMCACHESIZE - 1);
|
||||||
return lumpnumcache[lumpnumcacheindex].lumpnum;
|
return lumpnumcache[lumpnumcacheindex].lumpnum;
|
||||||
|
@ -1045,13 +1080,63 @@ lumpnum_t W_CheckNumForName(const char *name)
|
||||||
{
|
{
|
||||||
// Update the cache.
|
// Update the cache.
|
||||||
lumpnumcacheindex = (lumpnumcacheindex + 1) & (LUMPNUMCACHESIZE - 1);
|
lumpnumcacheindex = (lumpnumcacheindex + 1) & (LUMPNUMCACHESIZE - 1);
|
||||||
strlcpy(lumpnumcache[lumpnumcacheindex].lumpname, name, 32);
|
memset(lumpnumcache[lumpnumcacheindex].lumpname, '\0', 32);
|
||||||
|
strncpy(lumpnumcache[lumpnumcacheindex].lumpname, name, 8);
|
||||||
lumpnumcache[lumpnumcacheindex].lumpnum = (i<<16)+check;
|
lumpnumcache[lumpnumcacheindex].lumpnum = (i<<16)+check;
|
||||||
|
|
||||||
return lumpnumcache[lumpnumcacheindex].lumpnum;
|
return lumpnumcache[lumpnumcacheindex].lumpnum;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Like W_CheckNumForName, but can find entries with long names
|
||||||
|
//
|
||||||
|
// Should be the only version, but that's not possible until we fix
|
||||||
|
// all the instances of non null-terminated strings in the codebase...
|
||||||
|
//
|
||||||
|
lumpnum_t W_CheckNumForLongName(const char *name)
|
||||||
|
{
|
||||||
|
INT32 i;
|
||||||
|
lumpnum_t check = INT16_MAX;
|
||||||
|
|
||||||
|
if (!*name) // some doofus gave us an empty string?
|
||||||
|
return LUMPERROR;
|
||||||
|
|
||||||
|
// Check the lumpnumcache first. Loop backwards so that we check
|
||||||
|
// most recent entries first
|
||||||
|
for (i = lumpnumcacheindex + LUMPNUMCACHESIZE; i > lumpnumcacheindex; i--)
|
||||||
|
{
|
||||||
|
if (strcmp(lumpnumcache[i & (LUMPNUMCACHESIZE - 1)].lumpname, name) == 0)
|
||||||
|
{
|
||||||
|
lumpnumcacheindex = i & (LUMPNUMCACHESIZE - 1);
|
||||||
|
return lumpnumcache[lumpnumcacheindex].lumpnum;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// scan wad files backwards so patch lump files take precedence
|
||||||
|
for (i = numwadfiles - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
check = W_CheckNumForLongNamePwad(name,(UINT16)i,0);
|
||||||
|
if (check != INT16_MAX)
|
||||||
|
break; //found it
|
||||||
|
}
|
||||||
|
|
||||||
|
if (check == INT16_MAX) return LUMPERROR;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (strlen(name) < 32)
|
||||||
|
{
|
||||||
|
// Update the cache.
|
||||||
|
lumpnumcacheindex = (lumpnumcacheindex + 1) & (LUMPNUMCACHESIZE - 1);
|
||||||
|
memset(lumpnumcache[lumpnumcacheindex].lumpname, '\0', 32);
|
||||||
|
strlcpy(lumpnumcache[lumpnumcacheindex].lumpname, name, 32);
|
||||||
|
lumpnumcache[lumpnumcacheindex].lumpnum = (i << 16) + check;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (i << 16) + check;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Look for valid map data through all added files in descendant order.
|
// Look for valid map data through all added files in descendant order.
|
||||||
// Get a map marker for WADs, and a standalone WAD file lump inside PK3s.
|
// Get a map marker for WADs, and a standalone WAD file lump inside PK3s.
|
||||||
// TODO: Make it search through cache first, maybe...?
|
// TODO: Make it search through cache first, maybe...?
|
||||||
|
@ -1100,6 +1185,24 @@ lumpnum_t W_GetNumForName(const char *name)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Like W_GetNumForName, but can find entries with long names
|
||||||
|
//
|
||||||
|
// Should be the only version, but that's not possible until we fix
|
||||||
|
// all the instances of non null-terminated strings in the codebase...
|
||||||
|
//
|
||||||
|
lumpnum_t W_GetNumForLongName(const char *name)
|
||||||
|
{
|
||||||
|
lumpnum_t i;
|
||||||
|
|
||||||
|
i = W_CheckNumForLongName(name);
|
||||||
|
|
||||||
|
if (i == LUMPERROR)
|
||||||
|
I_Error("W_GetNumForLongName: %s not found!\n", name);
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// W_CheckNumForNameInBlock
|
// W_CheckNumForNameInBlock
|
||||||
// Checks only in blocks from blockstart lump to blockend lump
|
// Checks only in blocks from blockstart lump to blockend lump
|
||||||
|
@ -1139,7 +1242,7 @@ UINT8 W_LumpExists(const char *name)
|
||||||
{
|
{
|
||||||
lumpinfo_t *lump_p = wadfiles[i]->lumpinfo;
|
lumpinfo_t *lump_p = wadfiles[i]->lumpinfo;
|
||||||
for (j = 0; j < wadfiles[i]->numlumps; ++j, ++lump_p)
|
for (j = 0; j < wadfiles[i]->numlumps; ++j, ++lump_p)
|
||||||
if (fastcmp(lump_p->name,name))
|
if (fastcmp(lump_p->longname, name))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -1680,6 +1783,17 @@ void *W_CachePatchName(const char *name, INT32 tag)
|
||||||
return W_CachePatchNum(W_GetNumForName("MISSING"), tag);
|
return W_CachePatchNum(W_GetNumForName("MISSING"), tag);
|
||||||
return W_CachePatchNum(num, tag);
|
return W_CachePatchNum(num, tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *W_CachePatchLongName(const char *name, INT32 tag)
|
||||||
|
{
|
||||||
|
lumpnum_t num;
|
||||||
|
|
||||||
|
num = W_CheckNumForLongName(name);
|
||||||
|
|
||||||
|
if (num == LUMPERROR)
|
||||||
|
return W_CachePatchNum(W_GetNumForLongName("MISSING"), tag);
|
||||||
|
return W_CachePatchNum(num, tag);
|
||||||
|
}
|
||||||
#ifndef NOMD5
|
#ifndef NOMD5
|
||||||
#define MD5_LEN 16
|
#define MD5_LEN 16
|
||||||
|
|
||||||
|
|
|
@ -156,6 +156,7 @@ const char *W_CheckNameForNumPwad(UINT16 wad, UINT16 lump);
|
||||||
const char *W_CheckNameForNum(lumpnum_t lumpnum);
|
const char *W_CheckNameForNum(lumpnum_t lumpnum);
|
||||||
|
|
||||||
UINT16 W_CheckNumForNamePwad(const char *name, UINT16 wad, UINT16 startlump); // checks only in one pwad
|
UINT16 W_CheckNumForNamePwad(const char *name, UINT16 wad, UINT16 startlump); // checks only in one pwad
|
||||||
|
UINT16 W_CheckNumForLongNamePwad(const char *name, UINT16 wad, UINT16 startlump);
|
||||||
|
|
||||||
/* Find the first lump after F_START for instance. */
|
/* Find the first lump after F_START for instance. */
|
||||||
UINT16 W_CheckNumForMarkerStartPwad(const char *name, UINT16 wad, UINT16 startlump);
|
UINT16 W_CheckNumForMarkerStartPwad(const char *name, UINT16 wad, UINT16 startlump);
|
||||||
|
@ -166,7 +167,9 @@ UINT16 W_CheckNumForFolderEndPK3(const char *name, UINT16 wad, UINT16 startlump)
|
||||||
|
|
||||||
lumpnum_t W_CheckNumForMap(const char *name);
|
lumpnum_t W_CheckNumForMap(const char *name);
|
||||||
lumpnum_t W_CheckNumForName(const char *name);
|
lumpnum_t W_CheckNumForName(const char *name);
|
||||||
|
lumpnum_t W_CheckNumForLongName(const char *name);
|
||||||
lumpnum_t W_GetNumForName(const char *name); // like W_CheckNumForName but I_Error on LUMPERROR
|
lumpnum_t W_GetNumForName(const char *name); // like W_CheckNumForName but I_Error on LUMPERROR
|
||||||
|
lumpnum_t W_GetNumForLongName(const char *name);
|
||||||
lumpnum_t W_CheckNumForNameInBlock(const char *name, const char *blockstart, const char *blockend);
|
lumpnum_t W_CheckNumForNameInBlock(const char *name, const char *blockstart, const char *blockend);
|
||||||
UINT8 W_LumpExists(const char *name); // Lua uses this.
|
UINT8 W_LumpExists(const char *name); // Lua uses this.
|
||||||
|
|
||||||
|
@ -194,6 +197,7 @@ boolean W_IsPatchCached(lumpnum_t lump, void *ptr);
|
||||||
|
|
||||||
void *W_CacheLumpName(const char *name, INT32 tag);
|
void *W_CacheLumpName(const char *name, INT32 tag);
|
||||||
void *W_CachePatchName(const char *name, INT32 tag);
|
void *W_CachePatchName(const char *name, INT32 tag);
|
||||||
|
void *W_CachePatchLongName(const char *name, INT32 tag);
|
||||||
|
|
||||||
// Returns either a Software patch, or an OpenGL patch.
|
// Returns either a Software patch, or an OpenGL patch.
|
||||||
// Performs any necessary conversions from PNG images.
|
// Performs any necessary conversions from PNG images.
|
||||||
|
|
Loading…
Reference in a new issue