/*
Copyright (C) 1996-1997 Id Software, Inc.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  

See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/

///////////////////////////////////////////////////////////////////////////
/// @file	cvar.h
/// @brief	Contains the cvar (console variable) struct and cvar related
///			functions.
///////////////////////////////////////////////////////////////////////////

/*
cvar_t variables are used to hold scalar or string variables that can be changed or displayed at
the console or prog code as well as accessed directly in C code.

it is sufficient to initialize a cvar_t with just the first two fields, or
you can add a ,true flag for variables that you want saved to the configuration
file when the game is quit:

cvar_t	r_draworder = {"r_draworder","1"};
cvar_t	scr_screensize = {"screensize","1",true};

Cvars must be registered before use, or they will have a 0 value
instead of the float interpretation of the string.  Generally, all
cvar_t declarations should be registered in the appropriate init
function before any console commands are executed:
Cvar_RegisterVariable (&host_framerate);


C code usually just references a cvar in place:
if ( r_draworder.value )

It could optionally ask for the value to be looked up for a string name:
if (Cvar_VariableValue ("r_draworder"))

Interpreted prog code can access cvars with the cvar(name) or
cvar_set (name, value) internal functions:
teamplay = cvar("teamplay");
cvar_set ("registered", "1");

The user can access cvars from the console in two ways:
r_draworder			prints the current value
r_draworder 0		sets the current value to 0
Cvars are restricted from having the same names as commands to keep this
interface from being ambiguous.
*/

///////////////////////////////////////////////////////////////////////////
/// @brief	Console Variable
///			It's a <a href="http://en.wikipedia.org/wiki/Linked_list">Linked List</a>
///			It's great for storing console variables!
///////////////////////////////////////////////////////////////////////////
typedef struct cvar_s
{
	char	*name;			///< Cvar's Name
	char	*string;		///< Cvar's value in string form
	bool	archive;		///< Set to true to cause it to be saved to vars.rc
	bool	server;			///< Notifies players when changed
	float	value;			///< Cvar's value
	struct cvar_s *next;	///< The next cvar in the linked list
} cvar_t;

void 	Cvar_RegisterVariable (cvar_t *variable);
void 	Cvar_Set (char *var_name, char *value);
void	Cvar_SetValue (char *var_name, float value);
float	Cvar_VariableValue (char *var_name);
char	*Cvar_VariableString (char *var_name);
char 	*Cvar_CompleteVariable (char *partial);
bool	Cvar_Command (void);
void	Cvar_WriteVariables (FILE *f);
cvar_t	*Cvar_FindVar (char *var_name);

extern cvar_t	*cvar_vars;
