mirror of
				https://github.com/nyanmisaka/mpp.git
				synced 2025-10-31 12:36:44 +08:00 
			
		
		
		
	 52c93a4955
			
		
	
	52c93a4955
	
	
	
		
			
			Change-Id: Id29dc65a732aa62f4614f1d602545c04e7de054b Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
		
			
				
	
	
		
			359 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			359 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| /*-------------------------------------------------------------------------*/
 | |
| /**
 | |
|    @file    iniparser.h
 | |
|    @author  N. Devillard
 | |
|    @brief   Parser for ini files.
 | |
| */
 | |
| /*--------------------------------------------------------------------------*/
 | |
| 
 | |
| #ifndef _INIPARSER_H_
 | |
| #define _INIPARSER_H_
 | |
| 
 | |
| /*---------------------------------------------------------------------------
 | |
|                                 Includes
 | |
|  ---------------------------------------------------------------------------*/
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| 
 | |
| /*
 | |
|  * The following #include is necessary on many Unixes but not Linux.
 | |
|  * It is not needed for Windows platforms.
 | |
|  * Uncomment it if needed.
 | |
|  */
 | |
| /* #include <unistd.h> */
 | |
| 
 | |
| #include "dictionary.h"
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| /*-------------------------------------------------------------------------*/
 | |
| /**
 | |
|   @brief    Configure a function to receive the error messages.
 | |
|   @param    errback  Function to call.
 | |
| 
 | |
|   By default, the error will be printed on stderr. If a null pointer is passed
 | |
|   as errback the error callback will be switched back to default.
 | |
|  */
 | |
| /*--------------------------------------------------------------------------*/
 | |
| 
 | |
| void iniparser_set_error_callback(int (*errback)(const char *, ...));
 | |
| 
 | |
| /*-------------------------------------------------------------------------*/
 | |
| /**
 | |
|   @brief    Get number of sections in a dictionary
 | |
|   @param    d   Dictionary to examine
 | |
|   @return   int Number of sections found in dictionary
 | |
| 
 | |
|   This function returns the number of sections found in a dictionary.
 | |
|   The test to recognize sections is done on the string stored in the
 | |
|   dictionary: a section name is given as "section" whereas a key is
 | |
|   stored as "section:key", thus the test looks for entries that do not
 | |
|   contain a colon.
 | |
| 
 | |
|   This clearly fails in the case a section name contains a colon, but
 | |
|   this should simply be avoided.
 | |
| 
 | |
|   This function returns -1 in case of error.
 | |
|  */
 | |
| /*--------------------------------------------------------------------------*/
 | |
| 
 | |
| int iniparser_getnsec(const dictionary * d);
 | |
| 
 | |
| 
 | |
| /*-------------------------------------------------------------------------*/
 | |
| /**
 | |
|   @brief    Get name for section n in a dictionary.
 | |
|   @param    d   Dictionary to examine
 | |
|   @param    n   Section number (from 0 to nsec-1).
 | |
|   @return   Pointer to char string
 | |
| 
 | |
|   This function locates the n-th section in a dictionary and returns
 | |
|   its name as a pointer to a string statically allocated inside the
 | |
|   dictionary. Do not free or modify the returned string!
 | |
| 
 | |
|   This function returns NULL in case of error.
 | |
|  */
 | |
| /*--------------------------------------------------------------------------*/
 | |
| 
 | |
| const char * iniparser_getsecname(const dictionary * d, int n);
 | |
| 
 | |
| 
 | |
| /*-------------------------------------------------------------------------*/
 | |
| /**
 | |
|   @brief    Save a dictionary to a loadable ini file
 | |
|   @param    d   Dictionary to dump
 | |
|   @param    f   Opened file pointer to dump to
 | |
|   @return   void
 | |
| 
 | |
|   This function dumps a given dictionary into a loadable ini file.
 | |
|   It is Ok to specify @c stderr or @c stdout as output files.
 | |
|  */
 | |
| /*--------------------------------------------------------------------------*/
 | |
