From fbb1a7a4405c1f0fb5fd92d344bb42d40b13a8c9 Mon Sep 17 00:00:00 2001 From: Dave Peticolas Date: Thu, 8 Feb 2001 04:09:15 +0000 Subject: [PATCH] Missed one. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@3619 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/engine/sixtp-to-dom-parser.c | 78 ++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/engine/sixtp-to-dom-parser.c diff --git a/src/engine/sixtp-to-dom-parser.c b/src/engine/sixtp-to-dom-parser.c new file mode 100644 index 0000000000..38204f99f1 --- /dev/null +++ b/src/engine/sixtp-to-dom-parser.c @@ -0,0 +1,78 @@ +#include + +#include "sixtp-parsers.h" +#include "sixtp-utils.h" +#include "sixtp.h" + +static xmlNsPtr global_namespace; + +static gboolean dom_start_handler( + GSList* sibling_data, gpointer parent_data, gpointer global_data, + gpointer *data_for_children, gpointer *result, const gchar *tag, + gchar **attrs) +{ + xmlNodePtr thing; + gchar** atptr = attrs; + + if(parent_data == NULL) + { + thing = xmlNewNode(global_namespace, tag); + } + else + { + thing = xmlNewChild(parent_data, global_namespace, tag, NULL); + } + + while(*atptr != 0) + { + xmlSetProp(thing, atptr[0], atptr[1]); + atptr += 2; + } + + *result = thing; + + return TRUE; +} + +static gboolean dom_chars_handler( + GSList *sibling_data, gpointer parent_data, gpointer global_data, + gpointer *result, const char *text, int length) +{ + xmlNodeSetContent((xmlNodePtr)result, text); + return TRUE; +} + +static gboolean dom_before_handler( + gpointer data_for_children, GSList* data_from_children, + GSList* sibling_data, gpointer parent_data, gpointer global_data, + gpointer *result, const gchar *tag, const gchar *child_tag) +{ + return TRUE; +} + +sixtp* sixtp_dom_parser_new(sixtp_end_handler ender) +{ + sixtp *top_level; + + g_return_val_if_fail(ender, NULL); + + if(!(top_level = + sixtp_set_any(sixtp_new(), FALSE, + SIXTP_START_HANDLER_ID, dom_start_handler, + SIXTP_BEFORE_CHILD_HANDLER_ID, dom_before_handler, + SIXTP_CHARACTERS_HANDLER_ID, dom_chars_handler, + SIXTP_END_HANDLER_ID, ender, + SIXTP_NO_MORE_HANDLERS))) + { + return NULL; + } + + if(!sixtp_add_sub_parser(top_level, SIXTP_MAGIC_CATCHER, top_level)) + { + sixtp_destroy(top_level); + return NULL; + } + + return top_level; +} +