libconfig_sys/
lib.rs

1/******************************************************************************/
2/*                               libRustConfig                                */
3/*                   rust wrapper around libconfig library                    */
4/*                  https://github.com/hyperrealm/libconfig                   */
5/*                                                                            */
6/* Copyright (c) 2020                                       Ivan Semenkov     */
7/* https://github.com/isemenkov/librustconfig               ivan@semenkov.pro */
8/*                                                          Ukraine           */
9/******************************************************************************/
10/*                                                                            */
11/* Permission is hereby granted,  free of charge,  to any person obtaining a  */
12/* copy of this software and associated documentation files (the "Software"), */
13/* to deal in the Software without restriction, including without limitation  */
14/* the rights to use, copy,  modify, merge, publish, distribute,  sublicense, */
15/* and/or  sell copies  of the Software,  and to permit persons  to whom  the */
16/* Software  is furnished to  do  so,  subject to  the following  conditions: */
17/*                                                                            */
18/* The above copyright notice and this permission notice shall be included in */
19/* all copies or substantial portions of the Software.                        */
20/*                                                                            */
21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR */
22/* IMPLIED,  INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF  MERCHANTABILITY, */
23/* FITNESS  FOR A PARTICULAR PURPOSE  AND NONINFRINGEMENT. IN  NO EVENT SHALL */
24/* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER */
25/* LIABILITY,  WHETHER IN AN ACTION  OF CONTRACT,  TORT OR OTHERWISE, ARISING */
26/* FROM,  OUT OF  OR IN  CONNECTION WITH  THE SOFTWARE  OR THE  USE OR  OTHER */
27/* DEALINGS IN THE SOFTWARE.                                                  */
28/*                                                                            */
29/******************************************************************************/
30
31#![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}