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