]> icculus.org git repositories - btb/d2x.git/blob - main/cvar.c
explicit casts
[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 == 2 && !stricmp(argv[1], "-h")) {
41                 con_printf(CON_NORMAL, "%s <name> <value>\n", argv[0]);
42                 con_printf(CON_NORMAL, "    set variable <name> equal to <value>\n");
43                 con_printf(CON_NORMAL, "%s <name>\n", argv[0]);
44                 con_printf(CON_NORMAL, "    show value of <name>\n");
45                 con_printf(CON_NORMAL, "%s\n", argv[0]);
46                 con_printf(CON_NORMAL, "    show value of all variables\n");
47                 return;
48         }
49
50         if (argc == 2) {
51                 cvar_t *ptr;
52
53                 if ((ptr = cvar_find(argv[1])))
54                         con_printf(CON_NORMAL, "%s: %s\n", ptr->name, ptr->string);
55                 else
56                         con_printf(CON_NORMAL, "set: variable %s not found\n", argv[1]);
57                 return;
58         }
59
60         if (argc == 1) {
61                 cvar_t *ptr;
62
63                 for (ptr = cvar_list; ptr != NULL; ptr = ptr->next)
64                         con_printf(CON_NORMAL, "%s: %s\n", ptr->name, ptr->string);
65                 return;
66         }
67
68         ret = snprintf(buf, CVAR_MAX_LENGTH, "%s", argv[2]);
69         if (ret >= CVAR_MAX_LENGTH) {
70                 con_printf(CON_CRITICAL, "set: value too long (max %d characters)\n", CVAR_MAX_LENGTH);
71                 return;
72         }
73
74         for (i = 3; i < argc; i++) {
75                 ret = snprintf(buf, CVAR_MAX_LENGTH, "%s %s", buf, argv[i]);
76                 if (ret >= CVAR_MAX_LENGTH) {
77                         con_printf(CON_CRITICAL, "set: value too long (max %d characters)\n", CVAR_MAX_LENGTH);
78                         return;
79                 }
80         }
81         cvar_set(argv[1], buf);
82 }
83
84
85 void cvar_init(void)
86 {
87         cmd_addcommand("set", cvar_cmd_set);
88
89         atexit(cvar_free);
90         cvar_initialized = 1;
91 }
92
93
94 cvar_t *cvar_find(char *cvar_name)
95 {
96         cvar_t *ptr;
97
98         for (ptr = cvar_list; ptr != NULL; ptr = ptr->next)
99                 if (!stricmp(cvar_name, ptr->name))
100                         return ptr;
101
102         return NULL;
103 }
104
105
106 char *cvar_complete(char *text)
107 {
108         cvar_t *ptr;
109         int len = (int)strlen(text);
110
111         if (!len)
112                 return NULL;
113
114         for (ptr = cvar_list; ptr != NULL; ptr = ptr->next)
115                 if (!strnicmp(text, ptr->name, len))
116                         return ptr->name;
117
118         return NULL;
119 }
120
121
122 /* Register a cvar */
123 void cvar_registervariable (cvar_t *cvar)
124 {
125         char *stringval;
126         cvar_t *ptr;
127
128         if (!cvar_initialized)
129                 cvar_init();
130
131         Assert(cvar != NULL);
132
133         stringval = cvar->string;
134
135         cvar->string = d_strdup(stringval);
136         cvar->value = fl2f(strtod(cvar->string, (char **) NULL));
137         cvar->intval = (int)strtol(cvar->string, NULL, 10);
138         cvar->next = NULL;
139
140         if (cvar_list == NULL) {
141                 cvar_list = cvar;
142                 return;
143         }
144
145         /* insert at end of list */
146         for (ptr = cvar_list; ptr->next != NULL; ptr = ptr->next)
147                 Assert(stricmp(cvar->name, ptr->name));
148         ptr->next = cvar;
149 }
150
151
152 /* Set a CVar's value */
153 void cvar_set_cvar(cvar_t *cvar, char *value)
154 {
155         if (!cvar)
156                 return;
157
158         d_free(cvar->string);
159         cvar->string = d_strdup(value);
160         cvar->value = fl2f(strtod(cvar->string, (char **) NULL));
161         cvar->intval = (int)strtol(cvar->string, NULL, 10);
162         con_printf(CON_VERBOSE, "%s: %s\n", cvar->name, cvar->string);
163 }
164
165
166 void cvar_set_cvarf(cvar_t *cvar, char *fmt, ...)
167 {
168         va_list arglist;
169         char buf[CVAR_MAX_LENGTH];
170         int n;
171
172         va_start (arglist, fmt);
173         n = vsnprintf (buf, CVAR_MAX_LENGTH, fmt, arglist);
174         va_end (arglist);
175
176         Assert(!(n < 0 || n > CVAR_MAX_LENGTH));
177
178         cvar_set_cvar(cvar, buf);
179 }
180
181
182 void cvar_set (char *cvar_name, char *value)
183 {
184         cvar_t *cvar;
185
186         cvar = cvar_find(cvar_name);
187         if (!cvar) {
188                 Int3();
189                 con_printf(CON_NORMAL, "cvar %s not found\n", cvar_name);
190                 return;
191         }
192
193         cvar_set_cvar(cvar, value);
194 }
195
196
197 /* Get a CVar's value */
198 fix cvar (char *cvar_name)
199 {
200         cvar_t *cvar;
201
202         cvar = cvar_find(cvar_name);
203
204         if (!cvar)
205                 return 0.0; // If we didn't find the cvar, give up
206
207         return cvar->value;
208 }
209
210
211 /* Write archive cvars to file */
212 void cvar_write(CFILE *file)
213 {
214         cvar_t *ptr;
215
216         for (ptr = cvar_list; ptr != NULL; ptr = ptr->next)
217                 if (ptr->archive)
218                         PHYSFSX_printf(file, "%s=%s\n", ptr->name, ptr->string);
219 }