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
)
122 switch (rcvars
[i
].type
)
125 if (c
< 1) return -1;
126 n
= (int *)rcvars
[i
].mem
;
130 if (c
< 1) return -1;
131 s
= (char **)rcvars
[i
].mem
;
135 die("out of memory setting rcvar %s\n", rcvars
[i
].name
);
138 if (c
> rcvars
[i
].len
)
140 for (j
= 0; j
< c
; j
++)
141 ((int *)rcvars
[i
].mem
)[j
] = my_atoi(v
[j
]);
144 if (c
< 1 || atoi(v
[0]) || strchr("yYtT", v
[0][0]))
145 *(int *)rcvars
[i
].mem
= 1;
146 else if (strchr("0nNfF", v
[0][0]))
147 *(int *)rcvars
[i
].mem
= 0;
156 int rc_setvar(char *name
, int c
, char **v
)
160 i
= rc_findvar(name
);
163 return rc_setvar_n(i
, c
, v
);
167 void *rc_getmem_n(int i
)
169 return rcvars
[i
].mem
;
173 void *rc_getmem(char *name
)
176 i
= rc_findvar(name
);
177 if (i
< 0) return NULL
;
178 return rcvars
[i
].mem
;
181 int rc_getint_n(int i
)
184 switch (rcvars
[i
].type
)
188 return *(int *)rcvars
[i
].mem
;
193 int *rc_getvec_n(int i
)
195 if (i
< 0) return NULL
;
196 switch (rcvars
[i
].type
)
201 return (int *)rcvars
[i
].mem
;
206 char *rc_getstr_n(int i
)
209 switch (rcvars
[i
].type
)
212 return *(char **)rcvars
[i
].mem
;
217 int rc_getint(char *name
)
219 return rc_getint_n(rc_findvar(name
));
222 int *rc_getvec(char *name
)
224 return rc_getvec_n(rc_findvar(name
));
227 char *rc_getstr(char *name
)
229 return rc_getstr_n(rc_findvar(name
));
232 const char *rc_type_to_string(rcvtype_t type
) {
234 case rcv_int
: return "int";
235 case rcv_string
: return "str";
236 case rcv_vector
: return "vec";
237 case rcv_bool
: return "bool";
238 default: return "unknown";