diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/dictionary.h | 52 | ||||
| -rw-r--r-- | include/libiniparser.h | 218 | 
2 files changed, 187 insertions, 83 deletions
| diff --git a/include/dictionary.h b/include/dictionary.h index c7d1790..f459cfe 100644 --- a/include/dictionary.h +++ b/include/dictionary.h @@ -3,8 +3,6 @@  /**     @file    dictionary.h     @author  N. Devillard -   @date    Sep 2007 -   @version $Revision: 1.12 $     @brief   Implements a dictionary for string variables.     This module implements a simple dictionary object, i.e. a list @@ -13,33 +11,27 @@  */  /*--------------------------------------------------------------------------*/ -/* -	$Id: dictionary.h,v 1.12 2007-11-23 21:37:00 ndevilla Exp $ -	$Author: ndevilla $ -	$Date: 2007-11-23 21:37:00 $ -	$Revision: 1.12 $ -*/ -  #ifndef _DICTIONARY_H_  #define _DICTIONARY_H_  /*--------------------------------------------------------------------------- -   								Includes +                                Includes   ---------------------------------------------------------------------------*/  #include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> + +#ifdef __cplusplus +extern "C" { +#endif  /*--------------------------------------------------------------------------- -   								New types +                                New types   ---------------------------------------------------------------------------*/  /*-------------------------------------------------------------------------*/  /** -  @brief	Dictionary object +  @brief    Dictionary object    This object contains a list of string/string associations. Each    association is identified by a unique string key. Looking up values @@ -48,16 +40,16 @@   */  /*-------------------------------------------------------------------------*/  typedef struct _dictionary_ { -	int				n ;		/** Number of entries in dictionary */ -	int				size ;	/** Storage size */ -	char 		**	val ;	/** List of string values */ -	char 		**  key ;	/** List of string keys */ -	unsigned	 *	hash ;	/** List of hash values for keys */ +    unsigned        n ;     /** Number of entries in dictionary */ +    size_t          size ;  /** Storage size */ +    char        **  val ;   /** List of string values */ +    char        **  key ;   /** List of string keys */ +    unsigned     *  hash ;  /** List of hash values for keys */  } dictionary ;  /*--------------------------------------------------------------------------- -  							Function prototypes +                            Function prototypes   ---------------------------------------------------------------------------*/  /*-------------------------------------------------------------------------*/ @@ -72,20 +64,20 @@ typedef struct _dictionary_ {    by comparing the key itself in last resort.   */  /*--------------------------------------------------------------------------*/ -unsigned dictionary_hash(char * key); +unsigned dictionary_hash(const char * key);  /*-------------------------------------------------------------------------*/  /**    @brief    Create a new dictionary object.    @param    size    Optional initial size of the dictionary. -  @return   1 newly allocated dictionary objet. +  @return   1 newly allocated dictionary object.    This function allocates a new dictionary object of given size and returns    it. If you do not know in advance (roughly) the number of entries in the    dictionary, give size=0.   */  /*--------------------------------------------------------------------------*/ -dictionary * dictionary_new(int size); +dictionary * dictionary_new(size_t size);  /*-------------------------------------------------------------------------*/  /** @@ -112,7 +104,7 @@ void dictionary_del(dictionary * vd);    dictionary object, you should not try to free it or modify it.   */  /*--------------------------------------------------------------------------*/ -char * dictionary_get(dictionary * d, char * key, char * def); +const char * dictionary_get(const dictionary * d, const char * key, const char * def);  /*-------------------------------------------------------------------------*/ @@ -141,7 +133,7 @@ char * dictionary_get(dictionary * d, char * key, char * def);    This function returns non-zero in case of failure.   */  /*--------------------------------------------------------------------------*/ -int dictionary_set(dictionary * vd, char * key, char * val); +int dictionary_set(dictionary * vd, const char * key, const char * val);  /*-------------------------------------------------------------------------*/  /** @@ -154,7 +146,7 @@ int dictionary_set(dictionary * vd, char * key, char * val);    key cannot be found.   */  /*--------------------------------------------------------------------------*/ -void dictionary_unset(dictionary * d, char * key); +void dictionary_unset(dictionary * d, const char * key);  /*-------------------------------------------------------------------------*/ @@ -169,6 +161,10 @@ void dictionary_unset(dictionary * d, char * key);    output file pointers.   */  /*--------------------------------------------------------------------------*/ -void dictionary_dump(dictionary * d, FILE * out); +void dictionary_dump(const dictionary * d, FILE * out); + +#ifdef __cplusplus +} +#endif  #endif diff --git a/include/libiniparser.h b/include/libiniparser.h index abd77aa..2fe0a3d 100644 --- a/include/libiniparser.h +++ b/include/libiniparser.h @@ -3,43 +3,23 @@  /**     @file    iniparser.h     @author  N. Devillard -   @date    Sep 2007 -   @version 3.0     @brief   Parser for ini files.  */  /*--------------------------------------------------------------------------*/ -/* -	$Id: iniparser.h,v 1.24 2007-11-23 21:38:19 ndevilla Exp $ -	$Revision: 1.24 $ -*/ -  #ifndef _INIPARSER_H_  #define _INIPARSER_H_  /*--------------------------------------------------------------------------- -   								Includes +                                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" +#include <stdint.h> -/*--------------------------------------------------------------------------- -   								Macros - ---------------------------------------------------------------------------*/ -/** For backwards compatibility only */ -#define iniparser_getstr(d, k)  iniparser_getstring(d, k, NULL) -#define iniparser_setstr        iniparser_setstring +#ifdef __cplusplus +extern "C" { +#endif  /*-------------------------------------------------------------------------*/  /** @@ -60,7 +40,7 @@   */  /*--------------------------------------------------------------------------*/ -int iniparser_getnsec(dictionary * d); +int iniparser_getnsec(const dictionary * d);  /*-------------------------------------------------------------------------*/ @@ -78,7 +58,7 @@ int iniparser_getnsec(dictionary * d);   */  /*--------------------------------------------------------------------------*/ -char * iniparser_getsecname(dictionary * d, int n); +const char * iniparser_getsecname(const dictionary * d, int n);  /*-------------------------------------------------------------------------*/ @@ -86,21 +66,39 @@ char * iniparser_getsecname(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. + +  All values are quoted, these charecters are escaped: + +  - ' : the quote character (e.g. "String with \"Quotes\"") +  - \ : the backslash character (e.g. "C:\\tmp") +   */  /*--------------------------------------------------------------------------*/ -void iniparser_dump_ini(dictionary * d, FILE * f); +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 + +  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 @@ -108,7 +106,7 @@ void iniparser_dump_ini(dictionary * d, FILE * f);    purposes mostly.   */  /*--------------------------------------------------------------------------*/ -void iniparser_dump(dictionary * d, FILE * f); +void iniparser_dump(const dictionary * d, FILE * f);  /*-------------------------------------------------------------------------*/  /** @@ -125,7 +123,7 @@ void iniparser_dump(dictionary * d, FILE * f);    the dictionary, do not free or modify it.   */  /*--------------------------------------------------------------------------*/ -char * iniparser_getstring(dictionary * d, const char * key, char * def); +const char * iniparser_getstring(const dictionary * d, const char * key, const char * def);  /*-------------------------------------------------------------------------*/  /** @@ -154,7 +152,94 @@ char * iniparser_getstring(dictionary * d, const char * key, char * def);    Credits: Thanks to A. Becker for suggesting strtol()   */  /*--------------------------------------------------------------------------*/ -int iniparser_getint(dictionary * d, const char * key, int notfound); +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 an int64_t +  @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 strtoimax(), see the associated man page for overflow +  handling. + +  This function is usefull on 32bit architectures where `long int` is only +  32bit. + */ +/*--------------------------------------------------------------------------*/ +int64_t iniparser_getint64(const dictionary * d, const char * key, int64_t notfound); + +/*-------------------------------------------------------------------------*/ +/** +  @brief    Get the string associated to a key, convert to an uint64_t +  @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 strtoumax(), see the associated man page for overflow +  handling. + +  This function is usefull on 32bit architectures where `long int` is only +  32bit. + */ +/*--------------------------------------------------------------------------*/ +uint64_t iniparser_getuint64(const dictionary * d, const char * key, uint64_t notfound);  /*-------------------------------------------------------------------------*/  /** @@ -188,36 +273,18 @@ int iniparser_getint(dictionary * d, const char * key, int notfound);    necessarily have to be 0 or 1.   */  /*--------------------------------------------------------------------------*/ -int iniparser_getboolean(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, -1 is returned. -  It is Ok to set val to NULL. - */ -/*--------------------------------------------------------------------------*/ -int iniparser_setstring(dictionary * ini, char * entry, char * val); - +int iniparser_getboolean(const dictionary * d, const char * key, int notfound);  /*-------------------------------------------------------------------------*/  /**    @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, char * entry); +void iniparser_unset(dictionary * ini, const char * entry);  /*-------------------------------------------------------------------------*/  /** @@ -231,7 +298,7 @@ void iniparser_unset(dictionary * ini, char * entry);    of querying for the presence of sections in a dictionary.   */  /*--------------------------------------------------------------------------*/ -int iniparser_find_entry(dictionary * ini, char * entry) ; +int iniparser_find_entry(const dictionary * ini, const char * entry) ;  /*-------------------------------------------------------------------------*/  /** @@ -244,6 +311,17 @@ int iniparser_find_entry(dictionary * ini, char * entry) ;    should not be accessed directly, but through accessor functions    instead. +  Iff the value is a quoted string it supports some escape sequences: + +  - \" or ' : the quote character +  (e.g. 'String with "Quotes"' or "String with 'Quotes'") +  - \ : the backslash character (e.g. "C:\tmp") + +  Escape sequences always start with a backslash. Additional escape sequences +  might be added in the future. Backslash characters must be escaped. Any other +  sequence then those outlined above is invalid and may lead to unpredictable +  results. +    The returned dictionary must be freed using iniparser_freedict().   */  /*--------------------------------------------------------------------------*/ @@ -251,9 +329,35 @@ dictionary * iniparser_load(const char * ininame);  /*-------------------------------------------------------------------------*/  /** +  @brief    Parse an ini file and return an allocated dictionary object +  @param    in File to read. +  @param    ininame Name of the ini file to read (only used for nicer error messages) +  @return   Pointer to newly allocated dictionary + +  This is the parser for ini files. This function is called, providing +  the file to be read. It returns a dictionary object that should not +  be accessed directly, but through accessor functions instead. + +  Iff the value is a quoted string it supports some escape sequences: + +  - \" or ' : the quote character +  (e.g. 'String with "Quotes"' or "String with 'Quotes'") +  - \ : the backslash character (e.g. "C:\tmp") + +  Escape sequences always start with a backslash. Additional escape sequences +  might be added in the future. Backslash characters must be escaped. Any other +  sequence then those outlined above is invalid and may lead to unpredictable +  results. + +  The returned dictionary must be freed using iniparser_freedict(). + */ +/*--------------------------------------------------------------------------*/ +dictionary * iniparser_load_file(FILE * in, 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 @@ -262,4 +366,8 @@ dictionary * iniparser_load(const char * ininame);  /*--------------------------------------------------------------------------*/  void iniparser_freedict(dictionary * d); +#ifdef __cplusplus +} +#endif +  #endif | 
