]> icculus.org git repositories - btb/d2x.git/blob - main/cvar.c
dont try to set a nonexistent cvar
[btb/d2x.git] / main / cvar.c
1 /* Console variables */
2
3
4 #ifdef HAVE_CONFIG_H
5 #include <conf.h>
6 #endif
7
8 #include <stdlib.h>
9 #include <float.h>
10
11 #include "cvar.h"
12 #include "error.h"
13 #include "strutil.h"
14 #include "u_mem.h"
15
16
17 #define CVAR_MAX_LENGTH 1024
18
19
20 /* The list of cvars */
21 cvar_t *cvar_list = NULL;
22
23 int cvar_initialized = 0;
24
25
26 void cvar_free(void)
27 {
28         cvar_t *ptr;
29
30         for (ptr = cvar_list; ptr != NULL; ptr = ptr->next)
31                 d_free(ptr->string);
32 }
33
34
35 void cvar_init(void)
36 {
37         atexit(cvar_free);
38         cvar_initialized = 1;
39 }
40
41
42 cvar_t *cvar_find(char *cvar_name)
43 {
44         cvar_t *ptr;
45
46         for (ptr = cvar_list; ptr != NULL; ptr = ptr->next)
47                 if (!stricmp(cvar_name, ptr->name))
48                         return ptr;
49
50         return NULL;
51 }
52
53
54 char *cvar_complete(char *text)
55 {
56         cvar_t *ptr;
57         int len = strlen(text);
58
59         if (!len)
60                 return NULL;
61
62         for (ptr = cvar_list; ptr != NULL; ptr = ptr->next)
63                 if (!strnicmp(text, ptr->name, len))
64                         return ptr->name;
65
66         return NULL;
67 }
68
69
70 #define cvar_round(x) ((x)>=0?(int)((x)+0.5):(int)((x)-0.5))
71
72 /* Register a cvar */
73 void cvar_registervariable (cvar_t *cvar)
74 {
75         char *stringval;
76         cvar_t *ptr;
77
78         if (!cvar_initialized)
79                 cvar_init();
80
81         Assert(cvar != NULL);
82
83         stringval = cvar->string;
84
85         cvar->string = d_strdup(stringval);
86         cvar->value = strtod(cvar->string, (char **) NULL);
87         cvar->intval = cvar_round(cvar->value);
88         cvar->next = NULL;
89
90         if (cvar_list == NULL) {
91                 cvar_list = cvar;
92                 return;
93         }
94
95         /* insert at end of list */
96         for (ptr = cvar_list; ptr->next != NULL; ptr = ptr->next)
97                 Assert(stricmp(cvar->name, ptr->name));
98         ptr->next = cvar;
99 }
100
101
102 /* Set a CVar's value */
103 void cvar_set_cvar(cvar_t *cvar, char *value)
104 {
105         if (!cvar)
106                 return;
107
108         d_free(cvar->string);
109         cvar->string = d_strdup(value);
110         cvar->value = strtod(cvar->string, (char **) NULL);
111         cvar->intval = cvar_round(cvar->value);
112 }
113
114
115 void cvar_set_cvarf(cvar_t *cvar, char *fmt, ...)
116 {
117         va_list arglist;
118         char buf[CVAR_MAX_LENGTH];
119         int n;
120
121         va_start (arglist, fmt);
122         n = vsnprintf (buf, CVAR_MAX_LENGTH, fmt, arglist);
123         va_end (arglist);
124
125         Assert(!(n < 0 || n > CVAR_MAX_LENGTH));
126
127         cvar_set_cvar(cvar, buf);
128 }
129
130
131 void cvar_set (char *cvar_name, char *value)
132 {
133         cvar_set_cvar(cvar_find(cvar_name), value);
134 }
135
136
137 /* Get a CVar's value */
138 float cvar (char *cvar_name)
139 {
140         cvar_t *cvar;
141
142         cvar = cvar_find(cvar_name);
143
144         if (!cvar)
145                 return 0.0; // If we didn't find the cvar, give up
146
147         return cvar->value;
148 }
149
150
151 /* Write archive cvars to file */
152 void cvar_write(CFILE *file)
153 {
154         cvar_t *ptr;
155
156         for (ptr = cvar_list; ptr != NULL; ptr = ptr->next)
157                 if (ptr->archive)
158                         PHYSFSX_printf(file, "%s=%s\n", ptr->name, ptr->string);
159 }