Cvar aliasing code, so we don't tick off Tonik (and other users) every time

we rename a standard cvar.  Example of use in in_x11.c.  Make the alias directly
after the Cvar_Get to avoid segfaults.
This commit is contained in:
Dan Olson 2000-05-06 22:46:48 +00:00
parent 17270f94ba
commit d5e5b07ac9
3 changed files with 90 additions and 11 deletions

View file

@ -51,6 +51,7 @@
cvar_t *cvar_vars; cvar_t *cvar_vars;
char *cvar_null_string = ""; char *cvar_null_string = "";
cvar_t *developer; cvar_t *developer;
cvar_alias_t *calias_vars;
/* /*
============ ============
@ -68,6 +69,44 @@ cvar_t *Cvar_FindVar (char *var_name)
return NULL; return NULL;
} }
cvar_t *Cvar_FindAlias (char *alias_name)
{
cvar_alias_t *alias;
for (alias = calias_vars ; alias ; alias=alias->next)
if (!Q_strcmp (alias_name, alias->name))
return alias->cvar;
return NULL;
}
cvar_t *Cvar_Alias_Get (char *name, cvar_t *cvar)
{
cvar_alias_t *alias;
cvar_t *var;
if (Cmd_Exists (name))
{
Con_Printf ("CAlias_Get: %s is a command\n", name);
return NULL;
}
if (Cvar_FindVar(name))
{
Con_Printf ("CAlias_Get: tried to alias used cvar name %s\n",name);
return NULL;
}
var = Cvar_FindAlias(name);
if (!var)
{
alias = (cvar_alias_t *) malloc(sizeof(cvar_alias_t));
alias->next = calias_vars;
calias_vars = alias;
alias->name = strdup(name);
alias->cvar = cvar;
return alias->cvar;
}
return var;
}
/* /*
============ ============
Cvar_VariableValue Cvar_VariableValue
@ -78,6 +117,8 @@ float Cvar_VariableValue (char *var_name)
cvar_t *var; cvar_t *var;
var = Cvar_FindVar (var_name); var = Cvar_FindVar (var_name);
if (!var)
var = Cvar_FindAlias(var_name);
if (!var) if (!var)
return 0; return 0;
return Q_atof (var->string); return Q_atof (var->string);
@ -94,6 +135,8 @@ char *Cvar_VariableString (char *var_name)
cvar_t *var; cvar_t *var;
var = Cvar_FindVar (var_name); var = Cvar_FindVar (var_name);
if (!var)
var = Cvar_FindAlias(var_name);
if (!var) if (!var)
return cvar_null_string; return cvar_null_string;
return var->string; return var->string;
@ -108,7 +151,8 @@ Cvar_CompleteVariable
char *Cvar_CompleteVariable (char *partial) char *Cvar_CompleteVariable (char *partial)
{ {
cvar_t *cvar; cvar_t *cvar;
int len; cvar_alias_t *alias;
int len;
len = Q_strlen(partial); len = Q_strlen(partial);
@ -119,12 +163,22 @@ char *Cvar_CompleteVariable (char *partial)
for (cvar=cvar_vars ; cvar ; cvar=cvar->next) for (cvar=cvar_vars ; cvar ; cvar=cvar->next)
if (!strcmp (partial,cvar->name)) if (!strcmp (partial,cvar->name))
return cvar->name; return cvar->name;
// check aliases too :)
for (alias=calias_vars ; alias ; alias=alias->next)
if (!strcmp (partial, alias->name))
return alias->name;
// check partial match // check partial match
for (cvar=cvar_vars ; cvar ; cvar=cvar->next) for (cvar=cvar_vars ; cvar ; cvar=cvar->next)
if (!Q_strncmp (partial,cvar->name, len)) if (!Q_strncmp (partial,cvar->name, len))
return cvar->name; return cvar->name;
// check aliases too :)
for (alias=calias_vars ; alias ; alias=alias->next)
if (!Q_strncmp (partial, alias->name, len))
return alias->name;
return NULL; return NULL;
} }
@ -210,6 +264,8 @@ qboolean Cvar_Command (void)
// check variables // check variables
v = Cvar_FindVar (Cmd_Argv(0)); v = Cvar_FindVar (Cmd_Argv(0));
if (!v)
v = Cvar_FindAlias (Cmd_Argv(0));
if (!v) if (!v)
return false; return false;
@ -256,6 +312,8 @@ void Cvar_Set_f(void)
var_name = Cmd_Argv (1); var_name = Cmd_Argv (1);
value = Cmd_Argv (2); value = Cmd_Argv (2);
var = Cvar_FindVar (var_name); var = Cvar_FindVar (var_name);
if (!var)
var = Cvar_FindAlias (var_name);
if (var) if (var)
{ {
Cvar_Set (var, value); Cvar_Set (var, value);
@ -278,6 +336,8 @@ void Cvar_Toggle_f (void)
} }
var = Cvar_FindVar (Cmd_Argv(1)); var = Cvar_FindVar (Cmd_Argv(1));
if (!var)
var = Cvar_FindAlias(Cmd_Argv(1));
if (!var) if (!var)
{ {
Con_Printf ("Unknown variable \"%s\"\n", Cmd_Argv(1)); Con_Printf ("Unknown variable \"%s\"\n", Cmd_Argv(1));
@ -289,7 +349,7 @@ void Cvar_Toggle_f (void)
void Cvar_Help_f (void) void Cvar_Help_f (void)
{ {
char *cvar_name; char *var_name;
cvar_t *var; cvar_t *var;
if (Cmd_Argc() != 2) if (Cmd_Argc() != 2)
@ -298,11 +358,13 @@ void Cvar_Help_f (void)
return; return;
} }
cvar_name = Cmd_Argv (1); var_name = Cmd_Argv (1);
if((var = Cvar_FindVar(cvar_name)) != NULL) var = Cvar_FindVar (var_name);
if (!var)
var = Cvar_FindAlias (var_name);
if (var)
{ {
Con_Printf ("description: %s\nvalue: %s\n",var->description, Con_Printf ("%s\n",var->description);
var->string);
return; return;
} }
Con_Printf ("variable not found\n"); Con_Printf ("variable not found\n");
@ -333,7 +395,9 @@ void Cvar_Init()
void Cvar_Shutdown (void) void Cvar_Shutdown (void)
{ {
cvar_t *var,*next; cvar_t *var,*next;
cvar_alias_t *alias,*nextalias;
// Free cvars
var = cvar_vars; var = cvar_vars;
while(var) while(var)
{ {
@ -344,6 +408,15 @@ void Cvar_Shutdown (void)
free(var); free(var);
var = next; var = next;
} }
// Free aliases
alias = calias_vars;
while(alias)
{
nextalias = alias->next;
free(alias->name);
free(alias);
alias = nextalias;
}
} }

View file

@ -40,14 +40,17 @@ typedef struct cvar_s
char *string; char *string;
int flags; int flags;
char *description; // for "help" command char *description; // for "help" command
// qboolean archive; // set to true to cause it to be saved to vars.rc float value;
// qboolean info; // added to serverinfo or userinfo when changed
// qboolean server; // notifies players when changed (UQUAKE)
// qboolean heap; // allocated off the heap, safe to free
float value;
struct cvar_s *next; struct cvar_s *next;
} cvar_t; } cvar_t;
typedef struct cvar_alias_s
{
char *name;
cvar_t *cvar;
struct cvar_alias_s *next;
} cvar_alias_t;
#define CVAR_NONE 0 #define CVAR_NONE 0
#define CVAR_ARCHIVE 1 // set to cause it to be saved to vars.rc #define CVAR_ARCHIVE 1 // set to cause it to be saved to vars.rc
// used for system variables, not for player // used for system variables, not for player
@ -78,6 +81,8 @@ typedef struct cvar_s
cvar_t *Cvar_Get (char *name, char *value, int cvarflags, char *description); cvar_t *Cvar_Get (char *name, char *value, int cvarflags, char *description);
cvar_t *Cvar_Alias_Get (char *name, cvar_t *cvar);
void Cvar_Set (cvar_t *var, char *value); void Cvar_Set (cvar_t *var, char *value);
// equivelant to "<name> <variable>" typed at the console // equivelant to "<name> <variable>" typed at the console

View file

@ -458,6 +458,7 @@ IN_Init(void)
} }
in_grab = Cvar_Get ("in_grab","0",CVAR_ARCHIVE,"None"); in_grab = Cvar_Get ("in_grab","0",CVAR_ARCHIVE,"None");
Cvar_Alias_Get ("_windowed_mouse", in_grab);
m_filter = Cvar_Get ("m_filter","0",CVAR_ARCHIVE,"None"); m_filter = Cvar_Get ("m_filter","0",CVAR_ARCHIVE,"None");
#ifdef HAS_DGA #ifdef HAS_DGA
vid_dga_mouseaccel = Cvar_Get ("vid_dga_mouseaccel","1",CVAR_ARCHIVE, vid_dga_mouseaccel = Cvar_Get ("vid_dga_mouseaccel","1",CVAR_ARCHIVE,