home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quake_src / cvar.c < prev    next >
C/C++ Source or Header  |  2000-06-17  |  4KB  |  225 lines

  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. char  *cvar_null_string = "";
  26.  
  27. /*
  28. ============
  29. Cvar_FindVar
  30. ============
  31. */
  32. cvar_t *Cvar_FindVar (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 (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. char *Cvar_VariableString (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. char *Cvar_CompleteVariable (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 (char *var_name, 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 = 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 (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 = 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.