diff options
author | Daniel Silverstone <dsilvers@digital-scurf.org> | 2012-07-15 17:58:25 +0100 |
---|---|---|
committer | Daniel Silverstone <dsilvers@digital-scurf.org> | 2012-07-15 17:58:25 +0100 |
commit | 575c52aad811bbfce12faac963256d4872c51598 (patch) | |
tree | 0a31ed436e40a94612ef0e5d1b7e35b7a0a42b8e /bindings | |
parent | c86f1c6c5a5aab4a5e99bf2617ddf4f15dde20c5 (diff) | |
download | libdom-575c52aad811bbfce12faac963256d4872c51598.tar.gz libdom-575c52aad811bbfce12faac963256d4872c51598.tar.bz2 |
XML Binding: Add doctype support to Expat handler
Diffstat (limited to 'bindings')
-rw-r--r-- | bindings/xml/expat_xmlparser.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/bindings/xml/expat_xmlparser.c b/bindings/xml/expat_xmlparser.c index 4c5cbef..42abdfe 100644 --- a/bindings/xml/expat_xmlparser.c +++ b/bindings/xml/expat_xmlparser.c @@ -278,6 +278,48 @@ expat_xmlparser_comment_handler(void *_parser, } static void +expat_xmlparser_start_doctype_decl_handler(void *_parser, + const XML_Char *doctype_name, + const XML_Char *system_id, + const XML_Char *public_id, + int has_internal_subset) +{ + dom_xml_parser *parser = _parser; + struct dom_document_type *doctype, *ins_doctype = NULL; + dom_exception err; + + UNUSED(has_internal_subset); + + err = dom_implementation_create_document_type( + doctype_name, system_id ? system_id : "", + public_id ? public_id : "", + &doctype); + + if (err != DOM_NO_ERR) { + parser->msg(DOM_MSG_CRITICAL, parser->mctx, + "Failed to create document type"); + return; + } + + /* Add doctype to document */ + err = dom_node_append_child(parser->doc, (struct dom_node *) doctype, + (struct dom_node **) (void *) &ins_doctype); + if (err != DOM_NO_ERR) { + dom_node_unref((struct dom_node *) doctype); + parser->msg(DOM_MSG_CRITICAL, parser->mctx, + "Failed attaching doctype"); + return; + } + + /* Not interested in inserted node */ + if (ins_doctype != NULL) + dom_node_unref((struct dom_node *) ins_doctype); + + /* No longer interested in doctype */ + dom_node_unref((struct dom_node *) doctype); +} + +static void expat_xmlparser_unknown_data_handler(void *_parser, const XML_Char *s, int len) @@ -360,6 +402,9 @@ dom_xml_parser_create(const char *enc, const char *int_enc, XML_SetCommentHandler(parser->parser, expat_xmlparser_comment_handler); + XML_SetStartDoctypeDeclHandler(parser->parser, + expat_xmlparser_start_doctype_decl_handler); + XML_SetDefaultHandlerExpand(parser->parser, expat_xmlparser_unknown_data_handler); |