RaspberrPi project source code
guowenxue
2023-09-07 13d8a8696ac5b5b505be20f428fe64e22a134016
commit | author | age
d6b4a7 1
G 2 /*-------------------------------------------------------------------------*/
3 /**
4    @file    iniparser.h
5    @author  N. Devillard
6    @brief   Parser for ini files. 
7    @url     https://github.com/ndevilla/iniparser
8 */
9 /*--------------------------------------------------------------------------*/
10
11 #ifndef _INIPARSER_H_
12 #define _INIPARSER_H_
13
14 /*---------------------------------------------------------------------------
15                                 Includes
16  ---------------------------------------------------------------------------*/
17
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21
22 /*
23  * The following #include is necessary on many Unixes but not Linux.
24  * It is not needed for Windows platforms.
25  * Uncomment it if needed.
26  */
27 /* #include <unistd.h> */
28
29 #include "dictionary.h"
30
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34
35 /*-------------------------------------------------------------------------*/
36 /**
37   @brief    Configure a function to receive the error messages.
38   @param    errback  Function to call.
39
40   By default, the error will be printed on stderr. If a null pointer is passed
41   as errback the error callback will be switched back to default.
42  */
43 /*--------------------------------------------------------------------------*/
44
45 void iniparser_set_error_callback(int (*errback)(const char *, ...));
46
47 /*-------------------------------------------------------------------------*/
48 /**
49   @brief    Get number of sections in a dictionary
50   @param    d   Dictionary to examine
51   @return   int Number of sections found in dictionary
52
53   This function returns the number of sections found in a dictionary.
54   The test to recognize sections is done on the string stored in the
55   dictionary: a section name is given as "section" whereas a key is
56   stored as "section:key", thus the test looks for entries that do not
57   contain a colon.
58
59   This clearly fails in the case a section name contains a colon, but
60   this should simply be avoided.
61
62   This function returns -1 in case of error.
63  */
64 /*--------------------------------------------------------------------------*/
65
66 int iniparser_getnsec(const dictionary * d);
67
68
69 /*-------------------------------------------------------------------------*/
70 /**
71   @brief    Get name for section n in a dictionary.
72   @param    d   Dictionary to examine
73   @param    n   Section number (from 0 to nsec-1).
74   @return   Pointer to char string
75
76   This function locates the n-th section in a dictionary and returns
77   its name as a pointer to a string statically allocated inside the
78   dictionary. Do not free or modify the returned string!
79
80   This function returns NULL in case of error.
81  */
82 /*--------------------------------------------------------------------------*/
83
84 const char * iniparser_getsecname(const dictionary * d, int n);
85
86
87 /*-------------------------------------------------------------------------*/
88 /**
89   @brief    Save a dictionary to a loadable ini file
90   @param    d   Dictionary to dump
91   @param    f   Opened file pointer to dump to
92   @return   void
93
94   This function dumps a given dictionary into a loadable ini file.
95   It is Ok to specify @c stderr or @c stdout as output files.
96  */
97 /*--------------------------------------------------------------------------*/
98
99 void iniparser_dump_ini(const dictionary * d, FILE * f);
100
101 /*-------------------------------------------------------------------------*/
102 /**
103   @brief    Save a dictionary section to a loadable ini file
104   @param    d   Dictionary to dump
105   @param    s   Section name of dictionary to dump
106   @param    f   Opened file pointer to dump to
107   @return   void
108
109   This function dumps a given section of a given dictionary into a loadable ini
110   file.  It is Ok to specify @c stderr or @c stdout as output files.
111  */
112 /*--------------------------------------------------------------------------*/
113
114 void iniparser_dumpsection_ini(const dictionary * d, const char * s, FILE * f);
115
116 /*-------------------------------------------------------------------------*/
117 /**
118   @brief    Dump a dictionary to an opened file pointer.
119   @param    d   Dictionary to dump.
120   @param    f   Opened file pointer to dump to.
121   @return   void
122
123   This function prints out the contents of a dictionary, one element by
124   line, onto the provided file pointer. It is OK to specify @c stderr
125   or @c stdout as output files. This function is meant for debugging
126   purposes mostly.
127  */
128 /*--------------------------------------------------------------------------*/
129 void iniparser_dump(const dictionary * d, FILE * f);
130
131 /*-------------------------------------------------------------------------*/
132 /**
133   @brief    Get the number of keys in a section of a dictionary.
134   @param    d   Dictionary to examine
135   @param    s   Section name of dictionary to examine
136   @return   Number of keys in section
137  */
138 /*--------------------------------------------------------------------------*/
139 int iniparser_getsecnkeys(const dictionary * d, const char * s);
140
141 /*-------------------------------------------------------------------------*/
142 /**
143   @brief    Get the number of keys in a section of a dictionary.
144   @param    d    Dictionary to examine
145   @param    s    Section name of dictionary to examine
146   @param    keys Already allocated array to store the keys in
147   @return   The pointer passed as `keys` argument or NULL in case of error
148
149   This function queries a dictionary and finds all keys in a given section.
150   The keys argument should be an array of pointers which size has been
151   determined by calling `iniparser_getsecnkeys` function prior to this one.
152
153   Each pointer in the returned char pointer-to-pointer is pointing to
154   a string allocated in the dictionary; do not free or modify them.
155  */
156 /*--------------------------------------------------------------------------*/
157 const char ** iniparser_getseckeys(const dictionary * d, const char * s, const char ** keys);
158
159
160 /*-------------------------------------------------------------------------*/
161 /**
162   @brief    Get the string associated to a key
163   @param    d       Dictionary to search
164   @param    key     Key string to look for
165   @param    def     Default value to return if key not found.
166   @return   pointer to statically allocated character string
167
168   This function queries a dictionary for a key. A key as read from an
169   ini file is given as "section:key". If the key cannot be found,
170   the pointer passed as 'def' is returned.
171   The returned char pointer is pointing to a string allocated in
172   the dictionary, do not free or modify it.
173  */
174 /*--------------------------------------------------------------------------*/
175 const char * iniparser_getstring(const dictionary * d, const char * key, const char * def);
176
177 /*-------------------------------------------------------------------------*/
178 /**
179   @brief    Get the string associated to a key, convert to an int
180   @param    d Dictionary to search
181   @param    key Key string to look for
182   @param    notfound Value to return in case of error
183   @return   integer
184
185   This function queries a dictionary for a key. A key as read from an
186   ini file is given as "section:key". If the key cannot be found,
187   the notfound value is returned.
188
189   Supported values for integers include the usual C notation
190   so decimal, octal (starting with 0) and hexadecimal (starting with 0x)
191   are supported. Examples:
192
193   - "42"      ->  42
194   - "042"     ->  34 (octal -> decimal)
195   - "0x42"    ->  66 (hexa  -> decimal)
196
197   Warning: the conversion may overflow in various ways. Conversion is
198   totally outsourced to strtol(), see the associated man page for overflow
199   handling.
200
201   Credits: Thanks to A. Becker for suggesting strtol()
202  */
203 /*--------------------------------------------------------------------------*/
204 int iniparser_getint(const dictionary * d, const char * key, int notfound);
205
206 /*-------------------------------------------------------------------------*/
207 /**
208   @brief    Get the string associated to a key, convert to an long int
209   @param    d Dictionary to search
210   @param    key Key string to look for
211   @param    notfound Value to return in case of error
212   @return   integer
213
214   This function queries a dictionary for a key. A key as read from an
215   ini file is given as "section:key". If the key cannot be found,
216   the notfound value is returned.
217
218   Supported values for integers include the usual C notation
219   so decimal, octal (starting with 0) and hexadecimal (starting with 0x)
220   are supported. Examples:
221
222   - "42"      ->  42
223   - "042"     ->  34 (octal -> decimal)
224   - "0x42"    ->  66 (hexa  -> decimal)
225
226   Warning: the conversion may overflow in various ways. Conversion is
227   totally outsourced to strtol(), see the associated man page for overflow
228   handling.
229  */
230 /*--------------------------------------------------------------------------*/
231 long int iniparser_getlongint(const dictionary * d, const char * key, long int notfound);
232
233
234 /*-------------------------------------------------------------------------*/
235 /**
236   @brief    Get the string associated to a key, convert to a double
237   @param    d Dictionary to search
238   @param    key Key string to look for
239   @param    notfound Value to return in case of error
240   @return   double
241
242   This function queries a dictionary for a key. A key as read from an
243   ini file is given as "section:key". If the key cannot be found,
244   the notfound value is returned.
245  */
246 /*--------------------------------------------------------------------------*/
247 double iniparser_getdouble(const dictionary * d, const char * key, double notfound);
248
249 /*-------------------------------------------------------------------------*/
250 /**
251   @brief    Get the string associated to a key, convert to a boolean
252   @param    d Dictionary to search
253   @param    key Key string to look for
254   @param    notfound Value to return in case of error
255   @return   integer
256
257   This function queries a dictionary for a key. A key as read from an
258   ini file is given as "section:key". If the key cannot be found,
259   the notfound value is returned.
260
261   A true boolean is found if one of the following is matched:
262
263   - A string starting with 'y'
264   - A string starting with 'Y'
265   - A string starting with 't'
266   - A string starting with 'T'
267   - A string starting with '1'
268
269   A false boolean is found if one of the following is matched:
270
271   - A string starting with 'n'
272   - A string starting with 'N'
273   - A string starting with 'f'
274   - A string starting with 'F'
275   - A string starting with '0'
276
277   The notfound value returned if no boolean is identified, does not
278   necessarily have to be 0 or 1.
279  */
280 /*--------------------------------------------------------------------------*/
281 int iniparser_getboolean(const dictionary * d, const char * key, int notfound);
282
283
284 /*-------------------------------------------------------------------------*/
285 /**
286   @brief    Set an entry in a dictionary.
287   @param    ini     Dictionary to modify.
288   @param    entry   Entry to modify (entry name)
289   @param    val     New value to associate to the entry.
290   @return   int     0 if Ok, -1 otherwise.
291
292   If the given entry can be found in the dictionary, it is modified to
293   contain the provided value. If it cannot be found, the entry is created.
294   It is Ok to set val to NULL.
295  */
296 /*--------------------------------------------------------------------------*/
297 int iniparser_set(dictionary * ini, const char * entry, const char * val);
298
299
300 /*-------------------------------------------------------------------------*/
301 /**
302   @brief    Delete an entry in a dictionary
303   @param    ini     Dictionary to modify
304   @param    entry   Entry to delete (entry name)
305   @return   void
306
307   If the given entry can be found, it is deleted from the dictionary.
308  */
309 /*--------------------------------------------------------------------------*/
310 void iniparser_unset(dictionary * ini, const char * entry);
311
312 /*-------------------------------------------------------------------------*/
313 /**
314   @brief    Finds out if a given entry exists in a dictionary
315   @param    ini     Dictionary to search
316   @param    entry   Name of the entry to look for
317   @return   integer 1 if entry exists, 0 otherwise
318
319   Finds out if a given entry exists in the dictionary. Since sections
320   are stored as keys with NULL associated values, this is the only way
321   of querying for the presence of sections in a dictionary.
322  */
323 /*--------------------------------------------------------------------------*/
324 int iniparser_find_entry(const dictionary * ini, const char * entry) ;
325
326 /*-------------------------------------------------------------------------*/
327 /**
328   @brief    Parse an ini file and return an allocated dictionary object
329   @param    ininame Name of the ini file to read.
330   @return   Pointer to newly allocated dictionary
331
332   This is the parser for ini files. This function is called, providing
333   the name of the file to be read. It returns a dictionary object that
334   should not be accessed directly, but through accessor functions
335   instead.
336
337   The returned dictionary must be freed using iniparser_freedict().
338  */
339 /*--------------------------------------------------------------------------*/
340 dictionary * iniparser_load(const char * ininame);
341
342 /*-------------------------------------------------------------------------*/
343 /**
344   @brief    Free all memory associated to an ini dictionary
345   @param    d Dictionary to free
346   @return   void
347
348   Free all memory associated to an ini dictionary.
349   It is mandatory to call this function before the dictionary object
350   gets out of the current context.
351  */
352 /*--------------------------------------------------------------------------*/
353 void iniparser_freedict(dictionary * d);
354
355 #ifdef __cplusplus
356 }
357 #endif
358
359 #endif