/src/xml/gskxml.h

https://github.com/davebenson/gsk · C Header · 213 lines · 167 code · 30 blank · 16 comment · 0 complexity · 30364ac1a82ef61b0891dd6aea094a20 MD5 · raw file

  1. /* GskXml: A reference-counted, immutable XML node. */
  2. #ifndef __GSK_XML_H_
  3. #define __GSK_XML_H_
  4. typedef struct _GskXml GskXml;
  5. typedef struct _GskXmlElement GskXmlElement;
  6. #include <glib-object.h>
  7. #include "../gskbuffer.h"
  8. GType gsk_xml_get_type (void) G_GNUC_CONST;
  9. #define GSK_TYPE_XML (gsk_xml_get_type())
  10. typedef enum
  11. {
  12. GSK_XML_ELEMENT,
  13. GSK_XML_TEXT
  14. } GskXmlType;
  15. struct _GskXml
  16. {
  17. GskXmlType type;
  18. guint ref_count;
  19. };
  20. /* NOTE: this macro assumes that xml->type is GSK_XML_TEXT */
  21. #define GSK_XML_PEEK_TEXT(xml) ((char*)((GskXml*)(xml) + 1))
  22. struct _GskXmlElement
  23. {
  24. /*< private >*/
  25. GskXml base;
  26. /*< public (readonly) >*/
  27. char *name;
  28. guint n_attrs;
  29. char **attrs; /* not NULL terminated */
  30. guint n_children;
  31. GskXml **children;
  32. };
  33. /* NOTE: these macros assume that xml->type is GSK_XML_ELEMENT */
  34. /* NOTE: attrs is NULL terminated */
  35. #define GSK_XML_PEEK_NAME(xml) (((GskXmlElement*)(xml))->name)
  36. #define GSK_XML_PEEK_N_ATTRS(xml) (((GskXmlElement*)(xml))->n_attrs)
  37. #define GSK_XML_PEEK_ATTRS(xml) ((char**)((GskXmlElement*)(xml) + 1))
  38. #define GSK_XML_PEEK_CHILDREN(xml) (((GskXmlElement*)(xml))->children)
  39. #define GSK_XML_PEEK_N_CHILDREN(xml) (((GskXmlElement*)(xml))->n_children)
  40. #define GSK_XML_PEEK_CHILD(xml,i) ((((GskXmlElement*)(xml))->children)[i])
  41. GskXml *gsk_xml_text_new (const char *text);
  42. GskXml *gsk_xml_text_new_len (const char *text,
  43. guint len);
  44. GskXml *gsk_xml_element_new (const char *name,
  45. guint n_kv_pairs,
  46. char **attr_kv_pairs,
  47. guint n_children,
  48. GskXml **children);
  49. GskXml *gsk_xml_ref (GskXml *xml);
  50. void gsk_xml_unref (GskXml *xml);
  51. gboolean gsk_xml_is_element (const GskXml *xml,
  52. const char *name);
  53. gboolean gsk_xml_is_whitespace (const GskXml *xml);
  54. #define gsk_xml_element_new_empty(name) gsk_xml_element_new(name,0,NULL,0,NULL)
  55. #define gsk_xml_text_child_new(name, text) \
  56. gsk_xml_element_new_take_1(name, gsk_xml_text_new (text))
  57. GskXml *gsk_xml_text_new_printf (const char *format,
  58. ...) G_GNUC_PRINTF(1,2);
  59. GskXml *gsk_xml_text_new_vprintf (const char *format,
  60. va_list args);
  61. GskXml *gsk_xml_text_child_printf (const char *name,
  62. const char *format,
  63. ...) G_GNUC_PRINTF(2,3);
  64. const char *gsk_xml_find_attr (GskXml *xml,
  65. const char *attr_name);
  66. GskXml *gsk_xml_parse_file (const char *filename,
  67. GError **error);
  68. GskXml *gsk_xml_parse_str (const char *str,
  69. GError **error);
  70. GskXml *gsk_xml_parse_str_len (const char *str,
  71. gssize len,
  72. GError **error);
  73. GskXml *gsk_xml_find_child (GskXml *xml,
  74. const char *child_node_name,
  75. guint instance);
  76. gboolean gsk_xml_peek_child_text (GskXml *xml,
  77. const char *name,
  78. gboolean required,
  79. const char **p_out,
  80. GError **error);
  81. gboolean gsk_xml_peek_path_text (GskXml *xml,
  82. const char *path,
  83. gboolean required,
  84. const char **p_out,
  85. GError **error);
  86. GskXml *gsk_xml_lookup_path (GskXml *xml,
  87. const char *path);
  88. typedef gboolean (*GskXmlForeachFunc) (GskXml *xml,
  89. gpointer foreach_data);
  90. /* returns FALSE if any invocations of func return FALSE;
  91. we stop iterating at that point. */
  92. typedef enum
  93. {
  94. GSK_XML_FOREACH_REVERSED = (1<<0)
  95. } GskXmlForeachFlags;
  96. gboolean gsk_xml_foreach_by_path (GskXml *xml,
  97. const char *path,
  98. GskXmlForeachFunc func,
  99. gpointer foreach_data,
  100. GskXmlForeachFlags flags);
  101. GskXml *gsk_xml_index (GskXml *xml,
  102. guint n_indices,
  103. const guint *indices);
  104. gboolean gsk_xml_dump (const GskXml *xml,
  105. int fd,
  106. GError **error);
  107. gboolean gsk_xml_dump_file (const GskXml *xml,
  108. const char *filename,
  109. GError **error);
  110. void gsk_xml_dump_buffer (const GskXml *xml,
  111. GskBuffer *buffer);
  112. void gsk_xml_dump_buffer_formatted (const GskXml *xml,
  113. GskBuffer *buffer);
  114. char *gsk_xml_to_string (const GskXml *xml);
  115. char *gsk_xml_get_all_text (const GskXml *xml);
  116. void gsk_xml_append_text_to_string (const GskXml *xml,
  117. GString *str);
  118. const char *gsk_xml_find_solo_text (const GskXml *xml,
  119. GError **error);
  120. GskXml *gsk_xml_find_solo_child (GskXml *xml,
  121. GError **error);
  122. /* helpers */
  123. GskXml *gsk_xml_text_new_int (int value);
  124. GskXml *gsk_xml_element_new_take_1(const char *name,
  125. GskXml *a);
  126. GskXml *gsk_xml_element_new_take_2(const char *name,
  127. GskXml *a,
  128. GskXml *b);
  129. GskXml *gsk_xml_element_new_take_3(const char *name,
  130. GskXml *a,
  131. GskXml *b,
  132. GskXml *c);
  133. GskXml *gsk_xml_element_new_1 (const char *name,
  134. GskXml *a);
  135. GskXml *gsk_xml_element_new_2 (const char *name,
  136. GskXml *a,
  137. GskXml *b);
  138. GskXml *gsk_xml_element_new_3 (const char *name,
  139. GskXml *a,
  140. GskXml *b,
  141. GskXml *c);
  142. GskXml *gsk_xml_element_new_take_list (const char *name,
  143. GskXml *first_node_or_null,
  144. ...);
  145. /* NOTE: only the elements of 'children' are taken:
  146. the attributes are copied, as is the array 'children' itself.
  147. consecutive text nodes are coalesced. */
  148. GskXml *gsk_xml_element_new_take (const char *name,
  149. guint n_kv_pairs,
  150. char **attr_kv_pairs,
  151. guint n_children,
  152. GskXml **children);
  153. GskXml *gsk_xml_element_new_contents (GskXml *base_xml,
  154. guint n_children,
  155. GskXml **children);
  156. GskXml *gsk_xml_element_new_append (GskXml *base_xml,
  157. guint n_add_children,
  158. GskXml **add_children);
  159. GskXml *gsk_xml_element_new_prepend(GskXml *base_xml,
  160. guint n_add_children,
  161. GskXml **add_children);
  162. GskXml *gsk_xml_element_replace_name(GskXml *base,
  163. const char *new_name);
  164. /* for creating a hash-table of GskXml */
  165. guint gsk_xml_hash (gconstpointer xml_node);
  166. gboolean gsk_xml_equal (gconstpointer a_node,
  167. gconstpointer b_node);
  168. gsize gsk_xml_estimate_size (const GskXml *xml);
  169. typedef enum
  170. {
  171. /* if set, element attribute ordering is ignored */
  172. GSK_XML_EQUAL_SORT_ATTRIBUTES = (1<<0),
  173. /* if set, whitespace-only text nodes are ignored */
  174. GSK_XML_EQUAL_IGNORE_TRIVIAL_WHITESPACE = (1<<1),
  175. /* if set, whitespace at the beginning and ending of text is ignored */
  176. GSK_XML_EQUAL_IGNORE_END_WHITESPACE = (1<<2),
  177. GSK_XML_EQUAL_IGNORE_WHITESPACE = (GSK_XML_EQUAL_IGNORE_TRIVIAL_WHITESPACE
  178. | GSK_XML_EQUAL_IGNORE_END_WHITESPACE)
  179. } GskXmlEqualFlags;
  180. gboolean gsk_xml_equal_with_flags (const GskXml *a,
  181. const GskXml *b,
  182. GskXmlEqualFlags flags);
  183. #endif