|
|
1.1 ! root 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: #ifdef SERVERONLY ! 23: #include "qwsvdef.h" ! 24: #else ! 25: #include "quakedef.h" ! 26: #endif ! 27: ! 28: cvar_t *cvar_vars; ! 29: char *cvar_null_string = ""; ! 30: ! 31: /* ! 32: ============ ! 33: Cvar_FindVar ! 34: ============ ! 35: */ ! 36: cvar_t *Cvar_FindVar (char *var_name) ! 37: { ! 38: cvar_t *var; ! 39: ! 40: for (var=cvar_vars ; var ; var=var->next) ! 41: if (!Q_strcmp (var_name, var->name)) ! 42: return var; ! 43: ! 44: return NULL; ! 45: } ! 46: ! 47: /* ! 48: ============ ! 49: Cvar_VariableValue ! 50: ============ ! 51: */ ! 52: float Cvar_VariableValue (char *var_name) ! 53: { ! 54: cvar_t *var; ! 55: ! 56: var = Cvar_FindVar (var_name); ! 57: if (!var) ! 58: return 0; ! 59: return Q_atof (var->string); ! 60: } ! 61: ! 62: ! 63: /* ! 64: ============ ! 65: Cvar_VariableString ! 66: ============ ! 67: */ ! 68: char *Cvar_VariableString (char *var_name) ! 69: { ! 70: cvar_t *var; ! 71: ! 72: var = Cvar_FindVar (var_name); ! 73: if (!var) ! 74: return cvar_null_string; ! 75: return var->string; ! 76: } ! 77: ! 78: ! 79: /* ! 80: ============ ! 81: Cvar_CompleteVariable ! 82: ============ ! 83: */ ! 84: char *Cvar_CompleteVariable (char *partial) ! 85: { ! 86: cvar_t *cvar; ! 87: int len; ! 88: ! 89: len = Q_strlen(partial); ! 90: ! 91: if (!len) ! 92: return NULL; ! 93: ! 94: // check exact match ! 95: for (cvar=cvar_vars ; cvar ; cvar=cvar->next) ! 96: if (!strcmp (partial,cvar->name)) ! 97: return cvar->name; ! 98: ! 99: // check partial match ! 100: for (cvar=cvar_vars ; cvar ; cvar=cvar->next) ! 101: if (!Q_strncmp (partial,cvar->name, len)) ! 102: return cvar->name; ! 103: ! 104: return NULL; ! 105: } ! 106: ! 107: ! 108: #ifdef SERVERONLY ! 109: void SV_SendServerInfoChange(char *key, char *value); ! 110: #endif ! 111: ! 112: /* ! 113: ============ ! 114: Cvar_Set ! 115: ============ ! 116: */ ! 117: void Cvar_Set (char *var_name, char *value) ! 118: { ! 119: cvar_t *var; ! 120: ! 121: var = Cvar_FindVar (var_name); ! 122: if (!var) ! 123: { // there is an error in C code if this happens ! 124: Con_Printf ("Cvar_Set: variable %s not found\n", var_name); ! 125: return; ! 126: } ! 127: ! 128: #ifdef SERVERONLY ! 129: if (var->info) ! 130: { ! 131: Info_SetValueForKey (svs.info, var_name, value, MAX_SERVERINFO_STRING); ! 132: SV_SendServerInfoChange(var_name, value); ! 133: // SV_BroadcastCommand ("fullserverinfo \"%s\"\n", svs.info); ! 134: } ! 135: #else ! 136: if (var->info) ! 137: { ! 138: Info_SetValueForKey (cls.userinfo, var_name, value, MAX_INFO_STRING); ! 139: if (cls.state >= ca_connected) ! 140: { ! 141: MSG_WriteByte (&cls.netchan.message, clc_stringcmd); ! 142: SZ_Print (&cls.netchan.message, va("setinfo \"%s\" \"%s\"\n", var_name, value)); ! 143: } ! 144: } ! 145: #endif ! 146: ! 147: Z_Free (var->string); // free the old value string ! 148: ! 149: var->string = Z_Malloc (Q_strlen(value)+1); ! 150: Q_strcpy (var->string, value); ! 151: var->value = Q_atof (var->string); ! 152: } ! 153: ! 154: /* ! 155: ============ ! 156: Cvar_SetValue ! 157: ============ ! 158: */ ! 159: void Cvar_SetValue (char *var_name, float value) ! 160: { ! 161: char val[32]; ! 162: ! 163: sprintf (val, "%f",value); ! 164: Cvar_Set (var_name, val); ! 165: } ! 166: ! 167: ! 168: /* ! 169: ============ ! 170: Cvar_RegisterVariable ! 171: ! 172: Adds a freestanding variable to the variable list. ! 173: ============ ! 174: */ ! 175: void Cvar_RegisterVariable (cvar_t *variable) ! 176: { ! 177: char value[512]; ! 178: ! 179: // first check to see if it has allready been defined ! 180: if (Cvar_FindVar (variable->name)) ! 181: { ! 182: Con_Printf ("Can't register variable %s, allready defined\n", variable->name); ! 183: return; ! 184: } ! 185: ! 186: // check for overlap with a command ! 187: if (Cmd_Exists (variable->name)) ! 188: { ! 189: Con_Printf ("Cvar_RegisterVariable: %s is a command\n", variable->name); ! 190: return; ! 191: } ! 192: ! 193: // link the variable in ! 194: variable->next = cvar_vars; ! 195: cvar_vars = variable; ! 196: ! 197: // copy the value off, because future sets will Z_Free it ! 198: strcpy (value, variable->string); ! 199: variable->string = Z_Malloc (1); ! 200: ! 201: // set it through the function to be consistant ! 202: Cvar_Set (variable->name, value); ! 203: } ! 204: ! 205: /* ! 206: ============ ! 207: Cvar_Command ! 208: ! 209: Handles variable inspection and changing from the console ! 210: ============ ! 211: */ ! 212: qboolean Cvar_Command (void) ! 213: { ! 214: cvar_t *v; ! 215: ! 216: // check variables ! 217: v = Cvar_FindVar (Cmd_Argv(0)); ! 218: if (!v) ! 219: return false; ! 220: ! 221: // perform a variable print or set ! 222: if (Cmd_Argc() == 1) ! 223: { ! 224: Con_Printf ("\"%s\" is \"%s\"\n", v->name, v->string); ! 225: return true; ! 226: } ! 227: ! 228: Cvar_Set (v->name, Cmd_Argv(1)); ! 229: return true; ! 230: } ! 231: ! 232: ! 233: /* ! 234: ============ ! 235: Cvar_WriteVariables ! 236: ! 237: Writes lines containing "set variable value" for all variables ! 238: with the archive flag set to true. ! 239: ============ ! 240: */ ! 241: void Cvar_WriteVariables (FILE *f) ! 242: { ! 243: cvar_t *var; ! 244: ! 245: for (var = cvar_vars ; var ; var = var->next) ! 246: if (var->archive) ! 247: fprintf (f, "%s \"%s\"\n", var->name, var->string); ! 248: } ! 249:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.