]> icculus.org git repositories - btb/d2x.git/blob - main/cvar.c
more convenience functions, add intval
[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 #define cvar_round(x) ((x)>=0?(int)((x)+0.5):(int)((x)-0.5))
43
44 /* Register a cvar */
45 void cvar_registervariable (cvar_t *cvar)
46 {
47         cvar_t *ptr;
48         char *stringval;
49
50         if (!cvar_initialized)
51                 cvar_init();
52
53         Assert(cvar != NULL);
54
55         stringval = cvar->string;
56
57         cvar->next = NULL;
58         cvar->string = d_strdup(stringval);
59         cvar->value = strtod(cvar->string, (char **) NULL);
60         cvar->intval = cvar_round(cvar->value);
61
62         if (cvar_list == NULL)
63         {
64                 cvar_list = cvar;
65         } else
66         {
67                 for (ptr = cvar_list; ptr->next != NULL; ptr = ptr->next) ;
68                 ptr->next = cvar;
69         }
70 }
71
72
73 /* Set a CVar's value */
74 void cvar_set_cvar(cvar_t *cvar, char *value)
75 {
76         d_free(cvar->string);
77         cvar->string = d_strdup(value);
78         cvar->value = strtod(cvar->string, (char **) NULL);
79         cvar->intval = cvar_round(cvar->value);
80 }
81
82
83 void cvar_set_cvar_value(cvar_t *cvar, float value)
84 {
85         char stringval[FLOAT_STRING_SIZE];
86
87         snprintf(stringval, FLOAT_STRING_SIZE, "%f", value);
88
89         cvar_set_cvar(cvar, stringval);
90 }
91
92
93 void cvar_set (char *cvar_name, char *value)
94 {
95         cvar_t *ptr;
96
97         for (ptr = cvar_list; ptr != NULL; ptr = ptr->next)
98                 if (!stricmp(cvar_name, ptr->name)) break;
99
100         if (ptr == NULL) return; // If we didn't find the cvar, give up
101
102         cvar_set_cvar(ptr, value);
103 }
104
105
106 void cvar_set_value(char *cvar_name, float value)
107 {
108         char stringval[FLOAT_STRING_SIZE];
109
110         snprintf(stringval, FLOAT_STRING_SIZE, "%f", value);
111
112         cvar_set(cvar_name, stringval);
113 }
114
115
116 /* Get a CVar's value */
117 float cvar (char *cvar_name)
118 {
119         cvar_t *ptr;
120
121         for (ptr = cvar_list; ptr != NULL; ptr = ptr->next)
122                 if (!strcmp(cvar_name, ptr->name)) break;
123
124         if (ptr == NULL) return 0.0; // If we didn't find the cvar, give up
125
126         return ptr->value;
127 }