removed const block/default string logic because it doesn't realloc safely and doesn't really save much, substituting code should catch the common cases anyway
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@3105 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
f06fcc78af
commit
1206f6ae07
4 changed files with 24 additions and 166 deletions
|
@ -24,58 +24,33 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
cvar_group_t *cvar_groups;
|
||||
|
||||
//cvar_t *cvar_vars;
|
||||
char *cvar_null_string = "";
|
||||
static char *cvar_null_string = "";
|
||||
static char *cvar_zero_string = "0";
|
||||
|
||||
cvar_const_cache_t cc_cache;
|
||||
|
||||
// cvar string cache functions
|
||||
|
||||
// CCC_AddString: adds a string into the cvar CB, and creates one
|
||||
// if non-existant
|
||||
char *CCC_AddString(char *s)
|
||||
char *Cvar_DefaultAlloc(char *str)
|
||||
{
|
||||
int size = strlen(s) + 1;
|
||||
|
||||
if (!cc_cache.cb)
|
||||
cc_cache.cb = CB_Malloc(CC_CACHE_SIZE, CC_CACHE_STEP);
|
||||
|
||||
return CB_Copy (cc_cache.cb, s, size);
|
||||
}
|
||||
|
||||
// CCC_CheckAndAddString: checks against the CCC table, updates table,
|
||||
// and either adds or returns cached string
|
||||
char *CCC_CheckAndAddString(char *s)
|
||||
{
|
||||
int i;
|
||||
char *c;
|
||||
|
||||
if (str[0] == '\0')
|
||||
return cvar_null_string;
|
||||
if (str[0] == '0' && str[1] == '\0')
|
||||
return cvar_zero_string;
|
||||
|
||||
for (i = 0; i < CC_CACHE_ENTRIES; i++)
|
||||
{
|
||||
if (cc_cache.cached[i] && !strcmp(s, cc_cache.cached[i]))
|
||||
{
|
||||
// move string to top, pushing others down
|
||||
c = cc_cache.cached[i];
|
||||
if (i != 0)
|
||||
{
|
||||
Q_memcpy(cc_cache.cached + 1,
|
||||
cc_cache.cached,
|
||||
sizeof(char*) * i);
|
||||
cc_cache.cached[0] = c;
|
||||
}
|
||||
c = (char *)Z_Malloc(strlen(str)+1);
|
||||
Q_strcpy(c, str);
|
||||
|
||||
return c;
|
||||
}
|
||||
}
|
||||
|
||||
// not in cache, so add it to table
|
||||
// move current cached strings down
|
||||
Q_memcpy(cc_cache.cached + 1,
|
||||
cc_cache.cached,
|
||||
sizeof(char*) * (CC_CACHE_ENTRIES - 1));
|
||||
|
||||
return (cc_cache.cached[0] = CCC_AddString(s));
|
||||
return c;
|
||||
}
|
||||
|
||||
void Cvar_DefaultFree(char *str)
|
||||
{
|
||||
if (str == cvar_null_string)
|
||||
return;
|
||||
else if (str == cvar_zero_string)
|
||||
return;
|
||||
else
|
||||
Z_Free(str);
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
|
@ -893,7 +868,7 @@ void Cvar_Free(cvar_t *tbf)
|
|||
}
|
||||
unlinked:
|
||||
Z_Free(tbf->string);
|
||||
// Z_Free(tbf->defaultstr);
|
||||
Cvar_DefaultFree(tbf->defaultstr);
|
||||
if (tbf->latched_string)
|
||||
Z_Free(tbf->latched_string);
|
||||
Z_Free(tbf);
|
||||
|
@ -906,6 +881,7 @@ Cvar_RegisterVariable
|
|||
Adds a freestanding variable to the variable list.
|
||||
============
|
||||
*/
|
||||
|
||||
qboolean Cvar_Register (cvar_t *variable, const char *groupname)
|
||||
{
|
||||
cvar_t *old;
|
||||
|
@ -935,7 +911,7 @@ qboolean Cvar_Register (cvar_t *variable, const char *groupname)
|
|||
variable->string = (char*)Z_Malloc (1);
|
||||
|
||||
//cheat prevention - engine set default is the one that stays.
|
||||
variable->defaultstr = CCC_CheckAndAddString(value); //give it it's default (for server controlled vars and things)
|
||||
variable->defaultstr = Cvar_DefaultAlloc(value); //give it it's default (for server controlled vars and things)
|
||||
|
||||
// set it through the function to be consistant
|
||||
if (old->latched_string)
|
||||
|
@ -967,7 +943,7 @@ qboolean Cvar_Register (cvar_t *variable, const char *groupname)
|
|||
|
||||
variable->string = (char*)Z_Malloc (1);
|
||||
|
||||
variable->defaultstr = CCC_CheckAndAddString(value); //give it it's default (for server controlled vars and things)
|
||||
variable->defaultstr = Cvar_DefaultAlloc(value); //give it it's default (for server controlled vars and things)
|
||||
|
||||
// set it through the function to be consistant
|
||||
Cvar_SetCore (variable, value, true);
|
||||
|
@ -1236,7 +1212,4 @@ void Cvar_Shutdown(void)
|
|||
cvar_groups = grp->next;
|
||||
Z_Free(grp);
|
||||
}
|
||||
|
||||
if (cc_cache.cb)
|
||||
CB_Free(cc_cache.cb);
|
||||
}
|
||||
|
|
|
@ -180,14 +180,3 @@ void Cvar_Shutdown(void);
|
|||
void Cvar_ForceCheatVars(qboolean semicheats, qboolean absolutecheats); //locks/unlocks cheat cvars depending on weather we are allowed them.
|
||||
|
||||
//extern cvar_t *cvar_vars;
|
||||
|
||||
// cvar const cache, used for removing fairly common default cvar values
|
||||
#define CC_CACHE_ENTRIES 8
|
||||
|
||||
#define CC_CACHE_SIZE 2048
|
||||
#define CC_CACHE_STEP 2048
|
||||
|
||||
typedef struct cvar_const_cache_s {
|
||||
char *cached[CC_CACHE_ENTRIES];
|
||||
const_block_t *cb;
|
||||
} cvar_const_cache_t;
|
||||
|
|
|
@ -2121,93 +2121,6 @@ void *Cache_Alloc (cache_user_t *c, int size, char *name)
|
|||
#endif
|
||||
//============================================================================
|
||||
|
||||
// Constant block functions
|
||||
|
||||
// CB_Malloc: creates a usable const_block
|
||||
const_block_t *CB_Malloc (int size, int step)
|
||||
{
|
||||
// alloc new const block
|
||||
const_block_t *cb = Z_Malloc(sizeof(const_block_t));
|
||||
|
||||
// init cb members
|
||||
cb->block = BZ_Malloc(size);
|
||||
cb->point = cb->block;
|
||||
cb->curleft = size;
|
||||
cb->cursize = size;
|
||||
cb->memstep = step;
|
||||
|
||||
return cb;
|
||||
}
|
||||
|
||||
// CB_Slice: slices a chunk of memory off of the const block, and
|
||||
// reallocs if necessary
|
||||
char *CB_Slice (const_block_t *cb, int size)
|
||||
{
|
||||
char *c;
|
||||
|
||||
while (size > cb->curleft)
|
||||
{
|
||||
cb->block = BZ_Realloc(cb->block, cb->cursize + cb->memstep);
|
||||
cb->point = cb->block + (cb->cursize - cb->curleft);
|
||||
|
||||
cb->cursize += cb->memstep;
|
||||
cb->curleft += cb->memstep;
|
||||
}
|
||||
|
||||
c = cb->point;
|
||||
cb->point += size;
|
||||
cb->curleft -= size;
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
// CB_Copy: copies a stream of bytes into a const block, returns
|
||||
// pointer of copied string
|
||||
char *CB_Copy (const_block_t *cb, char *data, int size)
|
||||
{
|
||||
char *c;
|
||||
|
||||
c = CB_Slice(cb, size);
|
||||
Q_memcpy(c, data, size);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
// CB_Free: frees a const block
|
||||
void CB_Free (const_block_t *cb)
|
||||
{
|
||||
BZ_Free(cb->block);
|
||||
Z_Free(cb);
|
||||
}
|
||||
|
||||
#if 0
|
||||
// CB_Reset: resets a const block to size
|
||||
void CB_Reset (const_block_t *cb, int size)
|
||||
{
|
||||
if (cb->cursize != size)
|
||||
{
|
||||
cb->block = BZ_Realloc(cb->block, size);
|
||||
cb->cursize = size;
|
||||
}
|
||||
|
||||
cb->point = cb->block;
|
||||
cb->curleft = cb->cursize;
|
||||
}
|
||||
|
||||
// CB_Trim: trims a const block to minimal size
|
||||
void CB_Trim (const_block_t *cb)
|
||||
{
|
||||
if (cb->curleft > 0)
|
||||
{
|
||||
cb->cursize -= cb->curleft;
|
||||
cb->block = BZ_Realloc(cb->block, cb->cursize);
|
||||
cb->point = cb->block + cb->cursize;
|
||||
}
|
||||
|
||||
cb->curleft = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
========================
|
||||
Memory_Init
|
||||
|
|
|
@ -149,20 +149,3 @@ void *Cache_Alloc (cache_user_t *c, int size, char *name);
|
|||
|
||||
void Cache_Report (void);
|
||||
|
||||
// Constant Block memory functions
|
||||
// - Constant blocks are used for loads of strings/etc that
|
||||
// are allocated once and change very little during the rest
|
||||
// of run time, such as cvar names and default values
|
||||
typedef struct const_block_s {
|
||||
int curleft; // current bytes left in block
|
||||
int cursize; // current maximum size of block
|
||||
int memstep; // bytes to step per realloc
|
||||
char *point; // current block point
|
||||
char *block; // memory block
|
||||
} const_block_t;
|
||||
|
||||
const_block_t *CB_Malloc (int size, int step);
|
||||
//char *CB_Slice (const_block_t *cb, int size);
|
||||
char *CB_Copy (const_block_t *cb, char *data, int size);
|
||||
void CB_Free (const_block_t *cb);
|
||||
|
||||
|
|
Loading…
Reference in a new issue