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;
char *cvar_null_string = "";
cvar_t *developer;
cvar_alias_t *calias_vars;
/*
============
@ -68,6 +69,44 @@ cvar_t *Cvar_FindVar (char *var_name)
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
@ -78,6 +117,8 @@ float Cvar_VariableValue (char *var_name)
cvar_t *var;
var = Cvar_FindVar (var_name);
if (!var)
var = Cvar_FindAlias(var_name);
if (!var)
return 0;
return Q_atof (var->string);
@ -94,6 +135,8 @@ char *Cvar_VariableString (char *var_name)
cvar_t *var;
var = Cvar_FindVar (var_name);
if (!var)
var = Cvar_FindAlias(var_name);
if (!var)
return cvar_null_string;
return var->string;
@ -108,7 +151,8 @@ Cvar_CompleteVariable
char *Cvar_CompleteVariable (char *partial)
{
cvar_t *cvar;
int len;
cvar_alias_t *alias;
int len;
len = Q_strlen(partial);
@ -119,12 +163,22 @@ char *Cvar_CompleteVariable (char *partial)
for (cvar=cvar_vars ; cvar ; cvar=cvar->next)
if (!strcmp (partial,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
for (cvar=cvar_vars ; cvar ; cvar=cvar->next)
if (!Q_strncmp (partial,cvar->name, len))
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;
}
@ -210,6 +264,8 @@ qboolean Cvar_Command (void)
// check variables
v = Cvar_FindVar (Cmd_Argv(0));
if (!v)
v = Cvar_FindAlias (Cmd_Argv(0));
if (!v)
return false;
@ -256,6 +312,8 @@ void Cvar_Set_f(void)
var_name = Cmd_Argv (1);
value = Cmd_Argv (2);
var = Cvar_FindVar (var_name);
if (!var)
var = Cvar_FindAlias (var_name);
if (var)
{
Cvar_Set (var, value);
@ -278,6 +336,8 @@ void Cvar_Toggle_f (void)
}
var = Cvar_FindVar (Cmd_Argv(1));
if (!var)
var = Cvar_FindAlias(Cmd_Argv(1));
if (!var)
{
Con_Printf ("Unknown variable \"%s\"\n", Cmd_Argv(1));
@ -289,7 +349,7 @@ void Cvar_Toggle_f (void)
void Cvar_Help_f (void)
{
char *cvar_name;
char *var_name;
cvar_t *var;
if (Cmd_Argc() != 2)
@ -298,11 +358,13 @@ void Cvar_Help_f (void)
return;
}
cvar_name = Cmd_Argv (1);
if((var = Cvar_FindVar(cvar_name)) != NULL)
var_name = Cmd_Argv (1);
var = Cvar_FindVar (var_name);
if (!var)
var = Cvar_FindAlias (var_name);
if (var)
{
Con_Printf ("description: %s\nvalue: %s\n",var->description,
var->string);
Con_Printf ("%s\n",var->description);
return;
}
Con_Printf ("variable not found\n");
@ -333,7 +395,9 @@ void Cvar_Init()
void Cvar_Shutdown (void)
{
cvar_t *var,*next;
cvar_alias_t *alias,*nextalias;
// Free cvars
var = cvar_vars;
while(var)
{
@ -344,6 +408,15 @@ void Cvar_Shutdown (void)
free(var);
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;
int flags;
char *description; // for "help" command
// qboolean archive; // set to true to cause it to be saved to vars.rc
// 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;
float value;
struct cvar_s *next;
} 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_ARCHIVE 1 // set to cause it to be saved to vars.rc
// 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_Alias_Get (char *name, cvar_t *cvar);
void Cvar_Set (cvar_t *var, char *value);
// 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");
Cvar_Alias_Get ("_windowed_mouse", in_grab);
m_filter = Cvar_Get ("m_filter","0",CVAR_ARCHIVE,"None");
#ifdef HAS_DGA
vid_dga_mouseaccel = Cvar_Get ("vid_dga_mouseaccel","1",CVAR_ARCHIVE,