18 static rcvar_t
*rcvars
;
26 void rc_export(rcvar_t
*v
)
28 const rcvar_t end
= RCV_END
;
32 rcvars
= realloc(rcvars
, sizeof (rcvar_t
) * (nvars
+1));
34 die("out of memory adding rcvar %s\n", v
->name
);
39 void rc_exportvars(rcvar_t
*vars
)
47 int rc_findvar(char *name
)
50 if (!rcvars
) return -1;
51 for (i
= 0; rcvars
[i
].name
; i
++)
52 if (!strcmp(rcvars
[i
].name
, name
))
60 int my_atoi(const char *s
)
66 if (*s
== 'x' || *s
== 'X')
72 a
= (a
<<4) + *s
- '0';
73 else if (strchr("ABCDEF", *s
))
74 a
= (a
<<4) + *s
- 'A' + 10;
75 else if (strchr("abcdef", *s
))
76 a
= (a
<<4) + *s
- 'a' + 10;
84 if (strchr("01234567", *s
))
85 a
= (a
<<3) + *s
- '0';
97 a
= (a
*10) + *s
- '0';
105 a
= (a
*10) + *s
- '0';
113 /* i - index of variable in rcvars array
114 c - count of values in v string array
115 v - the actual values as string array */
116 int rc_setvar_n(int i
, int c
, char **v
)
123 switch (rcvars
[i
].type
)
126 if (c
< 1) return -1;
127 n
= (int *)rcvars
[i
].mem
;
131 if (c
< 1) return -1;
132 f
= (float *)rcvars
[i
].mem
;
136 if (c
< 1) return -1;
137 s
= (char **)rcvars
[i
].mem
;
141 die("out of memory setting rcvar %s\n", rcvars
[i
].name
);
144 if (c
> rcvars
[i
].len
)
146 for (j
= 0; j
< c
; j
++)
147 ((int *)rcvars
[i
].mem
)[j
] = my_atoi(v
[j
]);
150 if (c
< 1 || atoi(v
[0]) || strchr("yYtT", v
[0][0]))
151 *(int *)rcvars
[i
].mem
= 1;
152 else if (strchr("0nNfF", v
[0][0]))
153 *(int *)rcvars
[i
].mem
= 0;
162 int rc_setvar(char *name
, int c
, char **v
)
166 i
= rc_findvar(name
);
169 return rc_setvar_n(i
, c
, v
);
173 void *rc_getmem_n(int i
)
175 return rcvars
[i
].mem
;
179 void *rc_getmem(char *name
)
182 i
= rc_findvar(name
);
183 if (i
< 0) return NULL
;
184 return rcvars
[i
].mem
;
187 int rc_getint_n(int i
)
190 switch (rcvars
[i
].type
)
194 return *(int *)rcvars
[i
].mem
;
199 float rc_getfloat_n(int i
)
201 if (i
< 0) return 0.0;
202 switch (rcvars
[i
].type
)
205 return *(float *)rcvars
[i
].mem
;
210 int *rc_getvec_n(int i
)
212 if (i
< 0) return NULL
;
213 switch (rcvars
[i
].type
)
218 return (int *)rcvars
[i
].mem
;
223 char *rc_getstr_n(int i
)
226 switch (rcvars
[i
].type
)
229 return *(char **)rcvars
[i
].mem
;
234 int rc_getint(char *name
)
236 return rc_getint_n(rc_findvar(name
));
239 float rc_getfloat(char *name
)
241 return rc_getfloat_n(rc_findvar(name
));
244 int *rc_getvec(char *name
)
246 return rc_getvec_n(rc_findvar(name
));
249 char *rc_getstr(char *name
)
251 return rc_getstr_n(rc_findvar(name
));
254 const char *rc_type_to_string(rcvtype_t type
) {
256 case rcv_int
: return "int";
257 case rcv_float
: return "float";
258 case rcv_string
: return "str";
259 case rcv_vector
: return "vec";
260 case rcv_bool
: return "bool";
261 default: return "unknown";