aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2024-12-17 13:49:20 +0100
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2024-12-17 13:51:35 +0100
commit2764911eb37dfb302d44bb5b2d5984d662b40c27 (patch)
treebb984452bf180089d8ef3527137ba44cf3a8664d /include
parente17ffbfb1ab07f8d0d4b864a5f477e119843722d (diff)
Import a more recent version of libiniparser
We use a vendored library for parsing ini files. Our copy of this library has not been updated since 2007. This commit imports the recent version of the ini parsing library from upstream source at https://gitlab.com/iniparser/iniparser Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'include')
-rw-r--r--include/dictionary.h52
-rw-r--r--include/libiniparser.h218
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