]> icculus.org git repositories - btb/d2x.git/blob - main/cvar.c
set cvar values via formatted string. convenient macro for setint
[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         d_free(cvar->string);
106         cvar->string = d_strdup(value);
107         cvar->value = strtod(cvar->string, (char **) NULL);
108         cvar->intval = cvar_round(cvar->value);
109 }
110
111
112 void cvar_set_cvarf(cvar_t *cvar, char *fmt, ...)
113 {
114         va_list arglist;
115         char buf[CVAR_MAX_LENGTH];
116         int n;
117
118         va_start (arglist, fmt);
119         n = vsnprintf (buf, CVAR_MAX_LENGTH, fmt, arglist);
120         va_end (arglist);
121
122         Assert(!(n < 0 || n > CVAR_MAX_LENGTH));
123
124         cvar_set_cvar(cvar, buf);
125 }
126
127
128 void cvar_set (char *cvar_name, char *value)
129 {
130         cvar_set_cvar(cvar_find(cvar_name), value);
131 }
132
133
134 /* Get a CVar's value */
135 float cvar (char *cvar_name)
136 {
137         cvar_t *cvar;
138
139         cvar = cvar_find(cvar_name);
140
141         if (!cvar)
142                 return 0.0; // If we didn't find the cvar, give up
143
144         return cvar->value;
145 }
146
147
148 /* Write archive cvars to file */
149 void cvar_write(CFILE *file)
150 {
151         cvar_t *ptr;
152
153         for (ptr = cvar_list; ptr != NULL; ptr = ptr->next)
154                 if (ptr->archive)
155                         PHYSFSX_printf(file, "%s=%s\n", ptr->name, ptr->string);
156 }