diff options
Diffstat (limited to 'source/pdf/pdf-store.c')
-rw-r--r-- | source/pdf/pdf-store.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/source/pdf/pdf-store.c b/source/pdf/pdf-store.c new file mode 100644 index 00000000..d3873e76 --- /dev/null +++ b/source/pdf/pdf-store.c @@ -0,0 +1,76 @@ +#include "mupdf/pdf.h" + +static int +pdf_make_hash_key(fz_store_hash *hash, void *key_) +{ + pdf_obj *key = (pdf_obj *)key_; + + if (!pdf_is_indirect(key)) + return 0; + hash->u.i.i0 = pdf_to_num(key); + hash->u.i.i1 = pdf_to_gen(key); + return 1; +} + +static void * +pdf_keep_key(fz_context *ctx, void *key) +{ + return (void *)pdf_keep_obj((pdf_obj *)key); +} + +static void +pdf_drop_key(fz_context *ctx, void *key) +{ + pdf_drop_obj((pdf_obj *)key); +} + +static int +pdf_cmp_key(void *k0, void *k1) +{ + return pdf_objcmp((pdf_obj *)k0, (pdf_obj *)k1); +} + +#ifndef NDEBUG +static void +pdf_debug_key(FILE *out, void *key_) +{ + pdf_obj *key = (pdf_obj *)key_; + + if (pdf_is_indirect(key)) + { + fprintf(out, "(%d %d R) ", pdf_to_num(key), pdf_to_gen(key)); + } else + pdf_fprint_obj(out, key, 0); +} +#endif + +static fz_store_type pdf_obj_store_type = +{ + pdf_make_hash_key, + pdf_keep_key, + pdf_drop_key, + pdf_cmp_key, +#ifndef NDEBUG + pdf_debug_key +#endif +}; + +void +pdf_store_item(fz_context *ctx, pdf_obj *key, void *val, unsigned int itemsize) +{ + void *existing; + existing = fz_store_item(ctx, key, val, itemsize, &pdf_obj_store_type); + assert(existing == NULL); +} + +void * +pdf_find_item(fz_context *ctx, fz_store_free_fn *free, pdf_obj *key) +{ + return fz_find_item(ctx, free, key, &pdf_obj_store_type); +} + +void +pdf_remove_item(fz_context *ctx, fz_store_free_fn *free, pdf_obj *key) +{ + fz_remove_item(ctx, free, key, &pdf_obj_store_type); +} |