Two bugs fixed and an attempt at fs_cache working properly (it's now case insensative, even in linux)

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@569 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2004-12-05 11:39:39 +00:00
parent fcd3f100d2
commit b255ce926b

View file

@ -34,30 +34,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//#define HASH_FILESYSTEM //#define HASH_FILESYSTEM
#if defined(HASH_FILESYSTEM) || defined(ONE_FS_HASH) #if defined(HASH_FILESYSTEM) || defined(ONE_FS_HASH)
//#include "hash.h" #include "hash.h"
#define Hash_BytesForBuckets(b) (sizeof(bucket_t)*b)
#define STRCMP(s1,s2) (((*s1)!=(*s2)) || strcmp(s1+1,s2+1)) //saves about 2-6 out of 120 - expansion of idea from fastqcc
typedef struct bucket_s {
void *data;
char *keystring;
struct bucket_s *next;
} bucket_t;
typedef struct hashtable_s {
int numbuckets;
bucket_t **bucket;
} hashtable_t;
void Hash_InitTable(hashtable_t *table, int numbucks, void *mem); //mem must be 0 filled. (memset(mem, 0, size))
int Hash_Key(char *name, int modulus);
void *Hash_Get(hashtable_t *table, char *name);
void *Hash_GetKey(hashtable_t *table, int key);
void *Hash_GetNext(hashtable_t *table, char *name, void *old);
void *Hash_Add(hashtable_t *table, char *name, void *data);
void *Hash_Add2(hashtable_t *table, char *name, void *data, bucket_t *buck);
void *Hash_AddKey(hashtable_t *table, int key, void *data);
void Hash_Remove(hashtable_t *table, char *name);
#endif #endif
@ -1491,7 +1468,10 @@ skipwhite:
while (1) while (1)
{ {
if (len >= TOKENSIZE-1) if (len >= TOKENSIZE-1)
{
com_token[len] = '\0';
return data; return data;
}
c = *data++; c = *data++;
@ -1525,7 +1505,10 @@ skipwhite:
do do
{ {
if (len >= TOKENSIZE-1) if (len >= TOKENSIZE-1)
{
com_token[len] = '\0';
return data; return data;
}
com_token[len] = c; com_token[len] = c;
data++; data++;
@ -1562,6 +1545,11 @@ skipwhite:
macro = Cvar_FindVar(name); macro = Cvar_FindVar(name);
if (macro) //got one... if (macro) //got one...
{ {
if (len+strlen(macro->string)-(i+1) >= TOKENSIZE-1) //give up.
{
com_token[len] = '\0';
return data;
}
memmove(s+strlen(macro->string), s+i+1, len-c-i); memmove(s+strlen(macro->string), s+i+1, len-c-i);
memcpy(s, macro->string, strlen(macro->string)); memcpy(s, macro->string, strlen(macro->string));
s+=strlen(macro->string); s+=strlen(macro->string);
@ -1620,6 +1608,11 @@ skipwhite:
data++; data++;
while (1) while (1)
{ {
if (len >= TOKENSIZE-1)
{
com_token[len] = '\0';
return data;
}
c = *data++; c = *data++;
if (c=='\"' || !c) if (c=='\"' || !c)
{ {
@ -1645,6 +1638,8 @@ skipwhite:
// parse a regular word // parse a regular word
do do
{ {
if (len >= sizeof(com_token)-1)
break;
com_token[len] = c; com_token[len] = c;
data++; data++;
len++; len++;
@ -1695,6 +1690,12 @@ skipwhite:
data++; data++;
while (1) while (1)
{ {
if (len >= TOKENSIZE-2)
{
com_token[len] = '\0';
return data;
}
c = *data++; c = *data++;
if (!c) if (!c)
{ {
@ -1735,6 +1736,8 @@ skipwhite:
// parse a regular word // parse a regular word
do do
{ {
if (len >= sizeof(com_token)-1)
break;
com_token[len] = c; com_token[len] = c;
data++; data++;
len++; len++;
@ -2285,20 +2288,18 @@ int FS_RebuildOSFSHash(char *filename, int filesize, void *data)
{ //this is actually a directory { //this is actually a directory
char childpath[256]; char childpath[256];
sprintf(childpath, "%s*.*", filename);
Sys_EnumerateFiles(((searchpath_t *)data)->filename, childpath, FS_RebuildOSFSHash, data);
sprintf(childpath, "%s*", filename); sprintf(childpath, "%s*", filename);
Sys_EnumerateFiles(((searchpath_t *)data)->filename, childpath, FS_RebuildOSFSHash, data); Sys_EnumerateFiles(((searchpath_t *)data)->filename, childpath, FS_RebuildOSFSHash, data);
return true; return true;
} }
if (!Hash_Get(&filesystemhash, filename)) if (!Hash_GetInsensative(&filesystemhash, filename))
{ {
bucket_t *bucket = BZ_Malloc(sizeof(bucket_t) + strlen(filename)+1); bucket_t *bucket = BZ_Malloc(sizeof(bucket_t) + strlen(filename)+1);
strcpy((char *)(bucket+1), filename); strcpy((char *)(bucket+1), filename);
#ifdef _WIN32 #ifdef _WIN32
Q_strlwr((char *)(bucket+1)); Q_strlwr((char *)(bucket+1));
#endif #endif
Hash_Add2(&filesystemhash, (char *)(bucket+1), data, bucket); Hash_AddInsensative(&filesystemhash, (char *)(bucket+1), data, bucket);
fs_hash_files++; fs_hash_files++;
} }
@ -2356,10 +2357,10 @@ void FS_RebuildFSHash(void)
case SPT_PACK: case SPT_PACK:
for (i = 0; i < search->u.pack->numfiles; i++) for (i = 0; i < search->u.pack->numfiles; i++)
{ {
if (!Hash_Get(&filesystemhash, search->u.pack->files[i].name)) if (!Hash_GetInsensative(&filesystemhash, search->u.pack->files[i].name))
{ {
fs_hash_files++; fs_hash_files++;
Hash_Add2(&filesystemhash, search->u.pack->files[i].name, &search->u.pack->files[i], &search->u.pack->files[i].bucket); Hash_AddInsensative(&filesystemhash, search->u.pack->files[i].name, &search->u.pack->files[i], &search->u.pack->files[i].bucket);
} }
else else
fs_hash_dups++; fs_hash_dups++;
@ -2369,10 +2370,10 @@ void FS_RebuildFSHash(void)
case SPT_ZIP: case SPT_ZIP:
for (i = 0; i < search->u.zip->numfiles; i++) for (i = 0; i < search->u.zip->numfiles; i++)
{ {
if (!Hash_Get(&filesystemhash, search->u.zip->files[i].name)) if (!Hash_GetInsensative(&filesystemhash, search->u.zip->files[i].name))
{ {
fs_hash_files++; fs_hash_files++;
Hash_Add2(&filesystemhash, search->u.zip->files[i].name, &search->u.zip->files[i], &search->u.zip->files[i].bucket); Hash_AddInsensative(&filesystemhash, search->u.zip->files[i].name, &search->u.zip->files[i], &search->u.zip->files[i].bucket);
} }
else else
fs_hash_dups++; fs_hash_dups++;
@ -2380,7 +2381,7 @@ void FS_RebuildFSHash(void)
break; break;
#endif #endif
case SPT_OS: case SPT_OS:
Sys_EnumerateFiles(search->filename, "*.*", FS_RebuildOSFSHash, search); Sys_EnumerateFiles(search->filename, "*", FS_RebuildOSFSHash, search);
break; break;
default: default:
Sys_Error("FS_RebuildFSHash: Bad searchpath type\n"); Sys_Error("FS_RebuildFSHash: Bad searchpath type\n");
@ -2669,7 +2670,7 @@ int FS_FLocateFile(char *filename, FSLF_ReturnType_e returntype, flocation_t *lo
{ {
if (com_fschanged) if (com_fschanged)
FS_RebuildFSHash(); FS_RebuildFSHash();
pf = Hash_Get(&filesystemhash, filename); pf = Hash_GetInsensative(&filesystemhash, filename);
if (!pf) if (!pf)
goto fail; goto fail;
} }
@ -3219,7 +3220,7 @@ pack_t *COM_LoadPackFile (char *packfile)
newfiles[i].filepos = LittleLong(info.filepos); newfiles[i].filepos = LittleLong(info.filepos);
newfiles[i].filelen = LittleLong(info.filelen); newfiles[i].filelen = LittleLong(info.filelen);
#ifdef HASH_FILESYSTEM #ifdef HASH_FILESYSTEM
Hash_Add2(&pack->hash, newfiles[i].name, &newfiles[i], &newfiles[i].bucket); Hash_AddInsensative(&pack->hash, newfiles[i].name, &newfiles[i], &newfiles[i].bucket);
#endif #endif
} }
/* /*
@ -3341,7 +3342,7 @@ qboolean COM_LoadMapPackFile (char *filename, int ofs)
newfiles[i].filepos = LittleLong(info.filepos)+fstart; newfiles[i].filepos = LittleLong(info.filepos)+fstart;
newfiles[i].filelen = LittleLong(info.filelen); newfiles[i].filelen = LittleLong(info.filelen);
#ifdef HASH_FILESYSTEM #ifdef HASH_FILESYSTEM
Hash_Add2(&pack->hash, newfiles[i].name, &newfiles[i], &newfiles[i].bucket); Hash_AddInsensative(&pack->hash, newfiles[i].name, &newfiles[i], &newfiles[i].bucket);
#endif #endif
} }
@ -3546,7 +3547,7 @@ newsection:
break; break;
} }
#ifdef HASH_FILESYSTEM #ifdef HASH_FILESYSTEM
Hash_Add2(&pack->hash, newfiles[i].name, &newfiles[i], &newfiles[i].bucket); Hash_AddInsensative(&pack->hash, newfiles[i].name, &newfiles[i], &newfiles[i].bucket);
#endif #endif
} }
@ -3624,7 +3625,7 @@ zipfile_t *COM_LoadZipFile (char *packfile)
newfiles[i].filelen = file_info.uncompressed_size; newfiles[i].filelen = file_info.uncompressed_size;
newfiles[i].filepos = file_info.c_offset; newfiles[i].filepos = file_info.c_offset;
#ifdef HASH_FILESYSTEM #ifdef HASH_FILESYSTEM
Hash_Add2(&zip->hash, newfiles[i].name, &newfiles[i], &newfiles[i].bucket); Hash_AddInsensative(&zip->hash, newfiles[i].name, &newfiles[i], &newfiles[i].bucket);
#endif #endif
unzGoToNextFile (zip->handle); unzGoToNextFile (zip->handle);
} }
@ -3638,7 +3639,7 @@ packfile_t *Com_FileInZip(zipfile_t *zip, char *filename)
// int err; // int err;
#ifdef HASH_FILESYSTEM #ifdef HASH_FILESYSTEM
return Hash_Get(&zip->hash, filename); return Hash_GetInsensative(&zip->hash, filename);
#else #else
int num; int num;
@ -4215,6 +4216,11 @@ char *Info_ValueForKey (char *s, char *key)
return value[valueindex]; return value[valueindex];
} }
*o++ = *s++; *o++ = *s++;
if (o+2 >= pkey+sizeof(pkey)) //hrm. hackers at work..
{
*value[valueindex]='\0';
return value[valueindex];
}
} }
*o = 0; *o = 0;
s++; s++;
@ -4229,6 +4235,12 @@ char *Info_ValueForKey (char *s, char *key)
return value[valueindex]; return value[valueindex];
} }
*o++ = *s++; *o++ = *s++;
if (o+2 >= value[valueindex]+sizeof(value[valueindex])) //hrm. hackers at work..
{
*value[valueindex]='\0';
return value[valueindex];
}
} }
*o = 0; *o = 0;