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