X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=cvar.c;h=98a7207eef5d54be079a76669450cdcbc1a25e38;hb=a1758cde68fceb657abc5995cf1d7f28df9060f8;hp=318adc4502893c2e5136b4487750c8017d5a8c7a;hpb=beba2f9a1752c871a39303e5d559e779fac69271;p=xonotic%2Fdarkplaces.git diff --git a/cvar.c b/cvar.c index 318adc45..98a7207e 100644 --- a/cvar.c +++ b/cvar.c @@ -8,7 +8,7 @@ of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. @@ -21,34 +21,58 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "quakedef.h" -cvar_t *cvar_vars; -char *cvar_null_string = ""; +cvar_t *cvar_vars = NULL; +char *cvar_null_string = ""; /* ============ Cvar_FindVar ============ */ -cvar_t *Cvar_FindVar (char *var_name) +cvar_t *Cvar_FindVar (const char *var_name) { - cvar_t *var; - - for (var=cvar_vars ; var ; var=var->next) + cvar_t *var; + + for (var = cvar_vars;var;var = var->next) if (!strcmp (var_name, var->name)) return var; return NULL; } +cvar_t *Cvar_FindVarAfter (const char *prev_var_name, int neededflags) +{ + cvar_t *var; + + if (*prev_var_name) + { + var = Cvar_FindVar (prev_var_name); + if (!var) + return NULL; + var = var->next; + } + else + var = cvar_vars; + + // search for the next cvar matching the needed flags + while (var) + { + if ((var->flags & neededflags) || !neededflags) + break; + var = var->next; + } + return var; +} + /* ============ Cvar_VariableValue ============ */ -float Cvar_VariableValue (char *var_name) +float Cvar_VariableValue (const char *var_name) { - cvar_t *var; - + cvar_t *var; + var = Cvar_FindVar (var_name); if (!var) return 0; @@ -61,10 +85,10 @@ float Cvar_VariableValue (char *var_name) Cvar_VariableString ============ */ -char *Cvar_VariableString (char *var_name) +const char *Cvar_VariableString (const char *var_name) { cvar_t *var; - + var = Cvar_FindVar (var_name); if (!var) return cvar_null_string; @@ -77,16 +101,16 @@ char *Cvar_VariableString (char *var_name) Cvar_CompleteVariable ============ */ -char *Cvar_CompleteVariable (char *partial) +const char *Cvar_CompleteVariable (const char *partial) { cvar_t *cvar; int len; - + len = strlen(partial); - + if (!len) return NULL; - + // check functions for (cvar=cvar_vars ; cvar ; cvar=cvar->next) if (!strncmp (partial,cvar->name, len)) @@ -104,24 +128,23 @@ char *Cvar_CompleteVariable (char *partial) Thanks to Fett erich@heintz.com */ -int -Cvar_CompleteCountPossible (char *partial) +int Cvar_CompleteCountPossible (const char *partial) { cvar_t *cvar; int len; int h; - + h = 0; len = strlen(partial); - + if (!len) return 0; - + // Loop through the cvars and count all possible matches for (cvar = cvar_vars; cvar; cvar = cvar->next) if (!strncasecmp(partial, cvar->name, len)) h++; - + return h; } @@ -134,17 +157,16 @@ Cvar_CompleteCountPossible (char *partial) Thanks to taniwha */ -char ** -Cvar_CompleteBuildList (char *partial) +const char **Cvar_CompleteBuildList (const char *partial) { - cvar_t *cvar; - int len = 0; - int bpos = 0; - int sizeofbuf = (Cvar_CompleteCountPossible (partial) + 1) * sizeof (char *); - char **buf; + const cvar_t *cvar; + int len = 0; + int bpos = 0; + int sizeofbuf = (Cvar_CompleteCountPossible (partial) + 1) * sizeof (const char *); + const char **buf; len = strlen(partial); - buf = malloc(sizeofbuf + sizeof (char *)); + buf = Mem_Alloc(tempmempool, sizeofbuf + sizeof (const char *)); // Loop through the alias list and print all matches for (cvar = cvar_vars; cvar; cvar = cvar->next) if (!strncasecmp(partial, cvar->name, len)) @@ -152,37 +174,59 @@ Cvar_CompleteBuildList (char *partial) buf[bpos] = NULL; return buf; -} +} /* ============ Cvar_Set ============ */ -void Cvar_Set (char *var_name, char *value) +void Cvar_SetQuick (cvar_t *var, const char *value) { - cvar_t *var; qboolean changed; - - var = Cvar_FindVar (var_name); - if (!var) - { // there is an error in C code if this happens - Con_Printf ("Cvar_Set: variable %s not found\n", var_name); + + if (var == NULL) + { + Con_Print("Cvar_SetQuick: var == NULL\n"); return; } changed = strcmp(var->string, value); - - Z_Free (var->string); // free the old value string - - var->string = Z_Malloc (strlen(value)+1); + // LordHavoc: don't reallocate when there is no change + if (!changed) + return; + + // LordHavoc: don't reallocate when the buffer is the same size + if (!var->string || strlen(var->string) != strlen(value)) + { + Z_Free (var->string); // free the old value string + + var->string = Z_Malloc (strlen(value)+1); + } strcpy (var->string, value); var->value = atof (var->string); - if (var->server && changed) + var->integer = (int) var->value; + if ((var->flags & CVAR_NOTIFY) && changed && sv.active) + SV_BroadcastPrintf("\"%s\" changed to \"%s\"\n", var->name, var->string); +} + +void Cvar_Set (const char *var_name, const char *value) +{ + cvar_t *var; + var = Cvar_FindVar (var_name); + if (var == NULL) + { + // there is an error in C code if this happens + Con_Printf("Cvar_Set: variable %s not found\n", var_name); + return; + } + if (var->flags & CVAR_READONLY) { - if (sv.active) - SV_BroadcastPrintf ("\"%s\" changed to \"%s\"\n", var->name, var->string); + Con_Printf("Cvar_Set: %s is read-only\n", var_name); + return; } + + Cvar_SetQuick(var, value); } /* @@ -190,15 +234,27 @@ void Cvar_Set (char *var_name, char *value) Cvar_SetValue ============ */ -void Cvar_SetValue (char *var_name, float value) +void Cvar_SetValueQuick(cvar_t *var, float value) { - char val[32]; - - // LordHavoc: changed from %f to %g to use shortest representation - sprintf (val, "%g",value); - Cvar_Set (var_name, val); + char val[256]; + + if ((float)((int)value) == value) + sprintf(val, "%i", (int)value); + else + sprintf(val, "%f", value); + Cvar_SetQuick(var, val); } +void Cvar_SetValue(const char *var_name, float value) +{ + char val[256]; + + if ((float)((int)value) == value) + sprintf(val, "%i", (int)value); + else + sprintf(val, "%f", value); + Cvar_Set(var_name, val); +} /* ============ @@ -210,27 +266,28 @@ Adds a freestanding variable to the variable list. void Cvar_RegisterVariable (cvar_t *variable) { char *oldstr; - + // first check to see if it has already been defined if (Cvar_FindVar (variable->name)) { - Con_Printf ("Can't register variable %s, already defined\n", variable->name); + Con_Printf("Can't register variable %s, already defined\n", variable->name); return; } - + // check for overlap with a command if (Cmd_Exists (variable->name)) { - Con_Printf ("Cvar_RegisterVariable: %s is a command\n", variable->name); + Con_Printf("Cvar_RegisterVariable: %s is a command\n", variable->name); return; } - + // copy the value off, because future sets will Z_Free it oldstr = variable->string; - variable->string = Z_Malloc (strlen(variable->string)+1); + variable->string = Z_Malloc (strlen(variable->string)+1); strcpy (variable->string, oldstr); variable->value = atof (variable->string); - + variable->integer = (int) variable->value; + // link the variable in variable->next = cvar_vars; cvar_vars = variable; @@ -251,11 +308,13 @@ qboolean Cvar_Command (void) v = Cvar_FindVar (Cmd_Argv(0)); if (!v) return false; - + // perform a variable print or set if (Cmd_Argc() == 1) { - Con_Printf ("\"%s\" is \"%s\"\n", v->name, v->string); + // only print if host_initialized (otherwise it could print twice if this is in a script) + if (host_initialized) + Con_Printf("\"%s\" is \"%s\"\n", v->name, v->string); return true; } @@ -272,13 +331,13 @@ Writes lines containing "set variable value" for all variables with the archive flag set to true. ============ */ -void Cvar_WriteVariables (QFile *f) +void Cvar_WriteVariables (qfile_t *f) { cvar_t *var; - + for (var = cvar_vars ; var ; var = var->next) - if (var->archive) - Qprintf (f, "%s \"%s\"\n", var->name, var->string); + if (var->flags & CVAR_SAVE) + FS_Printf(f, "%s \"%s\"\n", var->name, var->string); } @@ -291,31 +350,35 @@ Cvar_List */ void Cvar_List_f (void) { - cvar_t *cvar; - char *partial; - int len; - int count; + cvar_t *cvar; + const char *partial; + int len, count; - if (Cmd_Argc() > 1) { + if (Cmd_Argc() > 1) + { partial = Cmd_Argv (1); len = strlen(partial); - } else { + } + else + { partial = NULL; len = 0; } count = 0; - for (cvar = cvar_vars; cvar; cvar = cvar->next) { + for (cvar = cvar_vars; cvar; cvar = cvar->next) + { if (partial && strncmp (partial,cvar->name,len)) continue; - Con_Printf ("%s is \"%s\"\n", cvar->name, cvar->string); + Con_Printf("%s is \"%s\"\n", cvar->name, cvar->string); count++; } - Con_Printf ("%i cvar(s)", count); + Con_Printf("%i cvar(s)", count); if (partial) - Con_Printf (" beginning with \"%s\"", partial); - Con_Printf ("\n"); + Con_Printf(" beginning with \"%s\"", partial); + Con_Print("\n"); } // 2000-01-09 CvarList command by Maddes +