X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=cvar.c;h=152a86aee4f52446aa95dd683d5b5484acfb4b09;hp=48d2814a7e94792eaa97f82adf23fd5372c7a035;hb=ea7c24e1fb41f3b1df984ac0eed6881c9fde16f5;hpb=8dcce44300385b12c46d494c06aadcfa35a8bc14;ds=sidebyside diff --git a/cvar.c b/cvar.c index 48d2814a..152a86ae 100644 --- a/cvar.c +++ b/cvar.c @@ -32,7 +32,7 @@ Cvar_FindVar cvar_t *Cvar_FindVar (char *var_name) { cvar_t *var; - + for (var=cvar_vars ; var ; var=var->next) if (!strcmp (var_name, var->name)) return var; @@ -48,7 +48,7 @@ Cvar_VariableValue float Cvar_VariableValue (char *var_name) { cvar_t *var; - + var = Cvar_FindVar (var_name); if (!var) return 0; @@ -64,7 +64,7 @@ Cvar_VariableString char *Cvar_VariableString (char *var_name) { cvar_t *var; - + var = Cvar_FindVar (var_name); if (!var) return cvar_null_string; @@ -81,12 +81,12 @@ char *Cvar_CompleteVariable (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)) @@ -96,52 +96,138 @@ char *Cvar_CompleteVariable (char *partial) } +/* + CVar_CompleteCountPossible + + New function for tab-completion system + Added by EvilTypeGuy + Thanks to Fett erich@heintz.com + +*/ +int +Cvar_CompleteCountPossible (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; +} + +/* + CVar_CompleteBuildList + + New function for tab-completion system + Added by EvilTypeGuy + Thanks to Fett erich@heintz.com + Thanks to taniwha + +*/ +char ** +Cvar_CompleteBuildList (char *partial) +{ + cvar_t *cvar; + int len = 0; + int bpos = 0; + int sizeofbuf = (Cvar_CompleteCountPossible (partial) + 1) * sizeof (char *); + char **buf; + + len = strlen(partial); + buf = Mem_Alloc(tempmempool, sizeofbuf + sizeof (char *)); + // Loop through the alias list and print all matches + for (cvar = cvar_vars; cvar; cvar = cvar->next) + if (!strncasecmp(partial, cvar->name, len)) + buf[bpos++] = cvar->name; + + buf[bpos] = NULL; + return buf; +} + /* ============ Cvar_Set ============ */ -void Cvar_Set (char *var_name, char *value) +void Cvar_SetQuick (cvar_t *var, 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_Printf("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) { if (sv.active) SV_BroadcastPrintf ("\"%s\" changed to \"%s\"\n", var->name, var->string); } } +void Cvar_Set (char *var_name, 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; + } + + Cvar_SetQuick(var, value); +} + /* ============ Cvar_SetValue ============ */ +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_SetQuick (var, val); +} + void Cvar_SetValue (char *var_name, float value) { char val[32]; - + // LordHavoc: changed from %f to %g to use shortest representation sprintf (val, "%g",value); Cvar_Set (var_name, val); } - /* ============ Cvar_RegisterVariable @@ -152,27 +238,28 @@ Adds a freestanding variable to the variable list. void Cvar_RegisterVariable (cvar_t *variable) { char *oldstr; - -// first check to see if it has allready been defined + +// first check to see if it has already been defined if (Cvar_FindVar (variable->name)) { - Con_Printf ("Can't register variable %s, allready 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); 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; @@ -193,7 +280,7 @@ qboolean Cvar_Command (void) v = Cvar_FindVar (Cmd_Argv(0)); if (!v) return false; - + // perform a variable print or set if (Cmd_Argc() == 1) { @@ -214,12 +301,51 @@ Writes lines containing "set variable value" for all variables with the archive flag set to true. ============ */ -void Cvar_WriteVariables (FILE *f) +void Cvar_WriteVariables (QFile *f) { cvar_t *var; - + for (var = cvar_vars ; var ; var = var->next) - if (var->archive) - fprintf (f, "%s \"%s\"\n", var->name, var->string); + if (var->flags & CVAR_SAVE) + Qprintf (f, "%s \"%s\"\n", var->name, var->string); +} + + +// Added by EvilTypeGuy eviltypeguy@qeradiant.com +// 2000-01-09 CvarList command By Matthias "Maddes" Buecher, http://www.inside3d.com/qip/ +/* +========= +Cvar_List +========= +*/ +void Cvar_List_f (void) +{ + cvar_t *cvar; + char *partial; + int len; + int count; + + if (Cmd_Argc() > 1) { + partial = Cmd_Argv (1); + len = strlen(partial); + } else { + partial = NULL; + len = 0; + } + + count = 0; + 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); + count++; + } + + Con_Printf ("%i cvar(s)", count); + if (partial) + Con_Printf (" beginning with \"%s\"", partial); + Con_Printf ("\n"); } +// 2000-01-09 CvarList command by Maddes