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