1#![allow(non_camel_case_types)]
32
33extern crate libc;
34
35use libc::{c_schar, c_short, c_ushort, c_int, c_uint, c_longlong, c_double};
36use libc::FILE;
37use std::os::raw::c_void;
38
39pub const CONFIG_TYPE_NONE : c_short = 0;
40pub const CONFIG_TYPE_GROUP : c_short = 1;
41pub const CONFIG_TYPE_INT : c_short = 2;
42pub const CONFIG_TYPE_INT64 : c_short = 3;
43pub const CONFIG_TYPE_FLOAT : c_short = 4;
44pub const CONFIG_TYPE_STRING : c_short = 5;
45pub const CONFIG_TYPE_BOOL : c_short = 6;
46pub const CONFIG_TYPE_ARRAY : c_short = 7;
47pub const CONFIG_TYPE_LIST : c_short = 8;
48
49pub const CONFIG_FORMAT_DEFAULT : c_int = 1;
50pub const CONFIG_FORMAT_HEX : c_int = 2;
51
52pub const CONFIG_OPTION_AUTOCONVERT : c_int = 0x01;
53pub const CONFIG_OPTION_SEMICOLON_SEPARATORS : c_int = 0x02;
54pub const CONFIG_OPTION_COLON_ASSIGNMENT_FOR_GROUPS : c_int = 0x04;
55pub const CONFIG_OPTION_COLON_ASSIGNMENT_FOR_NON_GROUPS : c_int = 0x08;
56pub const CONFIG_OPTION_OPEN_BRACE_ON_SEPARATE_LINE : c_int = 0x10;
57
58pub const CONFIG_TRUE : c_int = 1;
59pub const CONFIG_FALSE : c_int = 0;
60
61#[repr(C)]
62#[derive(Copy, Clone)]
63pub enum config_error_t {
64 CONFIG_ERR_NONE = 0,
65 CONFIG_ERR_FILE_IO = 1,
66 CONFIG_ERR_PARSE = 2,
67}
68
69#[repr(C)]
70#[derive(Copy, Clone)]
71pub union config_value_t {
72 pub ival : c_int,
73 pub llval : c_longlong,
74 pub fval : c_double,
75 pub sval : *mut c_schar,
76 pub list : *mut config_list_t,
77}
78
79#[repr(C)]
80#[derive(Copy, Clone)]
81pub struct config_setting_t {
82 pub name : *mut c_schar,
83 pub setting_type : c_short,
84 pub format : c_short,
85 pub value : config_value_t,
86 pub parent : *mut config_setting_t,
87 pub config : *mut config_t,
88 pub hook : *mut c_void,
89 pub line : c_uint,
90 pub file : *const c_schar,
91}
92
93#[repr(C)]
94pub struct config_list_t {
95 pub length : c_uint,
96 pub elements : *mut *mut config_setting_t,
97}
98
99#[repr(C)]
100pub struct config_t {
101 pub root : *mut config_setting_t,
102 pub destructor : Option<extern "C" fn(*mut c_void) -> ()>,
103 pub tab_width : c_ushort,
104 pub default_format : c_short,
105 pub include_dir : *const c_schar,
106 pub error_text : *const c_schar,
107 pub error_file : *const c_schar,
108 pub error_line : c_int,
109 pub error_type : config_error_t,
110 pub filenames : *mut *mut c_schar,
111 pub num_filenames : c_uint,
112}
113
114pub type destructor_callback = extern "C" fn(ptr : *mut c_void) -> ();
115
116#[link(name = "config")]
117extern "C" {
118 pub fn config_read (config : *mut config_t, stream : *mut FILE) -> c_int;
119 pub fn config_write (config : *const config_t, stream : *mut FILE);
120
121 pub fn config_set_options (config : *mut config_t, options : c_int);
122 pub fn config_get_options (config : *const config_t) -> c_int;
123
124 pub fn config_set_auto_convert (config : *mut config_t, flag : c_int);
125 pub fn config_get_auto_convert (config : *const config_t) -> c_int;
126
127 pub fn config_read_string (config : *mut config_t, str : *const c_schar)
128 -> c_int;
129
130 pub fn config_read_file (config : *mut config_t, filename : *const c_schar)
131 -> c_int;
132 pub fn config_write_file (config : *mut config_t, filename : *const c_schar)
133 -> c_int;
134
135 pub fn config_set_destructor (config : *mut config_t, destructor :
136 destructor_callback);
137 pub fn config_set_include_dir (config : *mut config_t, include_dir :
138 *const c_schar);
139
140 pub fn config_init (config : *mut config_t);
141 pub fn config_destroy (config : *mut config_t);
142
143 pub fn config_setting_get_int (setting : *const config_setting_t) -> c_int;
144 pub fn config_setting_get_int64 (setting : *const config_setting_t)
145 -> c_longlong;
146 pub fn config_setting_get_float (setting : *const config_setting_t)
147 -> c_double;
148 pub fn config_setting_get_bool (setting : *const config_setting_t)
149 -> c_int;
150 pub fn config_setting_get_string (setting : *const config_setting_t)
151 -> *const c_schar;
152
153 pub fn config_setting_lookup_int (setting : *const config_setting_t,
154 name : *const c_schar, value : *mut c_int) -> c_int;
155 pub fn config_setting_lookup_int64 (setting : *const config_setting_t,
156 name : *const c_schar, value : *mut c_longlong) -> c_int;
157 pub fn config_setting_lookup_float (setting : *const config_setting_t,
158 name : *const c_schar, value : *mut c_double) -> c_int;
159 pub fn config_setting_lookup_bool (setting : *const config_setting_t,
160 name : *const c_schar, value : *mut c_int) -> c_int;
161 pub fn config_setting_lookup_string (setting : *const config_setting_t,
162 name : *const c_schar, value : *const *mut c_schar) -> c_int;
163
164 pub fn config_setting_set_int (setting : *mut config_setting_t, value :
165 c_int) -> c_int;
166 pub fn config_setting_set_int64 (setting : *mut config_setting_t, value :
167 c_longlong) -> c_int;
168 pub fn config_setting_set_float (setting : *mut config_setting_t, value :
169 c_double) -> c_int;
170 pub fn config_setting_set_bool (setting : *mut config_setting_t, value :
171 c_int) -> c_int;
172 pub fn config_setting_set_string (setting : *mut config_setting_t, value :
173 *const c_schar) -> c_int;
174
175 pub fn config_setting_set_format (setting : *mut config_setting_t, format :
176 c_short) -> c_int;
177 pub fn config_setting_get_format (setting : *const config_setting_t)
178 -> c_short;
179
180 pub fn config_setting_get_int_elem (setting : *const config_setting_t, idx :
181 c_int) -> c_int;
182 pub fn config_setting_get_int64_elem (setting : *const config_setting_t,
183 idx : c_int) -> c_longlong;
184 pub fn config_setting_get_float_elem (setting : *const config_setting_t,
185 idx : c_int) -> c_double;
186 pub fn config_setting_get_bool_elem (setting : *const config_setting_t,
187 idx : c_int) -> c_int;
188 pub fn config_setting_get_string_elem (setting : *const config_setting_t,
189 idx : c_int) -> *const c_schar;
190
191 pub fn config_setting_set_int_elem (setting : *mut config_setting_t, idx :
192 c_int, value : c_int) -> *mut config_setting_t;
193 pub fn config_setting_set_int64_elem (setting : *mut config_setting_t, idx :
194 c_int, value : c_longlong) -> *mut config_setting_t;
195 pub fn config_setting_set_float_elem (setting : *mut config_setting_t, idx :
196 c_int, value : c_double) -> *mut config_setting_t;
197 pub fn config_setting_set_bool_elem (setting : *mut config_setting_t, idx :
198 c_int, value : c_int) -> *mut config_setting_t;
199 pub fn config_setting_set_string_elem (setting : *mut config_setting_t,
200 idx : c_int, value : *const c_schar) -> *mut config_setting_t;
201
202 pub fn config_setting_index (setting : *const config_setting_t) -> c_int;
203
204 pub fn config_setting_length (setting : *const config_setting_t) -> c_int;
205 pub fn config_setting_get_elem (setting : *const config_setting_t, idx :
206 c_uint) -> *mut config_setting_t;
207
208 pub fn config_setting_get_member (setting : *const config_setting_t, name :
209 *const c_schar) -> *mut config_setting_t;
210
211 pub fn config_setting_add (parent : *mut config_setting_t, name :
212 *const c_schar, value_type : c_int) -> *mut config_setting_t;
213 pub fn config_setting_remove (parent : *mut config_setting_t, name :
214 *const c_schar) -> c_int;
215 pub fn config_setting_remove_elem (parent : *mut config_setting_t, idx :
216 c_uint) -> c_int;
217 pub fn config_setting_set_hook (setting : *mut config_setting_t, hook :
218 *mut c_void);
219
220 pub fn config_lookup (config : *const config_t, path : *const c_schar)
221 -> *mut config_setting_t;
222 pub fn config_setting_lookup (setting : *mut config_setting_t, path :
223 *const c_schar) -> *mut config_setting_t;
224
225 pub fn config_lookup_int (config : *const config_t, path : *const c_schar,
226 value : *mut c_int) -> c_int;
227 pub fn config_lookup_int64 (config : *const config_t, path : *const c_schar,
228 value : *mut c_longlong) -> c_int;
229 pub fn config_lookup_float (config : *const config_t, path : *const c_schar,
230 value : *mut c_double) -> c_int;
231 pub fn config_lookup_bool (config : *const config_t, path : *const c_schar,
232 value : *mut c_int) -> c_int;
233 pub fn config_lookup_string (config : *const config_t, path :
234 *const c_schar, value : *const *mut c_schar) -> c_int;
235}
236
237pub fn config_get_include_dir (config : *const config_t) -> *const c_schar {
238 unsafe { (*config).include_dir }
239}
240
241pub fn config_setting_type (setting : *const config_setting_t) -> c_int {
242 unsafe { (*setting).setting_type as c_int }
243}
244
245pub fn config_setting_is_group (setting : *const config_setting_t) -> c_int {
246 match unsafe { (*setting).setting_type } {
247 CONFIG_TYPE_GROUP => { CONFIG_TRUE },
248 _ => { CONFIG_FALSE }
249 }
250}
251
252pub fn config_setting_is_array (setting : *const config_setting_t) -> c_int {
253 match unsafe { (*setting).setting_type } {
254 CONFIG_TYPE_ARRAY => { CONFIG_TRUE },
255 _ => { CONFIG_FALSE }
256 }
257}
258
259pub fn config_setting_is_list (setting : *const config_setting_t) -> c_int {
260 match unsafe { (*setting).setting_type } {
261 CONFIG_TYPE_LIST => { CONFIG_TRUE },
262 _ => { CONFIG_FALSE }
263 }
264}
265
266pub fn config_setting_is_aggregate (setting : *const config_setting_t)
267 -> c_int {
268 match unsafe { (*setting).setting_type } {
269 CONFIG_TYPE_GROUP |
270 CONFIG_TYPE_LIST |
271 CONFIG_TYPE_ARRAY => { CONFIG_TRUE },
272 _ => { CONFIG_FALSE }
273 }
274}
275
276pub fn config_setting_is_number (setting : *const config_setting_t) -> c_int {
277 match unsafe { (*setting).setting_type } {
278 CONFIG_TYPE_INT |
279 CONFIG_TYPE_INT64 |
280 CONFIG_TYPE_FLOAT => { CONFIG_TRUE },
281 _ => { CONFIG_FALSE }
282 }
283}
284
285pub fn config_setting_is_scalar (setting : *const config_setting_t) -> c_int {
286 match unsafe { (*setting).setting_type } {
287 CONFIG_TYPE_BOOL |
288 CONFIG_TYPE_STRING |
289 CONFIG_TYPE_INT |
290 CONFIG_TYPE_INT64 |
291 CONFIG_TYPE_FLOAT => { CONFIG_TRUE },
292 _ => { CONFIG_FALSE }
293 }
294}
295
296pub fn config_setting_name (setting : *const config_setting_t)
297 -> *const c_schar {
298 unsafe { (*setting).name }
299}
300
301pub fn config_setting_parent (setting : *const config_setting_t)
302 -> *mut config_setting_t {
303 unsafe { (*setting).parent }
304}
305
306pub fn config_setting_is_root (setting : *const config_setting_t) -> c_int {
307 if unsafe { (*setting).parent.is_null() } {
308 CONFIG_TRUE
309 } else {
310 CONFIG_FALSE
311 }
312}
313
314pub fn config_root_setting (config : *const config_t) -> *mut config_setting_t {
315 unsafe { (*config).root }
316}
317
318pub fn config_set_default_format (config : *mut config_t, value : c_short) {
319 unsafe { (*config).default_format = value };
320}
321
322pub fn config_get_default_format (config : *const config_t) -> c_short {
323 unsafe { (*config).default_format }
324}
325
326pub fn config_set_tab_width (config : *mut config_t, value : c_ushort) {
327 unsafe { (*config).tab_width = value & 0x0F };
328}
329
330pub fn config_get_tab_width (config : *const config_t) -> c_ushort {
331 unsafe { (*config).tab_width }
332}
333
334pub fn config_setting_source_line (config : *const config_setting_t) -> c_uint {
335 unsafe { (*config).line }
336}
337
338pub fn config_setting_source_file (config : *const config_setting_t)
339 -> *const c_schar {
340 unsafe { (*config).file }
341}
342
343pub fn config_error_text (config : *const config_t) -> *const c_schar {
344 unsafe { (*config).error_text }
345}
346
347pub fn config_error_file (config : *const config_t) -> *const c_schar {
348 unsafe { (*config).error_file }
349}
350
351pub fn config_error_line (config : *const config_t) -> c_int {
352 unsafe { (*config).error_line }
353}
354
355pub fn config_error_type (config : *const config_t) -> config_error_t {
356 unsafe { (*config).error_type }
357}