13d0407baSopenharmony_ci/* 23d0407baSopenharmony_ci * Copyright 2015 Rockchip Electronics Co. LTD 33d0407baSopenharmony_ci * 43d0407baSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 53d0407baSopenharmony_ci * you may not use this file except in compliance with the License. 63d0407baSopenharmony_ci * You may obtain a copy of the License at 73d0407baSopenharmony_ci * 83d0407baSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 93d0407baSopenharmony_ci * 103d0407baSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 113d0407baSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 123d0407baSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133d0407baSopenharmony_ci * See the License for the specific language governing permissions and 143d0407baSopenharmony_ci * limitations under the License. 153d0407baSopenharmony_ci */ 163d0407baSopenharmony_ci 173d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/ 183d0407baSopenharmony_ci/** 193d0407baSopenharmony_ci @file iniparser.h 203d0407baSopenharmony_ci @author N. Devillard 213d0407baSopenharmony_ci @brief Parser for ini files. 223d0407baSopenharmony_ci*/ 233d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/ 243d0407baSopenharmony_ci 253d0407baSopenharmony_ci#ifndef _INIPARSER_H_ 263d0407baSopenharmony_ci#define _INIPARSER_H_ 273d0407baSopenharmony_ci 283d0407baSopenharmony_ci/*--------------------------------------------------------------------------- 293d0407baSopenharmony_ci Includes 303d0407baSopenharmony_ci ---------------------------------------------------------------------------*/ 313d0407baSopenharmony_ci 323d0407baSopenharmony_ci#include <stdio.h> 333d0407baSopenharmony_ci#include <stdlib.h> 343d0407baSopenharmony_ci#include <string.h> 353d0407baSopenharmony_ci 363d0407baSopenharmony_ci/* 373d0407baSopenharmony_ci * The following #include is necessary on many Unixes but not Linux. 383d0407baSopenharmony_ci * It is not needed for Windows platforms. 393d0407baSopenharmony_ci * Uncomment it if needed. 403d0407baSopenharmony_ci */ 413d0407baSopenharmony_ci/* #include <unistd.h> */ 423d0407baSopenharmony_ci 433d0407baSopenharmony_ci#include "dictionary.h" 443d0407baSopenharmony_ci 453d0407baSopenharmony_ci#ifdef __cplusplus 463d0407baSopenharmony_ciextern "C" { 473d0407baSopenharmony_ci#endif 483d0407baSopenharmony_ci 493d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/ 503d0407baSopenharmony_ci/** 513d0407baSopenharmony_ci @brief Configure a function to receive the error messages. 523d0407baSopenharmony_ci @param errback Function to call. 533d0407baSopenharmony_ci 543d0407baSopenharmony_ci By default, the error will be printed on stderr. If a null pointer is passed 553d0407baSopenharmony_ci as errback the error callback will be switched back to default. 563d0407baSopenharmony_ci */ 573d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/ 583d0407baSopenharmony_ci 593d0407baSopenharmony_civoid iniparser_set_error_callback(int (*errback)(const char *, ...)); 603d0407baSopenharmony_ci 613d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/ 623d0407baSopenharmony_ci/** 633d0407baSopenharmony_ci @brief Get number of sections in a dictionary 643d0407baSopenharmony_ci @param d Dictionary to examine 653d0407baSopenharmony_ci @return int Number of sections found in dictionary 663d0407baSopenharmony_ci 673d0407baSopenharmony_ci This function returns the number of sections found in a dictionary. 683d0407baSopenharmony_ci The test to recognize sections is done on the string stored in the 693d0407baSopenharmony_ci dictionary: a section name is given as "section" whereas a key is 703d0407baSopenharmony_ci stored as "section:key", thus the test looks for entries that do not 713d0407baSopenharmony_ci contain a colon. 723d0407baSopenharmony_ci 733d0407baSopenharmony_ci This clearly fails in the case a section name contains a colon, but 743d0407baSopenharmony_ci this should simply be avoided. 753d0407baSopenharmony_ci 763d0407baSopenharmony_ci This function returns -1 in case of error. 773d0407baSopenharmony_ci */ 783d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/ 793d0407baSopenharmony_ci 803d0407baSopenharmony_ciint iniparser_getnsec(const dictionary * d); 813d0407baSopenharmony_ci 823d0407baSopenharmony_ci 833d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/ 843d0407baSopenharmony_ci/** 853d0407baSopenharmony_ci @brief Get name for section n in a dictionary. 863d0407baSopenharmony_ci @param d Dictionary to examine 873d0407baSopenharmony_ci @param n Section number (from 0 to nsec-1). 883d0407baSopenharmony_ci @return Pointer to char string 893d0407baSopenharmony_ci 903d0407baSopenharmony_ci This function locates the n-th section in a dictionary and returns 913d0407baSopenharmony_ci its name as a pointer to a string statically allocated inside the 923d0407baSopenharmony_ci dictionary. Do not free or modify the returned string! 933d0407baSopenharmony_ci 943d0407baSopenharmony_ci This function returns NULL in case of error. 953d0407baSopenharmony_ci */ 963d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/ 973d0407baSopenharmony_ci 983d0407baSopenharmony_ciconst char * iniparser_getsecname(const dictionary * d, int n); 993d0407baSopenharmony_ci 1003d0407baSopenharmony_ci 1013d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/ 1023d0407baSopenharmony_ci/** 1033d0407baSopenharmony_ci @brief Save a dictionary to a loadable ini file 1043d0407baSopenharmony_ci @param d Dictionary to dump 1053d0407baSopenharmony_ci @param f Opened file pointer to dump to 1063d0407baSopenharmony_ci @return void 1073d0407baSopenharmony_ci 1083d0407baSopenharmony_ci This function dumps a given dictionary into a loadable ini file. 1093d0407baSopenharmony_ci It is Ok to specify @c stderr or @c stdout as output files. 1103d0407baSopenharmony_ci */ 1113d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/ 1123d0407baSopenharmony_ci 1133d0407baSopenharmony_civoid iniparser_dump_ini(const dictionary * d, FILE * f); 1143d0407baSopenharmony_ci 1153d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/ 1163d0407baSopenharmony_ci/** 1173d0407baSopenharmony_ci @brief Save a dictionary section to a loadable ini file 1183d0407baSopenharmony_ci @param d Dictionary to dump 1193d0407baSopenharmony_ci @param s Section name of dictionary to dump 1203d0407baSopenharmony_ci @param f Opened file pointer to dump to 1213d0407baSopenharmony_ci @return void 1223d0407baSopenharmony_ci 1233d0407baSopenharmony_ci This function dumps a given section of a given dictionary into a loadable ini 1243d0407baSopenharmony_ci file. It is Ok to specify @c stderr or @c stdout as output files. 1253d0407baSopenharmony_ci */ 1263d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/ 1273d0407baSopenharmony_ci 1283d0407baSopenharmony_civoid iniparser_dumpsection_ini(const dictionary * d, const char * s, FILE * f); 1293d0407baSopenharmony_ci 1303d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/ 1313d0407baSopenharmony_ci/** 1323d0407baSopenharmony_ci @brief Dump a dictionary to an opened file pointer. 1333d0407baSopenharmony_ci @param d Dictionary to dump. 1343d0407baSopenharmony_ci @param f Opened file pointer to dump to. 1353d0407baSopenharmony_ci @return void 1363d0407baSopenharmony_ci 1373d0407baSopenharmony_ci This function prints out the contents of a dictionary, one element by 1383d0407baSopenharmony_ci line, onto the provided file pointer. It is OK to specify @c stderr 1393d0407baSopenharmony_ci or @c stdout as output files. This function is meant for debugging 1403d0407baSopenharmony_ci purposes mostly. 1413d0407baSopenharmony_ci */ 1423d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/ 1433d0407baSopenharmony_civoid iniparser_dump(const dictionary * d, FILE * f); 1443d0407baSopenharmony_ci 1453d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/ 1463d0407baSopenharmony_ci/** 1473d0407baSopenharmony_ci @brief Get the number of keys in a section of a dictionary. 1483d0407baSopenharmony_ci @param d Dictionary to examine 1493d0407baSopenharmony_ci @param s Section name of dictionary to examine 1503d0407baSopenharmony_ci @return Number of keys in section 1513d0407baSopenharmony_ci */ 1523d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/ 1533d0407baSopenharmony_ciint iniparser_getsecnkeys(const dictionary * d, const char * s); 1543d0407baSopenharmony_ci 1553d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/ 1563d0407baSopenharmony_ci/** 1573d0407baSopenharmony_ci @brief Get the number of keys in a section of a dictionary. 1583d0407baSopenharmony_ci @param d Dictionary to examine 1593d0407baSopenharmony_ci @param s Section name of dictionary to examine 1603d0407baSopenharmony_ci @param keys Already allocated array to store the keys in 1613d0407baSopenharmony_ci @return The pointer passed as `keys` argument or NULL in case of error 1623d0407baSopenharmony_ci 1633d0407baSopenharmony_ci This function queries a dictionary and finds all keys in a given section. 1643d0407baSopenharmony_ci The keys argument should be an array of pointers which size has been 1653d0407baSopenharmony_ci determined by calling `iniparser_getsecnkeys` function prior to this one. 1663d0407baSopenharmony_ci 1673d0407baSopenharmony_ci Each pointer in the returned char pointer-to-pointer is pointing to 1683d0407baSopenharmony_ci a string allocated in the dictionary; do not free or modify them. 1693d0407baSopenharmony_ci */ 1703d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/ 1713d0407baSopenharmony_ciconst char ** iniparser_getseckeys(const dictionary * d, const char * s, const char ** keys); 1723d0407baSopenharmony_ci 1733d0407baSopenharmony_ci 1743d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/ 1753d0407baSopenharmony_ci/** 1763d0407baSopenharmony_ci @brief Get the string associated to a key 1773d0407baSopenharmony_ci @param d Dictionary to search 1783d0407baSopenharmony_ci @param key Key string to look for 1793d0407baSopenharmony_ci @param def Default value to return if key not found. 1803d0407baSopenharmony_ci @return pointer to statically allocated character string 1813d0407baSopenharmony_ci 1823d0407baSopenharmony_ci This function queries a dictionary for a key. A key as read from an 1833d0407baSopenharmony_ci ini file is given as "section:key". If the key cannot be found, 1843d0407baSopenharmony_ci the pointer passed as 'def' is returned. 1853d0407baSopenharmony_ci The returned char pointer is pointing to a string allocated in 1863d0407baSopenharmony_ci the dictionary, do not free or modify it. 1873d0407baSopenharmony_ci */ 1883d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/ 1893d0407baSopenharmony_ciconst char * iniparser_getstring(const dictionary * d, const char * key, const char * def); 1903d0407baSopenharmony_ci 1913d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/ 1923d0407baSopenharmony_ci/** 1933d0407baSopenharmony_ci @brief Get the string associated to a key, convert to an int 1943d0407baSopenharmony_ci @param d Dictionary to search 1953d0407baSopenharmony_ci @param key Key string to look for 1963d0407baSopenharmony_ci @param notfound Value to return in case of error 1973d0407baSopenharmony_ci @return integer 1983d0407baSopenharmony_ci 1993d0407baSopenharmony_ci This function queries a dictionary for a key. A key as read from an 2003d0407baSopenharmony_ci ini file is given as "section:key". If the key cannot be found, 2013d0407baSopenharmony_ci the notfound value is returned. 2023d0407baSopenharmony_ci 2033d0407baSopenharmony_ci Supported values for integers include the usual C notation 2043d0407baSopenharmony_ci so decimal, octal (starting with 0) and hexadecimal (starting with 0x) 2053d0407baSopenharmony_ci are supported. Examples: 2063d0407baSopenharmony_ci 2073d0407baSopenharmony_ci - "42" -> 42 2083d0407baSopenharmony_ci - "042" -> 34 (octal -> decimal) 2093d0407baSopenharmony_ci - "0x42" -> 66 (hexa -> decimal) 2103d0407baSopenharmony_ci 2113d0407baSopenharmony_ci Warning: the conversion may overflow in various ways. Conversion is 2123d0407baSopenharmony_ci totally outsourced to strtol(), see the associated man page for overflow 2133d0407baSopenharmony_ci handling. 2143d0407baSopenharmony_ci 2153d0407baSopenharmony_ci Credits: Thanks to A. Becker for suggesting strtol() 2163d0407baSopenharmony_ci */ 2173d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/ 2183d0407baSopenharmony_ciint iniparser_getint(const dictionary * d, const char * key, int notfound); 2193d0407baSopenharmony_ci 2203d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/ 2213d0407baSopenharmony_ci/** 2223d0407baSopenharmony_ci @brief Get the string associated to a key, convert to an long int 2233d0407baSopenharmony_ci @param d Dictionary to search 2243d0407baSopenharmony_ci @param key Key string to look for 2253d0407baSopenharmony_ci @param notfound Value to return in case of error 2263d0407baSopenharmony_ci @return integer 2273d0407baSopenharmony_ci 2283d0407baSopenharmony_ci This function queries a dictionary for a key. A key as read from an 2293d0407baSopenharmony_ci ini file is given as "section:key". If the key cannot be found, 2303d0407baSopenharmony_ci the notfound value is returned. 2313d0407baSopenharmony_ci 2323d0407baSopenharmony_ci Supported values for integers include the usual C notation 2333d0407baSopenharmony_ci so decimal, octal (starting with 0) and hexadecimal (starting with 0x) 2343d0407baSopenharmony_ci are supported. Examples: 2353d0407baSopenharmony_ci 2363d0407baSopenharmony_ci - "42" -> 42 2373d0407baSopenharmony_ci - "042" -> 34 (octal -> decimal) 2383d0407baSopenharmony_ci - "0x42" -> 66 (hexa -> decimal) 2393d0407baSopenharmony_ci 2403d0407baSopenharmony_ci Warning: the conversion may overflow in various ways. Conversion is 2413d0407baSopenharmony_ci totally outsourced to strtol(), see the associated man page for overflow 2423d0407baSopenharmony_ci handling. 2433d0407baSopenharmony_ci */ 2443d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/ 2453d0407baSopenharmony_cilong int iniparser_getlongint(const dictionary * d, const char * key, long int notfound); 2463d0407baSopenharmony_ci 2473d0407baSopenharmony_ci 2483d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/ 2493d0407baSopenharmony_ci/** 2503d0407baSopenharmony_ci @brief Get the string associated to a key, convert to a double 2513d0407baSopenharmony_ci @param d Dictionary to search 2523d0407baSopenharmony_ci @param key Key string to look for 2533d0407baSopenharmony_ci @param notfound Value to return in case of error 2543d0407baSopenharmony_ci @return double 2553d0407baSopenharmony_ci 2563d0407baSopenharmony_ci This function queries a dictionary for a key. A key as read from an 2573d0407baSopenharmony_ci ini file is given as "section:key". If the key cannot be found, 2583d0407baSopenharmony_ci the notfound value is returned. 2593d0407baSopenharmony_ci */ 2603d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/ 2613d0407baSopenharmony_cidouble iniparser_getdouble(const dictionary * d, const char * key, double notfound); 2623d0407baSopenharmony_ci 2633d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/ 2643d0407baSopenharmony_ci/** 2653d0407baSopenharmony_ci @brief Get the string associated to a key, convert to a boolean 2663d0407baSopenharmony_ci @param d Dictionary to search 2673d0407baSopenharmony_ci @param key Key string to look for 2683d0407baSopenharmony_ci @param notfound Value to return in case of error 2693d0407baSopenharmony_ci @return integer 2703d0407baSopenharmony_ci 2713d0407baSopenharmony_ci This function queries a dictionary for a key. A key as read from an 2723d0407baSopenharmony_ci ini file is given as "section:key". If the key cannot be found, 2733d0407baSopenharmony_ci the notfound value is returned. 2743d0407baSopenharmony_ci 2753d0407baSopenharmony_ci A true boolean is found if one of the following is matched: 2763d0407baSopenharmony_ci 2773d0407baSopenharmony_ci - A string starting with 'y' 2783d0407baSopenharmony_ci - A string starting with 'Y' 2793d0407baSopenharmony_ci - A string starting with 't' 2803d0407baSopenharmony_ci - A string starting with 'T' 2813d0407baSopenharmony_ci - A string starting with '1' 2823d0407baSopenharmony_ci 2833d0407baSopenharmony_ci A false boolean is found if one of the following is matched: 2843d0407baSopenharmony_ci 2853d0407baSopenharmony_ci - A string starting with 'n' 2863d0407baSopenharmony_ci - A string starting with 'N' 2873d0407baSopenharmony_ci - A string starting with 'f' 2883d0407baSopenharmony_ci - A string starting with 'F' 2893d0407baSopenharmony_ci - A string starting with '0' 2903d0407baSopenharmony_ci 2913d0407baSopenharmony_ci The notfound value returned if no boolean is identified, does not 2923d0407baSopenharmony_ci necessarily have to be 0 or 1. 2933d0407baSopenharmony_ci */ 2943d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/ 2953d0407baSopenharmony_ciint iniparser_getboolean(const dictionary * d, const char * key, int notfound); 2963d0407baSopenharmony_ci 2973d0407baSopenharmony_ci 2983d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/ 2993d0407baSopenharmony_ci/** 3003d0407baSopenharmony_ci @brief Set an entry in a dictionary. 3013d0407baSopenharmony_ci @param ini Dictionary to modify. 3023d0407baSopenharmony_ci @param entry Entry to modify (entry name) 3033d0407baSopenharmony_ci @param val New value to associate to the entry. 3043d0407baSopenharmony_ci @return int 0 if Ok, -1 otherwise. 3053d0407baSopenharmony_ci 3063d0407baSopenharmony_ci If the given entry can be found in the dictionary, it is modified to 3073d0407baSopenharmony_ci contain the provided value. If it cannot be found, the entry is created. 3083d0407baSopenharmony_ci It is Ok to set val to NULL. 3093d0407baSopenharmony_ci */ 3103d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/ 3113d0407baSopenharmony_ciint iniparser_set(dictionary * ini, const char * entry, const char * val); 3123d0407baSopenharmony_ci 3133d0407baSopenharmony_ci 3143d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/ 3153d0407baSopenharmony_ci/** 3163d0407baSopenharmony_ci @brief Delete an entry in a dictionary 3173d0407baSopenharmony_ci @param ini Dictionary to modify 3183d0407baSopenharmony_ci @param entry Entry to delete (entry name) 3193d0407baSopenharmony_ci @return void 3203d0407baSopenharmony_ci 3213d0407baSopenharmony_ci If the given entry can be found, it is deleted from the dictionary. 3223d0407baSopenharmony_ci */ 3233d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/ 3243d0407baSopenharmony_civoid iniparser_unset(dictionary * ini, const char * entry); 3253d0407baSopenharmony_ci 3263d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/ 3273d0407baSopenharmony_ci/** 3283d0407baSopenharmony_ci @brief Finds out if a given entry exists in a dictionary 3293d0407baSopenharmony_ci @param ini Dictionary to search 3303d0407baSopenharmony_ci @param entry Name of the entry to look for 3313d0407baSopenharmony_ci @return integer 1 if entry exists, 0 otherwise 3323d0407baSopenharmony_ci 3333d0407baSopenharmony_ci Finds out if a given entry exists in the dictionary. Since sections 3343d0407baSopenharmony_ci are stored as keys with NULL associated values, this is the only way 3353d0407baSopenharmony_ci of querying for the presence of sections in a dictionary. 3363d0407baSopenharmony_ci */ 3373d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/ 3383d0407baSopenharmony_ciint iniparser_find_entry(const dictionary * ini, const char * entry) ; 3393d0407baSopenharmony_ci 3403d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/ 3413d0407baSopenharmony_ci/** 3423d0407baSopenharmony_ci @brief Parse an ini file and return an allocated dictionary object 3433d0407baSopenharmony_ci @param ininame Name of the ini file to read. 3443d0407baSopenharmony_ci @return Pointer to newly allocated dictionary 3453d0407baSopenharmony_ci 3463d0407baSopenharmony_ci This is the parser for ini files. This function is called, providing 3473d0407baSopenharmony_ci the name of the file to be read. It returns a dictionary object that 3483d0407baSopenharmony_ci should not be accessed directly, but through accessor functions 3493d0407baSopenharmony_ci instead. 3503d0407baSopenharmony_ci 3513d0407baSopenharmony_ci The returned dictionary must be freed using iniparser_freedict(). 3523d0407baSopenharmony_ci */ 3533d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/ 3543d0407baSopenharmony_cidictionary * iniparser_load(const char * ininame); 3553d0407baSopenharmony_ci 3563d0407baSopenharmony_ci/*-------------------------------------------------------------------------*/ 3573d0407baSopenharmony_ci/** 3583d0407baSopenharmony_ci @brief Free all memory associated to an ini dictionary 3593d0407baSopenharmony_ci @param d Dictionary to free 3603d0407baSopenharmony_ci @return void 3613d0407baSopenharmony_ci 3623d0407baSopenharmony_ci Free all memory associated to an ini dictionary. 3633d0407baSopenharmony_ci It is mandatory to call this function before the dictionary object 3643d0407baSopenharmony_ci gets out of the current context. 3653d0407baSopenharmony_ci */ 3663d0407baSopenharmony_ci/*--------------------------------------------------------------------------*/ 3673d0407baSopenharmony_civoid iniparser_freedict(dictionary * d); 3683d0407baSopenharmony_ci 3693d0407baSopenharmony_ci#ifdef __cplusplus 3703d0407baSopenharmony_ci} 3713d0407baSopenharmony_ci#endif 3723d0407baSopenharmony_ci 3733d0407baSopenharmony_ci#endif 374