From d5e5b07ac9e809649c2241a50bfd8098e2ee97d5 Mon Sep 17 00:00:00 2001 From: Dan Olson Date: Sat, 6 May 2000 22:46:48 +0000 Subject: [PATCH] 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. --- common/cvar.c | 85 +++++++++++++++++++++++++++++++++++++++++++++---- common/cvar.h | 15 ++++++--- common/in_x11.c | 1 + 3 files changed, 90 insertions(+), 11 deletions(-) diff --git a/common/cvar.c b/common/cvar.c index 4b541ba..b89bd71 100644 --- a/common/cvar.c +++ b/common/cvar.c @@ -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; + } } diff --git a/common/cvar.h b/common/cvar.h index 64741a8..e4495e8 100644 --- a/common/cvar.h +++ b/common/cvar.h @@ -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 " " typed at the console diff --git a/common/in_x11.c b/common/in_x11.c index cb6d7fd..47c20c4 100644 --- a/common/in_x11.c +++ b/common/in_x11.c @@ -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,