| 
 | |
| void iniparser_dump_ini(const dictionary * d, FILE * f);
 | |
| 
 | |
| /*-------------------------------------------------------------------------*/
 | |
| /**
 | |
|   @brief    Save a dictionary section to a loadable ini file
 | |
|   @param    d   Dictionary to dump
 | |
|   @param    s   Section name of dictionary to dump
 | |
|   @param    f   Opened file pointer to dump to
 | |
|   @return   void
 | |
| 
 | |
|   This function dumps a given section of a given dictionary into a loadable ini
 | |
|   file.  It is Ok to specify @c stderr or @c stdout as output files.
 | |
|  */
 | |
| /*--------------------------------------------------------------------------*/
 | |
| 
 | |
| void iniparser_dumpsection_ini(const dictionary * d, const char * s, FILE * f);
 | |
| 
 | |
| /*-------------------------------------------------------------------------*/
 | |
| /**
 | |
|   @brief    Dump a dictionary to an opened file pointer.
 | |
|   @param    d   Dictionary to dump.
 | |
|   @param    f   Opened file pointer to dump to.
 | |
|   @return   void
 | |
| 
 | |
|   This function prints out the contents of a dictionary, one element by
 | |
|   line, onto the provided file pointer. It is OK to specify @c stderr
 | |
|   or @c stdout as output files. This function is meant for debugging
 | |
|   purposes mostly.
 | |
|  */
 | |
| /*--------------------------------------------------------------------------*/
 | |
| void iniparser_dump(const dictionary * d, FILE * f);
 | |
| 
 | |
| /*-------------------------------------------------------------------------*/
 | |
| /**
 | |
|   @brief    Get the number of keys in a section of a dictionary.
 | |
|   @param    d   Dictionary to examine
 | |
|   @param    s   Section name of dictionary to examine
 | |
|   @return   Number of keys in section
 | |
|  */
 | |
| /*--------------------------------------------------------------------------*/
 | |
| int iniparser_getsecnkeys(const dictionary * d, const char * s);
 | |
| 
 | |
| /*-------------------------------------------------------------------------*/
 | |
| /**
 | |
|   @brief    Get the number of keys in a section of a dictionary.
 | |
|   @param    d    Dictionary to examine
 | |
|   @param    s    Section name of dictionary to examine
 | |
|   @param    keys Already allocated array to store the keys in
 | |
|   @return   The pointer passed as `keys` argument or NULL in case of error
 | |
| 
 | |
|   This function queries a dictionary and finds all keys in a given section.
 | |
|   The keys argument should be an array of pointers which size has been
 | |
|   determined by calling `iniparser_getsecnkeys` function prior to this one.
 | |
| 
 | |
|   Each pointer in the returned char pointer-to-pointer is pointing to
 | |
|   a string allocated in the dictionary; do not free or modify them.
 | |
|  */
 | |
| /*--------------------------------------------------------------------------*/
 | |
| const char ** iniparser_getseckeys(const dictionary * d, const char * s, const char ** keys);
 | |
| 
 | |
| 
 | |
| /*-------------------------------------------------------------------------*/
 | |
| /**
 | |
|   @brief    Get the string associated to a key
 | |
|   @param    d       Dictionary to search
 | |
|   @param    key     Key string to look for
 | |
|   @param    def     Default value to return if key not found.
 | |
|   @return   pointer to statically allocated character string
 | |
| 
 | |
|   This function queries a dictionary for a key. A key as read from an
 | |
|   ini file is given as "section:key". If the key cannot be found,
 | |
|   the pointer passed as 'def' is returned.
 | |
|   The returned char pointer is pointing to a string allocated in
 | |
|   the dictionary, do not free or modify it.
 | |
|  */
 | |
| /*--------------------------------------------------------------------------*/
 | |
| const char * iniparser_getstring(const dictionary * d, const char * key, const char * def);
 | |
| 
 | |
| /*-------------------------------------------------------------------------*/
 | |
