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