From 6749aa353d47c28c7a4bb6d4de16ca207e592731 Mon Sep 17 00:00:00 2001 From: Maddes Buecher Date: Thu, 22 Jun 2000 12:23:54 +0000 Subject: [PATCH] 2000-06-22 common/cvar.h, common/cvar.c 1. Corrected CVAR_TEMP from 4906 to 4096 2. Added CVAR display function, to be used for all CVAR displays 3. Added CVAR range check (UQUAKE only) cvar->rangecheck (0 = none, 1 = float, 2 = integer, 3 = boolean) cvar->minvalue cvar->maxvalue Or should I used 3 flags? What about Cvar_get? 4. Fix for unnecessary CVAR changing/zone usage 5. Partial selection for CvarList command, you can now list all GL CVARs with CVARLIST GL Converted to the 'quakeforge' module from my previous fixes Available on the Quake Info Pool at http://www.inside3d.com/qip/ Don't forget to check out the buglist too. --- common/cvar.c | 196 ++++++++++++++++++++++++++++++++++++++++++++++++-- common/cvar.h | 7 +- 2 files changed, 196 insertions(+), 7 deletions(-) diff --git a/common/cvar.c b/common/cvar.c index 0b30b85..f6b9d98 100644 --- a/common/cvar.c +++ b/common/cvar.c @@ -53,6 +53,77 @@ char *cvar_null_string = ""; cvar_t *developer; cvar_alias_t *calias_vars; +// 2000-06-22 General cvar display by Maddes start +/* +============ +Cvar_Display + +same cvar display for all cvar commands +============ +*/ +void Cvar_Display (cvar_t *var) +{ + char val[32]; + int i; + + Con_Printf ("%c%c%c ", + (var->flags & CVAR_ARCHIVE) ? 'A' : ' ', // archived + (var->flags & CVAR_ROM) ? 'R' : ' ', // read-only + (var->flags & CVAR_USER_CREATED) ? 'U' : ' '); // user-created + + Con_Printf ("\"%s\" is \"%s\"", var->name, var->string); + +// 2000-06-22 Range check for cvars by Maddes start + if (var->rangecheck) + { + if (var->rangecheck == 3) // boolean + { + Con_Printf (" (bool: 0/1)"); + } + else if (var->rangecheck == 2) // integer + { + Con_Printf (" (int: %d-%d)", (int)var->minvalue, (int)var->maxvalue); + } + else + { + char val[32]; + int i; + + if (var->rangecheck == (int)var->minvalue) + { + sprintf (val, "%d", (int)var->minvalue); + } + else + { + sprintf (val, "%1f", var->minvalue); + for (i=Q_strlen(val)-1 ; i>0 && val[i]=='0' && val[i-1]!='.' ; i--) + { + val[i] = 0; + } + } + Con_Printf (" (float: %s-", val); + + if (var->maxvalue == (int)var->maxvalue) + { + sprintf (val, "%d", (int)var->maxvalue); + } + else + { + sprintf (val, "%1f", var->maxvalue); + for (i=Q_strlen(val)-1 ; i>0 && val[i]=='0' && val[i-1]!='.' ; i--) + { + val[i] = 0; + } + } + Con_Printf ("%s)", val); + } + } +// 2000-06-22 Range check for cvars by Maddes end + + Con_Printf ("\n"); +} +// 2000-06-22 General cvar display by Maddes end + /* ============ Cvar_FindVar @@ -226,6 +297,11 @@ void Cvar_Set (cvar_t *var, char *value) void Cvar_Set (cvar_t *var, char *value) { qboolean changed; +// 2000-06-22 Range check for cvars by Maddes start + char val[32]; + float newvalue; + int i; +// 2000-06-22 Range check for cvars by Maddes end if (!var) return; @@ -233,12 +309,82 @@ void Cvar_Set (cvar_t *var, char *value) // Don't change if this is a CVAR_ROM if(var->flags&CVAR_ROM) return; - changed = Q_strcmp(var->string, value); +// 2000-06-22 Range check for cvars by Maddes start + if (var->rangecheck) + { + newvalue = Q_atof (value); + + if (var->rangecheck == 3) // boolean + { + if (newvalue) + { + newvalue = 1; + } + else + { + newvalue = 0; + } + } + else + { + if (var->rangecheck == 2) // integer + { + newvalue = (int)newvalue; + } + + // check limits of newvalue + if (newvalue < var->minvalue) + { + newvalue = var->minvalue; + } + if (newvalue > var->maxvalue) + { + newvalue = var->maxvalue; + } + } + + if (newvalue == (int)newvalue) + { + sprintf (val, "%d", (int)newvalue); + } + else + { + sprintf (val, "%1f", newvalue); + for (i=Q_strlen(val)-1 ; i>0 && val[i]=='0' && val[i-1]!='.' ; i--) + { + val[i] = 0; + } + } + + changed = Q_strcmp(var->string, val); + } + else + { +// 2000-06-22 Range check for cvars by Maddes end + changed = Q_strcmp(var->string, value); + } // 2000-06-22 Range check for cvars by Maddes + +// 2000-06-22 Fix for unnecessary cvar changing/zone usage by Maddes start + if (!changed) // nothing changed, nothing to do + { + return; + } +// 2000-06-22 Fix for unnecessary cvar changing/zone usage by Maddes end Z_Free (var->string); // free the old value string - var->string = Z_Malloc (Q_strlen(value)+1); - Q_strcpy (var->string, value); +// 2000-06-22 Range check for cvars by Maddes start + if (var->rangecheck) + { + var->string = Z_Malloc (Q_strlen(val)+1); + Q_strcpy (var->string, val); + } + else + { +// 2000-06-22 Range check for cvars by Maddes end + var->string = Z_Malloc (Q_strlen(value)+1); + Q_strcpy (var->string, value); + } // 2000-06-22 Range check for cvars by Maddes var->value = Q_atof (var->string); if (var->flags&CVAR_USERINFO && changed) { @@ -270,7 +416,7 @@ qboolean Cvar_Command (void) // perform a variable print or set if (Cmd_Argc() == 1) { - Con_Printf ("\"%s\" is \"%s\"\n", v->name, v->string); + Cvar_Display (v); // 2000-06-22 General cvar display by Maddes return true; } @@ -372,12 +518,45 @@ void Cvar_CvarList_f (void) { cvar_t *var; int i; +// 2000-06-22 Partial selection for CvarList command by Maddes start + char *partial; + int len; + int count; + + if (Cmd_Argc() > 1) + { + partial = Cmd_Argv (1); + len = Q_strlen(partial); + } + else + { + partial = NULL; + len = 0; + } + + count=0; +// 2000-06-22 Partial selection for CvarList command by Maddes end for (var=cvar_vars, i=0 ; var ; var=var->next, i++) { - Con_Printf("%s\n",var->name); +// 2000-06-22 Partial selection for CvarList command by Maddes start + if (partial && Q_strncmp (partial,var->name, len)) + { + continue; + } + count++; +// 2000-06-22 Partial selection for CvarList command by Maddes end + Cvar_Display (var); // 2000-06-22 General cvar display by Maddes } - Con_Printf ("------------\n%d variables\n", i); + +// 2000-06-22 Partial selection for CvarList command by Maddes start + Con_Printf ("------------\n"); + if (partial) + { + Con_Printf ("%d beginning with \"%s\" out of ", count, partial); + } + Con_Printf ("%d variables\n", i); +// 2000-06-22 Partial selection for CvarList command by Maddes end } void Cvar_Init() @@ -440,6 +619,11 @@ cvar_t *Cvar_Get(char *name, char *string, int cvarflags, char *description) Q_strcpy (v->string, string); v->flags = cvarflags; v->description = strdup(description); +// 2000-06-22 Range check for cvars by Maddes start + v->rangecheck = 0; + v->minvalue = 0; + v->maxvalue = 0; +// 2000-06-22 Range check for cvars by Maddes end v->value = Q_atof (v->string); return v; } diff --git a/common/cvar.h b/common/cvar.h index 455a077..bca8371 100644 --- a/common/cvar.h +++ b/common/cvar.h @@ -41,6 +41,11 @@ typedef struct cvar_s int flags; char *description; // for "help" command float value; +// 2000-06-22 Range check for cvars by Maddes start + int rangecheck; // 0 = none, 1 = float, 2 = integer, 3 = boolean + float minvalue; // for range check + float maxvalue; // for range check +// 2000-06-22 Range check for cvars by Maddes end struct cvar_s *next; } cvar_t; @@ -69,7 +74,7 @@ typedef struct cvar_alias_s #define CVAR_NORESTART 1024 // do not clear when a cvar_restart is issued #define CVAR_LATCH 2048 // will only change when C code next does // a Cvar_Get(), so it can't be changed -#define CVAR_TEMP 4906 // can be set even when cheats are +#define CVAR_TEMP 4096 // can be set even when cheats are // disabled, but is not archived // Zoid| A good CVAR_ROM example is basepath. The code should read "cvar_t