| /**
 | |
|   @brief    Get the string associated to a key, convert to an int
 | |
|   @param    d Dictionary to search
 | |
|   @param    key Key string to look for
 | |
|   @param    notfound Value to return in case of error
 | |
|   @return   integer
 | |
| 
 | |
|   This function queries a dictionary for a key. A key as read from an
 | |
|   ini file is given as "section:key". If the key cannot be found,
 | |
|   the notfound value is returned.
 | |
| 
 | |
|   Supported values for integers include the usual C notation
 | |
|   so decimal, octal (starting with 0) and hexadecimal (starting with 0x)
 | |
|   are supported. Examples:
 | |
| 
 | |
|   - "42"      ->  42
 | |
|   - "042"     ->  34 (octal -> decimal)
 | |
|   - "0x42"    ->  66 (hexa  -> decimal)
 | |
| 
 | |
|   Warning: the conversion may overflow in various ways. Conversion is
 | |
|   totally outsourced to strtol(), see the associated man page for overflow
 | |
|   handling.
 | |
| 
 | |
|   Credits: Thanks to A. Becker for suggesting strtol()
 | |
|  */
 | |
| /*--------------------------------------------------------------------------*/
 | |
| int iniparser_getint(const dictionary * d, const char * key, int notfound);
 | |
| 
 | |
| /*-------------------------------------------------------------------------*/
 | |
| /**
 | |
|   @brief    Get the string associated to a key, convert to an long int
 | |
|   @param    d Dictionary to search
 | |
|   @param    key Key string to look for
 | |
|   @param    notfound Value to return in case of error
 | |
|   @return   integer
 | |
| 
 | |
|   This function queries a dictionary for a key. A key as read from an
 | |
|   ini file is given as "section:key". If the key cannot be found,
 | |
|   the notfound value is returned.
 | |
| 
 | |
|   Supported values for integers include the usual C notation
 | |
|   so decimal, octal (starting with 0) and hexadecimal (starting with 0x)
 | |
|   are supported. Examples:
 | |
| 
 | |
|   - "42"      ->  42
 | |
|   - "042"     ->  34 (octal -> decimal)
 | |
|   - "0x42"    ->  66 (hexa  -> decimal)
 | |
| 
 | |
|   Warning: the conversion may overflow in various ways. Conversion is
 | |
|   totally outsourced to strtol(), see the associated man page for overflow
 | |
|   handling.
 | |
|  */
 | |
| /*--------------------------------------------------------------------------*/
 | |
| long int iniparser_getlongint(const dictionary * d, const char * key, long int notfound);
 | |
| 
 | |
| 
 | |
| /*-------------------------------------------------------------------------*/
 | |
| /**
 | |
|   @brief    Get the string associated to a key, convert to a double
 | |
|   @param    d Dictionary to search
 | |
|   @param    key Key string to look for
 | |
|   @param    notfound Value to return in case of error
 | |
|   @return   double
 | |
| 
 | |
|   This function queries a dictionary for a key. A key as read from an
 | |
|   ini file is given as "section:key". If the key cannot be found,
 | |
|   the notfound value is returned.
 | |
|  */
 | |
| /*--------------------------------------------------------------------------*/
 | |
| double iniparser_getdouble(const dictionary * d, const char * key, double notfound);
 | |
| 
 | |
| /*-------------------------------------------------------------------------*/
 | |
| /**
 | |
|   @brief    Get the string associated to a key, convert to a boolean
 | |
|   @param    d Dictionary to search
 | |
|   @param    key Key string to look for
 | |
|   @param    notfound Value to return in case of error
 | |
|   @return   integer
 | |
| 
 | |
|   This function queries a dictionary for a key. A key as read from an
 | |
|   ini file is given as "section:key". If the key cannot be found,
 | |
|   the notfound value is returned.
 | |
| 
 | |
|   A true boolean is found if one of the following is matched:
 | |
| 
 | |
|   - A string starting with 'y'
 | |
|   - A string starting with 'Y'
 | |
|   - A string starting with 't'
 | |
|   - A string starting with 'T'
 | |
|   - A string starting with '1'
 | |
| 
 | |
|   A false boolean is found if one of the following is matched:
 | |
| 
 | |
|   - A string starting with 'n'
 | |
|   - A string starting with 'N'
 | |
|   - A string starting with 'f'
 | |
|   - A string starting with 'F'
 | |
|   - A string starting with '0'
 | |
| 
 | |
|   The notfound value returned if no boolean is identified, does not
 | |
|   necessarily have to be 0 or 1.
 | |
|  */
 | |
