]> icculus.org git repositories - btb/d2x.git/blob - main/cvar.c
implement cvar_write
[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 FLOAT_STRING_SIZE (3 + DBL_MANT_DIG - DBL_MIN_EXP + 1)
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_cvar_value(cvar_t *cvar, float value)
113 {
114         char stringval[FLOAT_STRING_SIZE];
115
116         snprintf(stringval, FLOAT_STRING_SIZE, "%f", value);
117
118         cvar_set_cvar(cvar, stringval);
119 }
120
121
122 void cvar_set (char *cvar_name, char *value)
123 {
124         cvar_set_cvar(cvar_find(cvar_name), value);
125 }
126
127
128 void cvar_set_value(char *cvar_name, float value)
129 {
130         char stringval[FLOAT_STRING_SIZE];
131
132         snprintf(stringval, FLOAT_STRING_SIZE, "%f", value);
133
134         cvar_set_cvar(cvar_find(cvar_name), stringval);
135 }
136
137
138 /* Get a CVar's value */
139 float cvar (char *cvar_name)
140 {
141         cvar_t *cvar;
142
143         cvar = cvar_find(cvar_name);
144
145         if (!cvar)
146                 return 0.0; // If we didn't find the cvar, give up
147
148         return cvar->value;
149 }
150
151
152 /* Write archive cvars to file */
153 void cvar_write(CFILE *file)
154 {
155         cvar_t *ptr;
156
157         for (ptr = cvar_list; ptr != NULL; ptr = ptr->next)
158                 if (ptr->archive)
159                         PHYSFSX_printf(file, "%s=%s\n", ptr->name, ptr->string);
160 }