gzdoom/code/C_cvars.c

156 lines
2.8 KiB
C
Raw Normal View History

1998-04-07 00:00:00 +00:00
#include <string.h>
#include <stdio.h>
1998-04-07 00:00:00 +00:00
#include "m_alloc.h"
1998-04-07 00:00:00 +00:00
#include "c_cvars.h"
#include "d_player.h"
1998-04-07 00:00:00 +00:00
#include "d_netinfo.h"
1998-04-07 00:00:00 +00:00
static boolean donoset = false;
cvar_t *CVars = NULL;
cvar_t *FindCVar (char *var_name, cvar_t **prev)
{
cvar_t *var;
var = CVars;
*prev = NULL;
while (var) {
if (stricmp (var->name, var_name) == 0)
break;
*prev = var;
var = var->next;
}
return var;
}
void SetCVar (cvar_t *var, char *value)
{
if (var->flags & CVAR_LATCH && !var->modified) {
var->modified = true;
var->latched_string = var->string;
var->string = NULL;
}
if (var->string)
free (var->string);
1998-04-07 00:00:00 +00:00
var->string = Malloc (strlen (value) + 1);
1998-04-07 00:00:00 +00:00
strcpy (var->string, value);
var->value = (float)atof (value);
1998-04-07 00:00:00 +00:00
if (var->flags & CVAR_USERINFO)
D_UserInfoChanged (var);
1998-04-07 00:00:00 +00:00
}
void SetCVarFloat (cvar_t *var, float value)
{
char string[32];
sprintf (string, "%g", value);
SetCVar (var, string);
}
cvar_t *cvar (char *var_name, char *value, int flags)
{
cvar_t *var, *dummy;
var = FindCVar (var_name, &dummy);
if (!var) {
1998-04-07 00:00:00 +00:00
var = Malloc (sizeof(cvar_t));
var->name = Malloc (strlen (var_name) + 1);
1998-04-07 00:00:00 +00:00
strcpy (var->name, var_name);
var->string = NULL;
var->latched_string = NULL;
var->flags = 0;
var->modified = false;
SetCVar (var, value);
var->flags = flags;
var->next = CVars;
CVars = var;
}
return var;
}
cvar_t *cvar_set (char *var_name, char *value)
{
cvar_t *var, *dummy;
if (var = FindCVar (var_name, &dummy))
if (!(var->flags & CVAR_NOSET) || !donoset)
SetCVar (var, value);
return var;
}
cvar_t *cvar_forceset (char *var_name, char *value)
{
cvar_t *var, *dummy;
if (var = FindCVar (var_name, &dummy))
SetCVar (var, value);
return var;
}
void Cmd_Set (player_t *plyr, int argc, char **argv)
{
cvar_t *var, *prev;
if (argc == 2) {
if (var = FindCVar (argv[1], &prev)) {
if (var->flags & CVAR_UNSETTABLE) {
if (prev)
prev->next = var->next;
else
CVars = var->next;
free (var);
} else {
Printf ("set: could not unset \"%s\"\n", argv[1]);
}
}
} else if (argc >= 3) {
if (!cvar_set (argv[1], argv[2]))
cvar (argv[1], argv[2], CVAR_UNSETTABLE);
} else {
var = CVars;
while (var) {
Printf ("\"%s\" is \"%s\"\n", var->name, var->string);
var = var->next;
}
}
}
void Cmd_Get (player_t *plyr, int argc, char **argv)
{
cvar_t *var, *prev;
if (argc >= 2) {
if (var = FindCVar (argv[1], &prev)) {
Printf ("\"%s\" is \"%s\"\n", var->name, var->string);
} else {
Printf ("\"%s\" is unset\n", argv[1]);
}
} else {
Printf ("get: need variable name\n");
}
}
void Cmd_Toggle (player_t *plyr, int argc, char **argv)
{
cvar_t *var, *prev;
if (argc > 1) {
if (var = FindCVar (argv[1], &prev)) {
SetCVarFloat (var, (float)(!var->value));
Printf ("\"%s\" is \"%s\"\n", var->name, var->string);
}
}
}
void C_EnableNoSet (void)
{
donoset = true;
}