28 #include "sixtp-parsers.h" 29 #include "sixtp-utils.h" 32 static xmlNsPtr global_namespace = NULL;
36 static gboolean dom_start_handler (
37 GSList* sibling_data, gpointer parent_data, gpointer global_data,
38 gpointer* data_for_children, gpointer* result,
const gchar* tag,
42 gchar** atptr = attrs;
44 if (parent_data == NULL)
46 thing = xmlNewNode (global_namespace, BAD_CAST tag);
52 thing = xmlNewChild ((xmlNodePtr) parent_data,
58 *data_for_children = thing;
64 gchar* attr0 = g_strdup (atptr[0]);
65 gchar* attr1 = g_strdup (atptr[1]);
66 xmlSetProp (thing, checked_char_cast (attr0),
67 checked_char_cast (attr1));
77 dom_fail_handler (gpointer data_for_children,
78 GSList* data_from_children,
85 if (*result) xmlFreeNode (static_cast<xmlNodePtr> (*result));
88 static gboolean dom_chars_handler (
89 GSList* sibling_data, gpointer parent_data, gpointer global_data,
90 gpointer* result,
const char* text,
int length)
94 gchar* newtext = g_strndup (text,length);
95 xmlNodeAddContentLen ((xmlNodePtr)parent_data,
96 checked_char_cast (newtext), length);
103 sixtp_dom_parser_new (sixtp_end_handler ender,
104 sixtp_result_handler cleanup_result_by_default_func,
105 sixtp_result_handler cleanup_result_on_fail_func)
109 g_return_val_if_fail (ender, NULL);
112 sixtp_set_any (sixtp_new (), FALSE,
113 SIXTP_START_HANDLER_ID, dom_start_handler,
114 SIXTP_CHARACTERS_HANDLER_ID, dom_chars_handler,
115 SIXTP_END_HANDLER_ID, ender,
116 SIXTP_FAIL_HANDLER_ID, dom_fail_handler,
117 SIXTP_NO_MORE_HANDLERS)))
122 if (cleanup_result_by_default_func)
124 sixtp_set_cleanup_result (top_level, cleanup_result_by_default_func);
127 if (cleanup_result_by_default_func)
129 sixtp_set_result_fail (top_level, cleanup_result_on_fail_func);
132 if (!sixtp_add_sub_parser (top_level, SIXTP_MAGIC_CATCHER, top_level))
134 sixtp_destroy (top_level);