diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2017-12-07 15:15:26 +0100 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2017-12-13 15:01:05 +0100 |
commit | eacd070190d0c7a7fbc905a2a292f38e282b5a82 (patch) | |
tree | 57971ec5acec6b5867cc313c3d2f6f6f619e35fe /source/xps/xps-doc.c | |
parent | fa9cd085533f68367c299e058ab3fbb7ad8a2dc6 (diff) | |
download | mupdf-eacd070190d0c7a7fbc905a2a292f38e282b5a82.tar.xz |
Parse XML using pool allocator.
This needs adding a fz_xml_doc type to hold the pool.
Diffstat (limited to 'source/xps/xps-doc.c')
-rw-r--r-- | source/xps/xps-doc.c | 92 |
1 files changed, 40 insertions, 52 deletions
diff --git a/source/xps/xps-doc.c b/source/xps/xps-doc.c index 9be8dec1..a58aab72 100644 --- a/source/xps/xps-doc.c +++ b/source/xps/xps-doc.c @@ -237,7 +237,7 @@ xps_parse_metadata_imp(fz_context *ctx, xps_document *doc, fz_xml *item, xps_fix static void xps_parse_metadata(fz_context *ctx, xps_document *doc, xps_part *part, xps_fixdoc *fixdoc) { - fz_xml *root; + fz_xml_doc *xml; char buf[1024]; char *s; @@ -258,9 +258,9 @@ xps_parse_metadata(fz_context *ctx, xps_document *doc, xps_part *part, xps_fixdo doc->base_uri = buf; doc->part_uri = part->name; - root = fz_parse_xml(ctx, part->data, 0); - xps_parse_metadata_imp(ctx, doc, root, fixdoc); - fz_drop_xml(ctx, root); + xml = fz_parse_xml(ctx, part->data, 0); + xps_parse_metadata_imp(ctx, doc, fz_xml_root(xml), fixdoc); + fz_drop_xml(ctx, xml); doc->base_uri = NULL; doc->part_uri = NULL; @@ -325,68 +325,56 @@ xps_count_pages(fz_context *ctx, fz_document *doc_) return doc->page_count; } -static fz_xml * +static fz_xml_doc * xps_load_fixed_page(fz_context *ctx, xps_document *doc, xps_fixpage *page) { xps_part *part; - fz_xml *root = NULL; + fz_xml_doc *xml = NULL; + fz_xml *root; char *width_att; char *height_att; part = xps_read_part(ctx, doc, page->name); fz_try(ctx) { - root = fz_parse_xml(ctx, part->data, 0); - } - fz_always(ctx) - { - xps_drop_part(ctx, doc, part); - } - fz_catch(ctx) - { - fz_rethrow_if(ctx, FZ_ERROR_TRYLATER); - root = NULL; - } - if (!root) - fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing root element"); + xml = fz_parse_xml(ctx, part->data, 0); - if (fz_xml_is_tag(root, "AlternateContent")) - { - fz_xml *node = xps_lookup_alternate_content(ctx, doc, root); - if (!node) + root = fz_xml_root(xml); + if (!root) + fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing root element"); + + if (fz_xml_is_tag(root, "AlternateContent")) { - fz_drop_xml(ctx, root); - fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing alternate root element"); + fz_xml *node = xps_lookup_alternate_content(ctx, doc, root); + if (!node) + fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing alternate root element"); + fz_detach_xml(ctx, xml, node); + root = node; } - fz_detach_xml(node); - fz_drop_xml(ctx, root); - root = node; - } - if (!fz_xml_is_tag(root, "FixedPage")) - { - fz_drop_xml(ctx, root); - fz_throw(ctx, FZ_ERROR_GENERIC, "expected FixedPage element"); + if (!fz_xml_is_tag(root, "FixedPage")) + fz_throw(ctx, FZ_ERROR_GENERIC, "expected FixedPage element"); + width_att = fz_xml_att(root, "Width"); + if (!width_att) + fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing required attribute: Width"); + height_att = fz_xml_att(root, "Height"); + if (!height_att) + fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing required attribute: Height"); + + page->width = atoi(width_att); + page->height = atoi(height_att); } - - width_att = fz_xml_att(root, "Width"); - if (!width_att) + fz_always(ctx) { - fz_drop_xml(ctx, root); - fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing required attribute: Width"); + xps_drop_part(ctx, doc, part); } - - height_att = fz_xml_att(root, "Height"); - if (!height_att) + fz_catch(ctx) { - fz_drop_xml(ctx, root); - fz_throw(ctx, FZ_ERROR_GENERIC, "FixedPage missing required attribute: Height"); + fz_drop_xml(ctx, xml); + fz_rethrow(ctx); } - page->width = atoi(width_att); - page->height = atoi(height_att); - - return root; + return xml; } static fz_rect * @@ -404,7 +392,7 @@ xps_drop_page_imp(fz_context *ctx, fz_page *page_) { xps_page *page = (xps_page*)page_; fz_drop_document(ctx, &page->doc->super); - fz_drop_xml(ctx, page->root); + fz_drop_xml(ctx, page->xml); } fz_page * @@ -413,7 +401,7 @@ xps_load_page(fz_context *ctx, fz_document *doc_, int number) xps_document *doc = (xps_document*)doc_; xps_page *page = NULL; xps_fixpage *fix; - fz_xml *root; + fz_xml_doc *xml; int n = 0; fz_var(page); @@ -422,7 +410,7 @@ xps_load_page(fz_context *ctx, fz_document *doc_, int number) { if (n == number) { - root = xps_load_fixed_page(ctx, doc, fix); + xml = xps_load_fixed_page(ctx, doc, fix); fz_try(ctx) { page = fz_new_derived_page(ctx, xps_page); @@ -433,11 +421,11 @@ xps_load_page(fz_context *ctx, fz_document *doc_, int number) page->doc = (xps_document*) fz_keep_document(ctx, (fz_document*)doc); page->fix = fix; - page->root = root; + page->xml = xml; } fz_catch(ctx) { - fz_drop_xml(ctx, root); + fz_drop_xml(ctx, xml); fz_rethrow(ctx); } return (fz_page*)page; |