mxml.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. /*
  2. * "$Id: mxml.h 451 2014-01-04 21:50:06Z msweet $"
  3. *
  4. * Header file for Mini-XML, a small XML-like file parsing library.
  5. *
  6. * Copyright 2003-2014 by Michael R Sweet.
  7. *
  8. * These coded instructions, statements, and computer programs are the
  9. * property of Michael R Sweet and are protected by Federal copyright
  10. * law. Distribution and use rights are outlined in the file "COPYING"
  11. * which should have been included with this file. If this file is
  12. * missing or damaged, see the license at:
  13. *
  14. * http://www.msweet.org/projects.php/Mini-XML
  15. */
  16. /*
  17. * Prevent multiple inclusion...
  18. */
  19. #ifndef _mxml_h_
  20. # define _mxml_h_
  21. /*
  22. * Include necessary headers...
  23. */
  24. # include <stdio.h>
  25. # include <stdlib.h>
  26. # include <string.h>
  27. # include <ctype.h>
  28. # include <errno.h>
  29. /*
  30. * Constants...
  31. */
  32. # define MXML_MAJOR_VERSION 2 /* Major version number */
  33. # define MXML_MINOR_VERSION 8 /* Minor version number */
  34. # define MXML_TAB 8 /* Tabs every N columns */
  35. # define MXML_NO_CALLBACK 0 /* Don't use a type callback */
  36. # define MXML_INTEGER_CALLBACK mxml_integer_cb
  37. /* Treat all data as integers */
  38. # define MXML_OPAQUE_CALLBACK mxml_opaque_cb
  39. /* Treat all data as opaque */
  40. # define MXML_REAL_CALLBACK mxml_real_cb
  41. /* Treat all data as real numbers */
  42. # define MXML_TEXT_CALLBACK 0 /* Treat all data as text */
  43. # define MXML_IGNORE_CALLBACK mxml_ignore_cb
  44. /* Ignore all non-element content */
  45. # define MXML_NO_PARENT 0 /* No parent for the node */
  46. # define MXML_DESCEND 1 /* Descend when finding/walking */
  47. # define MXML_NO_DESCEND 0 /* Don't descend when finding/walking */
  48. # define MXML_DESCEND_FIRST -1 /* Descend for first find */
  49. # define MXML_WS_BEFORE_OPEN 0 /* Callback for before open tag */
  50. # define MXML_WS_AFTER_OPEN 1 /* Callback for after open tag */
  51. # define MXML_WS_BEFORE_CLOSE 2 /* Callback for before close tag */
  52. # define MXML_WS_AFTER_CLOSE 3 /* Callback for after close tag */
  53. # define MXML_ADD_BEFORE 0 /* Add node before specified node */
  54. # define MXML_ADD_AFTER 1 /* Add node after specified node */
  55. # define MXML_ADD_TO_PARENT NULL /* Add node relative to parent */
  56. /*
  57. * Data types...
  58. */
  59. typedef enum mxml_sax_event_e /**** SAX event type. ****/
  60. {
  61. MXML_SAX_CDATA, /* CDATA node */
  62. MXML_SAX_COMMENT, /* Comment node */
  63. MXML_SAX_DATA, /* Data node */
  64. MXML_SAX_DIRECTIVE, /* Processing directive node */
  65. MXML_SAX_ELEMENT_CLOSE, /* Element closed */
  66. MXML_SAX_ELEMENT_OPEN /* Element opened */
  67. } mxml_sax_event_t;
  68. typedef enum mxml_type_e /**** The XML node type. ****/
  69. {
  70. MXML_IGNORE = -1, /* Ignore/throw away node @since Mini-XML 2.3@ */
  71. MXML_ELEMENT, /* XML element with attributes */
  72. MXML_INTEGER, /* Integer value */
  73. MXML_OPAQUE, /* Opaque string */
  74. MXML_REAL, /* Real value */
  75. MXML_TEXT, /* Text fragment */
  76. MXML_CUSTOM /* Custom data @since Mini-XML 2.1@ */
  77. } mxml_type_t;
  78. typedef void (*mxml_custom_destroy_cb_t)(void *);
  79. /**** Custom data destructor ****/
  80. typedef void (*mxml_error_cb_t)(const char *);
  81. /**** Error callback function ****/
  82. typedef struct mxml_attr_s /**** An XML element attribute value. @private@ ****/
  83. {
  84. char *name; /* Attribute name */
  85. char *value; /* Attribute value */
  86. } mxml_attr_t;
  87. typedef struct mxml_element_s /**** An XML element value. @private@ ****/
  88. {
  89. char *name; /* Name of element */
  90. int num_attrs; /* Number of attributes */
  91. mxml_attr_t *attrs; /* Attributes */
  92. } mxml_element_t;
  93. typedef struct mxml_text_s /**** An XML text value. @private@ ****/
  94. {
  95. int whitespace; /* Leading whitespace? */
  96. char *string; /* Fragment string */
  97. } mxml_text_t;
  98. typedef struct mxml_custom_s /**** An XML custom value. @private@ ****/
  99. {
  100. void *data; /* Pointer to (allocated) custom data */
  101. mxml_custom_destroy_cb_t destroy; /* Pointer to destructor function */
  102. } mxml_custom_t;
  103. typedef union mxml_value_u /**** An XML node value. @private@ ****/
  104. {
  105. mxml_element_t element; /* Element */
  106. int integer; /* Integer number */
  107. char *opaque; /* Opaque string */
  108. double real; /* Real number */
  109. mxml_text_t text; /* Text fragment */
  110. mxml_custom_t custom; /* Custom data @since Mini-XML 2.1@ */
  111. } mxml_value_t;
  112. struct mxml_node_s /**** An XML node. @private@ ****/
  113. {
  114. mxml_type_t type; /* Node type */
  115. struct mxml_node_s *next; /* Next node under same parent */
  116. struct mxml_node_s *prev; /* Previous node under same parent */
  117. struct mxml_node_s *parent; /* Parent node */
  118. struct mxml_node_s *child; /* First child node */
  119. struct mxml_node_s *last_child; /* Last child node */
  120. mxml_value_t value; /* Node value */
  121. int ref_count; /* Use count */
  122. void *user_data; /* User data */
  123. };
  124. typedef struct mxml_node_s mxml_node_t; /**** An XML node. ****/
  125. struct mxml_index_s /**** An XML node index. @private@ ****/
  126. {
  127. char *attr; /* Attribute used for indexing or NULL */
  128. int num_nodes; /* Number of nodes in index */
  129. int alloc_nodes; /* Allocated nodes in index */
  130. int cur_node; /* Current node */
  131. mxml_node_t **nodes; /* Node array */
  132. };
  133. typedef struct mxml_index_s mxml_index_t;
  134. /**** An XML node index. ****/
  135. typedef int (*mxml_custom_load_cb_t)(mxml_node_t *, const char *);
  136. /**** Custom data load callback function ****/
  137. typedef char *(*mxml_custom_save_cb_t)(mxml_node_t *);
  138. /**** Custom data save callback function ****/
  139. typedef int (*mxml_entity_cb_t)(const char *);
  140. /**** Entity callback function */
  141. typedef mxml_type_t (*mxml_load_cb_t)(mxml_node_t *);
  142. /**** Load callback function ****/
  143. typedef const char *(*mxml_save_cb_t)(mxml_node_t *, int);
  144. /**** Save callback function ****/
  145. typedef void (*mxml_sax_cb_t)(mxml_node_t *, mxml_sax_event_t, void *);
  146. /**** SAX callback function ****/
  147. /*
  148. * C++ support...
  149. */
  150. # ifdef __cplusplus
  151. extern "C" {
  152. # endif /* __cplusplus */
  153. /*
  154. * Prototypes...
  155. */
  156. extern void mxmlAdd(mxml_node_t *parent, int where,
  157. mxml_node_t *child, mxml_node_t *node);
  158. extern void mxmlDelete(mxml_node_t *node);
  159. extern void mxmlElementDeleteAttr(mxml_node_t *node,
  160. const char *name);
  161. extern const char *mxmlElementGetAttr(mxml_node_t *node, const char *name);
  162. extern void mxmlElementSetAttr(mxml_node_t *node, const char *name,
  163. const char *value);
  164. extern void mxmlElementSetAttrf(mxml_node_t *node, const char *name,
  165. const char *format, ...)
  166. # ifdef __GNUC__
  167. __attribute__ ((__format__ (__printf__, 3, 4)))
  168. # endif /* __GNUC__ */
  169. ;
  170. extern int mxmlEntityAddCallback(mxml_entity_cb_t cb);
  171. extern const char *mxmlEntityGetName(int val);
  172. extern int mxmlEntityGetValue(const char *name);
  173. extern void mxmlEntityRemoveCallback(mxml_entity_cb_t cb);
  174. extern mxml_node_t *mxmlFindElement(mxml_node_t *node, mxml_node_t *top,
  175. const char *name, const char *attr,
  176. const char *value, int descend);
  177. extern mxml_node_t *mxmlFindPath(mxml_node_t *node, const char *path);
  178. extern const char *mxmlGetCDATA(mxml_node_t *node);
  179. extern const void *mxmlGetCustom(mxml_node_t *node);
  180. extern const char *mxmlGetElement(mxml_node_t *node);
  181. extern mxml_node_t *mxmlGetFirstChild(mxml_node_t *node);
  182. extern int mxmlGetInteger(mxml_node_t *node);
  183. extern mxml_node_t *mxmlGetLastChild(mxml_node_t *node);
  184. extern mxml_node_t *mxmlGetNextSibling(mxml_node_t *node);
  185. extern const char *mxmlGetOpaque(mxml_node_t *node);
  186. extern mxml_node_t *mxmlGetParent(mxml_node_t *node);
  187. extern mxml_node_t *mxmlGetPrevSibling(mxml_node_t *node);
  188. extern double mxmlGetReal(mxml_node_t *node);
  189. extern int mxmlGetRefCount(mxml_node_t *node);
  190. extern const char *mxmlGetText(mxml_node_t *node, int *whitespace);
  191. extern mxml_type_t mxmlGetType(mxml_node_t *node);
  192. extern void *mxmlGetUserData(mxml_node_t *node);
  193. extern void mxmlIndexDelete(mxml_index_t *ind);
  194. extern mxml_node_t *mxmlIndexEnum(mxml_index_t *ind);
  195. extern mxml_node_t *mxmlIndexFind(mxml_index_t *ind,
  196. const char *element,
  197. const char *value);
  198. extern int mxmlIndexGetCount(mxml_index_t *ind);
  199. extern mxml_index_t *mxmlIndexNew(mxml_node_t *node, const char *element,
  200. const char *attr);
  201. extern mxml_node_t *mxmlIndexReset(mxml_index_t *ind);
  202. extern mxml_node_t *mxmlLoadFd(mxml_node_t *top, int fd,
  203. mxml_type_t (*cb)(mxml_node_t *));
  204. extern mxml_node_t *mxmlLoadFile(mxml_node_t *top, FILE *fp,
  205. mxml_type_t (*cb)(mxml_node_t *));
  206. extern mxml_node_t *mxmlLoadString(mxml_node_t *top, const char *s,
  207. mxml_type_t (*cb)(mxml_node_t *));
  208. extern mxml_node_t *mxmlNewCDATA(mxml_node_t *parent, const char *string);
  209. extern mxml_node_t *mxmlNewCustom(mxml_node_t *parent, void *data,
  210. mxml_custom_destroy_cb_t destroy);
  211. extern mxml_node_t *mxmlNewElement(mxml_node_t *parent, const char *name);
  212. extern mxml_node_t *mxmlNewInteger(mxml_node_t *parent, int integer);
  213. extern mxml_node_t *mxmlNewOpaque(mxml_node_t *parent, const char *opaque);
  214. extern mxml_node_t *mxmlNewReal(mxml_node_t *parent, double real);
  215. extern mxml_node_t *mxmlNewText(mxml_node_t *parent, int whitespace,
  216. const char *string);
  217. extern mxml_node_t *mxmlNewTextf(mxml_node_t *parent, int whitespace,
  218. const char *format, ...)
  219. # ifdef __GNUC__
  220. __attribute__ ((__format__ (__printf__, 3, 4)))
  221. # endif /* __GNUC__ */
  222. ;
  223. extern mxml_node_t *mxmlNewXML(const char *version);
  224. extern int mxmlRelease(mxml_node_t *node);
  225. extern void mxmlRemove(mxml_node_t *node);
  226. extern int mxmlRetain(mxml_node_t *node);
  227. extern char *mxmlSaveAllocString(mxml_node_t *node,
  228. mxml_save_cb_t cb);
  229. extern int mxmlSaveFd(mxml_node_t *node, int fd,
  230. mxml_save_cb_t cb);
  231. extern int mxmlSaveFile(mxml_node_t *node, FILE *fp,
  232. mxml_save_cb_t cb);
  233. extern int mxmlSaveString(mxml_node_t *node, char *buffer,
  234. int bufsize, mxml_save_cb_t cb);
  235. extern mxml_node_t *mxmlSAXLoadFd(mxml_node_t *top, int fd,
  236. mxml_type_t (*cb)(mxml_node_t *),
  237. mxml_sax_cb_t sax, void *sax_data);
  238. extern mxml_node_t *mxmlSAXLoadFile(mxml_node_t *top, FILE *fp,
  239. mxml_type_t (*cb)(mxml_node_t *),
  240. mxml_sax_cb_t sax, void *sax_data);
  241. extern mxml_node_t *mxmlSAXLoadString(mxml_node_t *top, const char *s,
  242. mxml_type_t (*cb)(mxml_node_t *),
  243. mxml_sax_cb_t sax, void *sax_data);
  244. extern int mxmlSetCDATA(mxml_node_t *node, const char *data);
  245. extern int mxmlSetCustom(mxml_node_t *node, void *data,
  246. mxml_custom_destroy_cb_t destroy);
  247. extern void mxmlSetCustomHandlers(mxml_custom_load_cb_t load,
  248. mxml_custom_save_cb_t save);
  249. extern int mxmlSetElement(mxml_node_t *node, const char *name);
  250. extern void mxmlSetErrorCallback(mxml_error_cb_t cb);
  251. extern int mxmlSetInteger(mxml_node_t *node, int integer);
  252. extern int mxmlSetOpaque(mxml_node_t *node, const char *opaque);
  253. extern int mxmlSetReal(mxml_node_t *node, double real);
  254. extern int mxmlSetText(mxml_node_t *node, int whitespace,
  255. const char *string);
  256. extern int mxmlSetTextf(mxml_node_t *node, int whitespace,
  257. const char *format, ...)
  258. # ifdef __GNUC__
  259. __attribute__ ((__format__ (__printf__, 3, 4)))
  260. # endif /* __GNUC__ */
  261. ;
  262. extern int mxmlSetUserData(mxml_node_t *node, void *data);
  263. extern void mxmlSetWrapMargin(int column);
  264. extern mxml_node_t *mxmlWalkNext(mxml_node_t *node, mxml_node_t *top,
  265. int descend);
  266. extern mxml_node_t *mxmlWalkPrev(mxml_node_t *node, mxml_node_t *top,
  267. int descend);
  268. /*
  269. * Semi-private functions...
  270. */
  271. extern void mxml_error(const char *format, ...);
  272. extern mxml_type_t mxml_ignore_cb(mxml_node_t *node);
  273. extern mxml_type_t mxml_integer_cb(mxml_node_t *node);
  274. extern mxml_type_t mxml_opaque_cb(mxml_node_t *node);
  275. extern mxml_type_t mxml_real_cb(mxml_node_t *node);
  276. /*
  277. * C++ support...
  278. */
  279. # ifdef __cplusplus
  280. }
  281. # endif /* __cplusplus */
  282. #endif /* !_mxml_h_ */
  283. /*
  284. * End of "$Id: mxml.h 451 2014-01-04 21:50:06Z msweet $".
  285. */