Cvar_UpdateAutoCvar(var);
}
+void Cvar_Callback(cvar_t *var)
+{
+ if (var == NULL)
+ {
+ Con_Print("Cvar_Callback: var == NULL\n");
+ return;
+ }
+
+ if(var->callback)
+ var->callback(var);
+}
+
/*
============
Cvar_Set
Cvar_UpdateAutoCvar(var);
// Call the function stored in the cvar for bounds checking, cleanup, etc
- if (var->callback)
- var->callback(var);
+ Cvar_Callback(var);
}
void Cvar_SetQuick (cvar_t *var, const char *value)
Cvar_SetQuick(var, value);
}
-void Cvar_Set_NoCallback(cvar_t *var, const char *value)
-{
- void (*callback_save)(cvar_t *) = var->callback;
- var->callback = NULL;
- Cvar_SetQuick_Internal(var, value);
- var->callback = callback_save;
-}
-
/*
============
Cvar_SetValue
void Cvar_RegisterCallback(cvar_t *variable, void (*callback)(cvar_t *))
{
+ if (variable == NULL)
+ {
+ Con_Print("Cvar_RegisterCallback: var == NULL\n");
+ return;
+ }
variable->callback = callback;
}
{
cvar_state_t *cvars = NULL;
cvar_t *current, *cvar;
- char *oldstr;
- size_t alloclen;
int i;
switch (variable->flags & (CF_CLIENT | CF_SERVER))
}
// check for overlap with a command
- if (Cmd_Exists(&cmd_client, variable->name) || Cmd_Exists(&cmd_server, variable->name))
+ if (Cmd_Exists(cmd_client, variable->name) || Cmd_Exists(cmd_server, variable->name))
{
Con_Printf("Cvar_RegisterVariable: %s is a command\n", variable->name);
return;
}
// copy the value off, because future sets will Z_Free it
- oldstr = (char *)variable->string;
- alloclen = strlen(variable->string) + 1;
- variable->string = (char *)Z_Malloc (alloclen);
- memcpy ((char *)variable->string, oldstr, alloclen);
- variable->defstring = (char *)Z_Malloc (alloclen);
- memcpy ((char *)variable->defstring, oldstr, alloclen);
+ variable->name = (char *)Mem_strdup(zonemempool, variable->name);
+ variable->string = (char *)Mem_strdup(zonemempool, variable->string);
+ variable->defstring = (char *)Mem_strdup(zonemempool, variable->string);
variable->value = atof (variable->string);
variable->integer = (int) variable->value;
variable->aliasindex = 0;
+ variable->initstate = NULL;
// Mark it as not an autocvar.
for (i = 0;i < PRVM_PROG_MAX;i++)
}
// check for overlap with a command
- if (Cmd_Exists(&cmd_client, name) || Cmd_Exists(&cmd_server, name))
+ if (Cmd_Exists(cmd_client, name) || Cmd_Exists(cmd_server, name))
{
Con_Printf("Cvar_Get: %s is a command\n", name);
return NULL;
cvar->value = atof (cvar->string);
cvar->integer = (int) cvar->value;
cvar->aliases = (char **)Z_Malloc(sizeof(char **));
+ cvar->initstate = NULL;
memset(cvar->aliases, 0, sizeof(char *));
if(newdescription && *newdescription)
cvar_t *c;
for (c = cvars->vars;c;c = c->next)
{
- c->initstate = true;
- c->initflags = c->flags;
- c->initdefstring = Mem_strdup(zonemempool, c->defstring);
- c->initstring = Mem_strdup(zonemempool, c->string);
- c->initvalue = c->value;
- c->initinteger = c->integer;
- VectorCopy(c->vector, c->initvector);
+ c->initstate = (cvar_t *)Z_Malloc(sizeof(cvar_t));
+ memcpy(c->initstate, c, sizeof(cvar_t));
}
}
if (c->initstate)
{
// restore this cvar, it existed at init
- if (((c->flags ^ c->initflags) & CF_MAXFLAGSVAL)
- || strcmp(c->defstring ? c->defstring : "", c->initdefstring ? c->initdefstring : "")
- || strcmp(c->string ? c->string : "", c->initstring ? c->initstring : ""))
+ if (((c->flags ^ c->initstate->flags) & CF_MAXFLAGSVAL)
+ || strcmp(c->defstring ? c->defstring : "", c->initstate->defstring ? c->initstate->defstring : "")
+ || strcmp(c->string ? c->string : "", c->initstate->string ? c->initstate->string : ""))
{
Con_DPrintf("Cvar_RestoreInitState: Restoring cvar \"%s\"\n", c->name);
if (c->defstring)
Z_Free((char *)c->defstring);
- c->defstring = Mem_strdup(zonemempool, c->initdefstring);
+ c->defstring = Mem_strdup(zonemempool, c->initstate->defstring);
if (c->string)
Z_Free((char *)c->string);
- c->string = Mem_strdup(zonemempool, c->initstring);
+ c->string = Mem_strdup(zonemempool, c->initstate->string);
}
- c->flags = c->initflags;
- c->value = c->initvalue;
- c->integer = c->initinteger;
- VectorCopy(c->initvector, c->vector);
+ c->flags = c->initstate->flags;
+ c->value = c->initstate->value;
+ c->integer = c->initstate->integer;
+ VectorCopy(c->initstate->vector, c->vector);
cp = &c->next;
}
else