Home | History | Annotate | Download | only in WinQuake
      1 /*
      2 Copyright (C) 1996-1997 Id Software, Inc.
      3 
      4 This program is free software; you can redistribute it and/or
      5 modify it under the terms of the GNU General Public License
      6 as published by the Free Software Foundation; either version 2
      7 of the License, or (at your option) any later version.
      8 
      9 This program is distributed in the hope that it will be useful,
     10 but WITHOUT ANY WARRANTY; without even the implied warranty of
     11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     12 
     13 See the GNU General Public License for more details.
     14 
     15 You should have received a copy of the GNU General Public License
     16 along with this program; if not, write to the Free Software
     17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
     18 
     19 */
     20 // cvar.c -- dynamic variable tracking
     21 
     22 #include "quakedef.h"
     23 
     24 cvar_t	*cvar_vars;
     25 const char	*cvar_null_string = "";
     26 
     27 /*
     28 ============
     29 Cvar_FindVar
     30 ============
     31 */
     32 cvar_t *Cvar_FindVar (const char *var_name)
     33 {
     34 	cvar_t	*var;
     35 
     36 	for (var=cvar_vars ; var ; var=var->next)
     37 		if (!Q_strcmp (var_name, var->name))
     38 			return var;
     39 
     40 	return NULL;
     41 }
     42 
     43 /*
     44 ============
     45 Cvar_VariableValue
     46 ============
     47 */
     48 float	Cvar_VariableValue (const char *var_name)
     49 {
     50 	cvar_t	*var;
     51 
     52 	var = Cvar_FindVar (var_name);
     53 	if (!var)
     54 		return 0;
     55 	return Q_atof (var->string);
     56 }
     57 
     58 
     59 /*
     60 ============
     61 Cvar_VariableString
     62 ============
     63 */
     64 const char *Cvar_VariableString (const char *var_name)
     65 {
     66 	cvar_t *var;
     67 
     68 	var = Cvar_FindVar (var_name);
     69 	if (!var)
     70 		return cvar_null_string;
     71 	return var->string;
     72 }
     73 
     74 
     75 /*
     76 ============
     77 Cvar_CompleteVariable
     78 ============
     79 */
     80 const char *Cvar_CompleteVariable (const char *partial)
     81 {
     82 	cvar_t		*cvar;
     83 	int			len;
     84 
     85 	len = Q_strlen(partial);
     86 
     87 	if (!len)
     88 		return NULL;
     89 
     90 // check functions
     91 	for (cvar=cvar_vars ; cvar ; cvar=cvar->next)
     92 		if (!Q_strncmp (partial,cvar->name, len))
     93 			return cvar->name;
     94 
     95 	return NULL;
     96 }
     97 
     98 
     99 /*
    100 ============
    101 Cvar_Set
    102 ============
    103 */
    104 void Cvar_Set (const char *var_name, const char *value)
    105 {
    106 	cvar_t	*var;
    107 	qboolean changed;
    108 
    109 	var = Cvar_FindVar (var_name);
    110 	if (!var)
    111 	{	// there is an error in C code if this happens
    112 		Con_Printf ("Cvar_Set: variable %s not found\n", var_name);
    113 		return;
    114 	}
    115 
    116 	changed = Q_strcmp(var->string, value);
    117 
    118 	Z_Free (var->string);	// free the old value string
    119 
    120 	var->string = (char*) Z_Malloc (Q_strlen(value)+1);
    121 	Q_strcpy (var->string, value);
    122 	var->value = Q_atof (var->string);
    123 	if (var->server && changed)
    124 	{
    125 		if (sv.active)
    126 			SV_BroadcastPrintf ("\"%s\" changed to \"%s\"\n", var->name, var->string);
    127 	}
    128 }
    129 
    130 /*
    131 ============
    132 Cvar_SetValue
    133 ============
    134 */
    135 void Cvar_SetValue (const char *var_name, float value)
    136 {
    137 	char	val[32];
    138 
    139 	sprintf (val, "%f",value);
    140 	Cvar_Set (var_name, val);
    141 }
    142 
    143 
    144 /*
    145 ============
    146 Cvar_RegisterVariable
    147 
    148 Adds a freestanding variable to the variable list.
    149 ============
    150 */
    151 void Cvar_RegisterVariable (cvar_t *variable)
    152 {
    153 	char	*oldstr;
    154 
    155 // first check to see if it has allready been defined
    156 	if (Cvar_FindVar (variable->name))
    157 	{
    158 		Con_Printf ("Can't register variable %s, allready defined\n", variable->name);
    159 		return;
    160 	}
    161 
    162 // check for overlap with a command
    163 	if (Cmd_Exists (variable->name))
    164 	{
    165 		Con_Printf ("Cvar_RegisterVariable: %s is a command\n", variable->name);
    166 		return;
    167 	}
    168 
    169 // copy the value off, because future sets will Z_Free it
    170 	oldstr = variable->string;
    171 	variable->string = (char*) Z_Malloc (Q_strlen(variable->string)+1);
    172 	Q_strcpy (variable->string, oldstr);
    173 	variable->value = Q_atof (variable->string);
    174 
    175 // link the variable in
    176 	variable->next = cvar_vars;
    177 	cvar_vars = variable;
    178 }
    179 
    180 /*
    181 ============
    182 Cvar_Command
    183 
    184 Handles variable inspection and changing from the console
    185 ============
    186 */
    187 qboolean	Cvar_Command (void)
    188 {
    189 	cvar_t			*v;
    190 
    191 // check variables
    192 	v = Cvar_FindVar (Cmd_Argv(0));
    193 	if (!v)
    194 		return false;
    195 
    196 // perform a variable print or set
    197 	if (Cmd_Argc() == 1)
    198 	{
    199 		Con_Printf ("\"%s\" is \"%s\"\n", v->name, v->string);
    200 		return true;
    201 	}
    202 
    203 	Cvar_Set (v->name, Cmd_Argv(1));
    204 	return true;
    205 }
    206 
    207 
    208 /*
    209 ============
    210 Cvar_WriteVariables
    211 
    212 Writes lines containing "set variable value" for all variables
    213 with the archive flag set to true.
    214 ============
    215 */
    216 void Cvar_WriteVariables (FILE *f)
    217 {
    218 	cvar_t	*var;
    219 
    220 	for (var = cvar_vars ; var ; var = var->next)
    221 		if (var->archive)
    222 			fprintf (f, "%s \"%s\"\n", var->name, var->string);
    223 }
    224 
    225