static epub_chapter * epub_parse_chapter(fz_context *ctx, epub_document *doc, const char *path) { fz_archive *zip = doc->zip; fz_buffer *buf = NULL; epub_chapter *ch; char base_uri[2048]; fz_dirname(base_uri, path, sizeof base_uri); ch = fz_malloc_struct(ctx, epub_chapter); ch->path = NULL; ch->html = NULL; ch->next = NULL; fz_var(buf); fz_try(ctx) { buf = fz_read_archive_entry(ctx, zip, path); ch->path = fz_strdup(ctx, path); ch->html = fz_parse_html(ctx, doc->set, zip, base_uri, buf, fz_user_css(ctx)); } fz_always(ctx) fz_drop_buffer(ctx, buf); fz_catch(ctx) { fz_drop_html(ctx, ch->html); fz_free(ctx, ch->path); fz_free(ctx, ch); fz_rethrow(ctx); } return ch; }
static void htdoc_close_document(fz_context *ctx, fz_document *doc_) { html_document *doc = (html_document*)doc_; fz_drop_archive(ctx, doc->zip); fz_drop_html(ctx, doc->box); fz_drop_html_font_set(ctx, doc->set); fz_free(ctx, doc); }
void fz_drop_html(fz_context *ctx, fz_html *box) { while (box) { fz_html *next = box->next; fz_drop_html_flow(ctx, box->flow_head); fz_drop_html(ctx, box->down); fz_free(ctx, box); box = next; } }
static void epub_close_document(fz_context *ctx, fz_document *doc_) { epub_document *doc = (epub_document*)doc_; epub_chapter *ch, *next; ch = doc->spine; while (ch) { next = ch->next; fz_drop_html(ctx, ch->box); fz_free(ctx, ch); ch = next; } fz_drop_archive(ctx, doc->zip); fz_drop_html_font_set(ctx, doc->set); fz_free(ctx, doc); }
static void epub_drop_document(fz_context *ctx, fz_document *doc_) { epub_document *doc = (epub_document*)doc_; epub_chapter *ch, *next; ch = doc->spine; while (ch) { next = ch->next; fz_drop_html(ctx, ch->html); fz_free(ctx, ch->path); fz_free(ctx, ch); ch = next; } fz_drop_archive(ctx, doc->zip); fz_drop_html_font_set(ctx, doc->set); fz_drop_outline(ctx, doc->outline); fz_free(ctx, doc->dc_title); fz_free(ctx, doc->dc_creator); }