diff options
author | Daniel Silverstone <dsilvers@digital-scurf.org> | 2012-07-15 17:46:33 +0100 |
---|---|---|
committer | Daniel Silverstone <dsilvers@digital-scurf.org> | 2012-07-15 17:46:33 +0100 |
commit | c86f1c6c5a5aab4a5e99bf2617ddf4f15dde20c5 (patch) | |
tree | f39b270fec3720e2dd5f95442b75f5caa978d430 /bindings | |
parent | a45056f4dd306e6ff06d2ec77b129b8e27add45e (diff) | |
download | libdom-c86f1c6c5a5aab4a5e99bf2617ddf4f15dde20c5.tar.gz libdom-c86f1c6c5a5aab4a5e99bf2617ddf4f15dde20c5.tar.bz2 |
XML Binding: Add comment support to Expat handler
Diffstat (limited to 'bindings')
-rw-r--r-- | bindings/xml/expat_xmlparser.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/bindings/xml/expat_xmlparser.c b/bindings/xml/expat_xmlparser.c index 3f9c51c..4c5cbef 100644 --- a/bindings/xml/expat_xmlparser.c +++ b/bindings/xml/expat_xmlparser.c @@ -229,6 +229,55 @@ expat_xmlparser_external_entity_ref_handler(XML_Parser parser, } static void +expat_xmlparser_comment_handler(void *_parser, + const XML_Char *_comment) +{ + dom_xml_parser *parser = _parser; + struct dom_comment *comment, *ins_comment = NULL; + dom_string *data; + dom_exception err; + + /* Create DOM string data for comment */ + err = dom_string_create((const uint8_t *)_comment, + strlen((const char *) _comment), &data); + if (err != DOM_NO_ERR) { + parser->msg(DOM_MSG_CRITICAL, parser->mctx, + "No memory for comment data"); + return; + } + + /* Create comment */ + err = dom_document_create_comment(parser->doc, data, &comment); + if (err != DOM_NO_ERR) { + dom_string_unref(data); + parser->msg(DOM_MSG_CRITICAL, parser->mctx, + "No memory for comment node"); + return; + } + + /* No longer need data */ + dom_string_unref(data); + + /* Append comment to parent */ + err = dom_node_append_child(parser->current, (struct dom_node *) comment, + (struct dom_node **) (void *) &ins_comment); + if (err != DOM_NO_ERR) { + dom_node_unref((struct dom_node *) comment); + parser->msg(DOM_MSG_CRITICAL, parser->mctx, + "Failed attaching comment node"); + return; + } + + /* We're not interested in the inserted comment */ + if (ins_comment != NULL) + dom_node_unref((struct dom_node *) ins_comment); + + /* No longer interested in comment */ + dom_node_unref((struct dom_node *) comment); + +} + +static void expat_xmlparser_unknown_data_handler(void *_parser, const XML_Char *s, int len) @@ -308,6 +357,9 @@ dom_xml_parser_create(const char *enc, const char *int_enc, XML_SetExternalEntityRefHandler(parser->parser, expat_xmlparser_external_entity_ref_handler); + XML_SetCommentHandler(parser->parser, + expat_xmlparser_comment_handler); + XML_SetDefaultHandlerExpand(parser->parser, expat_xmlparser_unknown_data_handler); |