iniparser.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. /*-------------------------------------------------------------------------*/
  2. /**
  3. @file iniparser.h
  4. @author N. Devillard
  5. @date Sep 2007
  6. @version 3.0
  7. @brief Parser for ini files.
  8. */
  9. /*--------------------------------------------------------------------------*/
  10. /*
  11. $Id: iniparser.h,v 1.24 2007-11-23 21:38:19 ndevilla Exp $
  12. $Revision: 1.24 $
  13. */
  14. #ifndef _INIPARSER_H_
  15. #define _INIPARSER_H_
  16. /*---------------------------------------------------------------------------
  17. Includes
  18. ---------------------------------------------------------------------------*/
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. /*
  23. * The following #include is necessary on many Unixes but not Linux.
  24. * It is not needed for Windows platforms.
  25. * Uncomment it if needed.
  26. */
  27. /* #include <unistd.h> */
  28. #include "dictionary.h"
  29. /*---------------------------------------------------------------------------
  30. Macros
  31. ---------------------------------------------------------------------------*/
  32. /** For backwards compatibility only */
  33. #define iniparser_getstr(d, k) iniparser_getstring(d, k, NULL)
  34. #define iniparser_setstr iniparser_setstring
  35. /*-------------------------------------------------------------------------*/
  36. /**
  37. @brief Get number of sections in a dictionary
  38. @param d Dictionary to examine
  39. @return int Number of sections found in dictionary
  40. This function returns the number of sections found in a dictionary.
  41. The test to recognize sections is done on the string stored in the
  42. dictionary: a section name is given as "section" whereas a key is
  43. stored as "section:key", thus the test looks for entries that do not
  44. contain a colon.
  45. This clearly fails in the case a section name contains a colon, but
  46. this should simply be avoided.
  47. This function returns -1 in case of error.
  48. */
  49. /*--------------------------------------------------------------------------*/
  50. int iniparser_getnsec(dictionary* d);
  51. /*-------------------------------------------------------------------------*/
  52. /**
  53. @brief Get name for section n in a dictionary.
  54. @param d Dictionary to examine
  55. @param n Section number (from 0 to nsec-1).
  56. @return Pointer to char string
  57. This function locates the n-th section in a dictionary and returns
  58. its name as a pointer to a string statically allocated inside the
  59. dictionary. Do not free or modify the returned string!
  60. This function returns NULL in case of error.
  61. */
  62. /*--------------------------------------------------------------------------*/
  63. char* iniparser_getsecname(dictionary* d, int n);
  64. /*-------------------------------------------------------------------------*/
  65. /**
  66. @brief Save a dictionary to a loadable ini file
  67. @param d Dictionary to dump
  68. @param f Opened file pointer to dump to
  69. @return void
  70. This function dumps a given dictionary into a loadable ini file.
  71. It is Ok to specify @c stderr or @c stdout as output files.
  72. */
  73. /*--------------------------------------------------------------------------*/
  74. void iniparser_dump_ini(dictionary* d, FILE* f);
  75. /*-------------------------------------------------------------------------*/
  76. /**
  77. @brief Dump a dictionary to an opened file pointer.
  78. @param d Dictionary to dump.
  79. @param f Opened file pointer to dump to.
  80. @return void
  81. This function prints out the contents of a dictionary, one element by
  82. line, onto the provided file pointer. It is OK to specify @c stderr
  83. or @c stdout as output files. This function is meant for debugging
  84. purposes mostly.
  85. */
  86. /*--------------------------------------------------------------------------*/
  87. void iniparser_dump(dictionary* d, FILE* f);
  88. /*-------------------------------------------------------------------------*/
  89. /**
  90. @brief Get the string associated to a key
  91. @param d Dictionary to search
  92. @param key Key string to look for
  93. @param def Default value to return if key not found.
  94. @return pointer to statically allocated character string
  95. This function queries a dictionary for a key. A key as read from an
  96. ini file is given as "section:key". If the key cannot be found,
  97. the pointer passed as 'def' is returned.
  98. The returned char pointer is pointing to a string allocated in
  99. the dictionary, do not free or modify it.
  100. */
  101. /*--------------------------------------------------------------------------*/
  102. char* iniparser_getstring(dictionary* d, const char* key, char* def);
  103. /*-------------------------------------------------------------------------*/
  104. /**
  105. @brief Get the string associated to a key, convert to an int
  106. @param d Dictionary to search
  107. @param key Key string to look for
  108. @param notfound Value to return in case of error
  109. @return integer
  110. This function queries a dictionary for a key. A key as read from an
  111. ini file is given as "section:key". If the key cannot be found,
  112. the notfound value is returned.
  113. Supported values for integers include the usual C notation
  114. so decimal, octal (starting with 0) and hexadecimal (starting with 0x)
  115. are supported. Examples:
  116. - "42" -> 42
  117. - "042" -> 34 (octal -> decimal)
  118. - "0x42" -> 66 (hexa -> decimal)
  119. Warning: the conversion may overflow in various ways. Conversion is
  120. totally outsourced to strtol(), see the associated man page for overflow
  121. handling.
  122. Credits: Thanks to A. Becker for suggesting strtol()
  123. */
  124. /*--------------------------------------------------------------------------*/
  125. int iniparser_getint(dictionary* d, const char* key, int notfound);
  126. /*-------------------------------------------------------------------------*/
  127. /**
  128. @brief Get the string associated to a key, convert to a double
  129. @param d Dictionary to search
  130. @param key Key string to look for
  131. @param notfound Value to return in case of error
  132. @return double
  133. This function queries a dictionary for a key. A key as read from an
  134. ini file is given as "section:key". If the key cannot be found,
  135. the notfound value is returned.
  136. */
  137. /*--------------------------------------------------------------------------*/
  138. double iniparser_getdouble(dictionary* d, char* key, double notfound);
  139. /*-------------------------------------------------------------------------*/
  140. /**
  141. @brief Get the string associated to a key, convert to a boolean
  142. @param d Dictionary to search
  143. @param key Key string to look for
  144. @param notfound Value to return in case of error
  145. @return integer
  146. This function queries a dictionary for a key. A key as read from an
  147. ini file is given as "section:key". If the key cannot be found,
  148. the notfound value is returned.
  149. A true boolean is found if one of the following is matched:
  150. - A string starting with 'y'
  151. - A string starting with 'Y'
  152. - A string starting with 't'
  153. - A string starting with 'T'
  154. - A string starting with '1'
  155. A false boolean is found if one of the following is matched:
  156. - A string starting with 'n'
  157. - A string starting with 'N'
  158. - A string starting with 'f'
  159. - A string starting with 'F'
  160. - A string starting with '0'
  161. The notfound value returned if no boolean is identified, does not
  162. necessarily have to be 0 or 1.
  163. */
  164. /*--------------------------------------------------------------------------*/
  165. int iniparser_getboolean(dictionary* d, const char* key, int notfound);
  166. /*-------------------------------------------------------------------------*/
  167. /**
  168. @brief Set an entry in a dictionary.
  169. @param ini Dictionary to modify.
  170. @param entry Entry to modify (entry name)
  171. @param val New value to associate to the entry.
  172. @return int 0 if Ok, -1 otherwise.
  173. If the given entry can be found in the dictionary, it is modified to
  174. contain the provided value. If it cannot be found, -1 is returned.
  175. It is Ok to set val to NULL.
  176. */
  177. /*--------------------------------------------------------------------------*/
  178. int iniparser_setstring(dictionary* ini, char* entry, char* val);
  179. /*-------------------------------------------------------------------------*/
  180. /**
  181. @brief Delete an entry in a dictionary
  182. @param ini Dictionary to modify
  183. @param entry Entry to delete (entry name)
  184. @return void
  185. If the given entry can be found, it is deleted from the dictionary.
  186. */
  187. /*--------------------------------------------------------------------------*/
  188. void iniparser_unset(dictionary* ini, char* entry);
  189. /*-------------------------------------------------------------------------*/
  190. /**
  191. @brief Finds out if a given entry exists in a dictionary
  192. @param ini Dictionary to search
  193. @param entry Name of the entry to look for
  194. @return integer 1 if entry exists, 0 otherwise
  195. Finds out if a given entry exists in the dictionary. Since sections
  196. are stored as keys with NULL associated values, this is the only way
  197. of querying for the presence of sections in a dictionary.
  198. */
  199. /*--------------------------------------------------------------------------*/
  200. int iniparser_find_entry(dictionary* ini, char* entry);
  201. /*-------------------------------------------------------------------------*/
  202. /**
  203. @brief Parse an ini file and return an allocated dictionary object
  204. @param ininame Name of the ini file to read.
  205. @return Pointer to newly allocated dictionary
  206. This is the parser for ini files. This function is called, providing
  207. the name of the file to be read. It returns a dictionary object that
  208. should not be accessed directly, but through accessor functions
  209. instead.
  210. The returned dictionary must be freed using iniparser_freedict().
  211. */
  212. /*--------------------------------------------------------------------------*/
  213. dictionary* iniparser_load(const char* ininame);
  214. /*-------------------------------------------------------------------------*/
  215. /**
  216. @brief Free all memory associated to an ini dictionary
  217. @param d Dictionary to free
  218. @return void
  219. Free all memory associated to an ini dictionary.
  220. It is mandatory to call this function before the dictionary object
  221. gets out of the current context.
  222. */
  223. /*--------------------------------------------------------------------------*/
  224. void iniparser_freedict(dictionary* d);
  225. #endif