]> icculus.org git repositories - btb/d2x.git/blob - main/cvar.c
add explicit set command. concatenate all args when setting
[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 "console.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_cmd_set(int argc, char **argv)
36 {
37         char buf[CVAR_MAX_LENGTH];
38         int ret, i;
39
40         if (argc < 3)
41                 return;
42
43         ret = snprintf(buf, CVAR_MAX_LENGTH, "%s", argv[2]);
44         if (ret >= CVAR_MAX_LENGTH) {
45                 con_printf(CON_CRITICAL, "set: value too long (max %d characters)\n", CVAR_MAX_LENGTH);
46                 return;
47         }
48
49         for (i = 3; i < argc; i++) {
50                 ret = snprintf(buf, CVAR_MAX_LENGTH, "%s %s", buf, argv[i]);
51                 if (ret >= CVAR_MAX_LENGTH) {
52                         con_printf(CON_CRITICAL, "set: value too long (max %d characters)\n", CVAR_MAX_LENGTH);
53                         return;
54                 }
55         }
56         cvar_set(argv[1], buf);
57 }
58
59
60 void cvar_init(void)
61 {
62         cmd_addcommand("set", cvar_cmd_set);
63
64         atexit(cvar_free);
65         cvar_initialized = 1;
66 }
67
68
69 cvar_t *cvar_find(char *cvar_name)
70 {
71         cvar_t *ptr;
72
73         for (ptr = cvar_list; ptr != NULL; ptr = ptr->next)
74                 if (!stricmp(cvar_name, ptr->name))
75                         return ptr;
76
77         return NULL;
78 }
79
80
81 char *cvar_complete(char *text)
82 {
83         cvar_t *ptr;
84         int len = strlen(text);
85
86         if (!len)
87                 return NULL;
88
89         for (ptr = cvar_list; ptr != NULL; ptr = ptr->next)
90                 if (!strnicmp(text, ptr->name, len))
91                         return ptr->name;
92
93         return NULL;
94 }
95
96
97 #define cvar_round(x) ((x)>=0?(int)((x)+0.5):(int)((x)-0.5))
98
99 /* Register a cvar */
100 void cvar_registervariable (cvar_t *cvar)
101 {
102         char *stringval;
103         cvar_t *ptr;
104
105         if (!cvar_initialized)
106                 cvar_init();
107
108         Assert(cvar != NULL);
109
110         stringval = cvar->string;
111
112         cvar->string = d_strdup(stringval);
113         cvar->value = strtod(cvar->string, (char **) NULL);
114         cvar->intval = cvar_round(cvar->value);
115         cvar->next = NULL;
116
117         if (cvar_list == NULL) {
118                 cvar_list = cvar;
119                 return;
120         }
121
122         /* insert at end of list */
123         for (ptr = cvar_list; ptr->next != NULL; ptr = ptr->next)
124                 Assert(stricmp(cvar->name, ptr->name));
125         ptr->next = cvar;
126 }
127
128
129 /* Set a CVar's value */
130 void cvar_set_cvar(cvar_t *cvar, char *value)
131 {
132         if (!cvar)
133                 return;
134
135         d_free(cvar->string);
136         cvar->string = d_strdup(value);
137         cvar->value = strtod(cvar->string, (char **) NULL);
138         cvar->intval = cvar_round(cvar->value);
139 }
140
141
142 void cvar_set_cvarf(cvar_t *cvar, char *fmt, ...)
143 {
144         va_list arglist;
145         char buf[CVAR_MAX_LENGTH];
146         int n;
147
148         va_start (arglist, fmt);
149         n = vsnprintf (buf, CVAR_MAX_LENGTH, fmt, arglist);
150         va_end (arglist);
151
152         Assert(!(n < 0 || n > CVAR_MAX_LENGTH));
153
154         cvar_set_cvar(cvar, buf);
155 }
156
157
158 void cvar_set (char *cvar_name, char *value)
159 {
160         cvar_set_cvar(cvar_find(cvar_name), value);
161 }
162
163
164 /* Get a CVar's value */
165 float cvar (char *cvar_name)
166 {
167         cvar_t *cvar;
168
169         cvar = cvar_find(cvar_name);
170
171         if (!cvar)
172                 return 0.0; // If we didn't find the cvar, give up
173
174         return cvar->value;
175 }
176
177
178 /* Write archive cvars to file */
179 void cvar_write(CFILE *file)
180 {
181         cvar_t *ptr;
182
183         for (ptr = cvar_list; ptr != NULL; ptr = ptr->next)
184                 if (ptr->archive)
185                         PHYSFSX_printf(file, "%s=%s\n", ptr->name, ptr->string);
186 }