| /*--------------------------------------------------------------------------*/
 | |
| int iniparser_getboolean(const dictionary * d, const char * key, int notfound);
 | |
| 
 | |
| 
 | |
| /*-------------------------------------------------------------------------*/
 | |
| /**
 | |
|   @brief    Set an entry in a dictionary.
 | |
|   @param    ini     Dictionary to modify.
 | |
|   @param    entry   Entry to modify (entry name)
 | |
|   @param    val     New value to associate to the entry.
 | |
|   @return   int     0 if Ok, -1 otherwise.
 | |
| 
 | |
|   If the given entry can be found in the dictionary, it is modified to
 | |
|   contain the provided value. If it cannot be found, the entry is created.
 | |
|   It is Ok to set val to NULL.
 | |
|  */
 | |
| /*--------------------------------------------------------------------------*/
 | |
| int iniparser_set(dictionary * ini, const char * entry, const char * val);
 | |
| 
 | |
| 
 | |
| /*-------------------------------------------------------------------------*/
 | |
| /**
 | |
|   @brief    Delete an entry in a dictionary
 | |
|   @param    ini     Dictionary to modify
 | |
|   @param    entry   Entry to delete (entry name)
 | |
|   @return   void
 | |
| 
 | |
|   If the given entry can be found, it is deleted from the dictionary.
 | |
|  */
 | |
| /*--------------------------------------------------------------------------*/
 | |
| void iniparser_unset(dictionary * ini, const char * entry);
 | |
| 
 | |
| /*-------------------------------------------------------------------------*/
 | |
| /**
 | |
|   @brief    Finds out if a given entry exists in a dictionary
 | |
|   @param    ini     Dictionary to search
 | |
|   @param    entry   Name of the entry to look for
 | |
|   @return   integer 1 if entry exists, 0 otherwise
 | |
| 
 | |
|   Finds out if a given entry exists in the dictionary. Since sections
 | |
|   are stored as keys with NULL associated values, this is the only way
 | |
|   of querying for the presence of sections in a dictionary.
 | |
|  */
 | |
| /*--------------------------------------------------------------------------*/
 | |
| int iniparser_find_entry(const dictionary * ini, const char * entry) ;
 | |
| 
 | |
| /*-------------------------------------------------------------------------*/
 | |
| /**
 | |
|   @brief    Parse an ini file and return an allocated dictionary object
 | |
|   @param    ininame Name of the ini file to read.
 | |
|   @return   Pointer to newly allocated dictionary
 | |
| 
 | |
|   This is the parser for ini files. This function is called, providing
 | |
|   the name of the file to be read. It returns a dictionary object that
 | |
|   should not be accessed directly, but through accessor functions
 | |
|   instead.
 | |
| 
 | |
|   The returned dictionary must be freed using iniparser_freedict().
 | |
|  */
 | |
| /*--------------------------------------------------------------------------*/
 | |
| dictionary * iniparser_load(const char * ininame);
 | |
| 
 | |
| /*-------------------------------------------------------------------------*/
 | |
| /**
 | |
|   @brief    Free all memory associated to an ini dictionary
 | |
|   @param    d Dictionary to free
 | |
|   @return   void
 | |
| 
 | |
|   Free all memory associated to an ini dictionary.
 | |
|   It is mandatory to call this function before the dictionary object
 | |
|   gets out of the current context.
 | |
|  */
 | |
| /*--------------------------------------------------------------------------*/
 | |
| void iniparser_freedict(dictionary * d);
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif
 |