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