diff options
Diffstat (limited to 'source/pdf/pdf-object.c')
-rw-r--r-- | source/pdf/pdf-object.c | 156 |
1 files changed, 83 insertions, 73 deletions
diff --git a/source/pdf/pdf-object.c b/source/pdf/pdf-object.c index bd68b761..0d43e056 100644 --- a/source/pdf/pdf-object.c +++ b/source/pdf/pdf-object.c @@ -2,12 +2,17 @@ #include "mupdf/pdf.h" #include "../fitz/fitz-imp.h" -#include "pdf-name-table.h" - #include <stdarg.h> #include <stdlib.h> #include <string.h> +#define PDF_MAKE_NAME(STRING,NAME) STRING, +static const char *PDF_NAME_LIST[] = { + "", /* dummy */ +#include "mupdf/pdf/name-table.h" +}; +#undef PDF_MAKE_NAME + typedef enum pdf_objkind_e { PDF_INT = 'i', @@ -102,13 +107,13 @@ typedef struct pdf_obj_ref_s pdf_obj * pdf_new_null(fz_context *ctx, pdf_document *doc) { - return PDF_OBJ_NULL; + return PDF_NULL; } pdf_obj * pdf_new_bool(fz_context *ctx, pdf_document *doc, int b) { - return b ? PDF_OBJ_TRUE : PDF_OBJ_FALSE; + return b ? PDF_TRUE : PDF_FALSE; } pdf_obj * @@ -166,9 +171,9 @@ pdf_new_name(fz_context *ctx, pdf_document *doc, const char *str) pdf_obj_name *obj; const char **stdname; - stdname = bsearch(str, &PDF_NAMES[1], PDF_OBJ_ENUM_NAME__LIMIT-1, sizeof(char *), namecmp); + stdname = bsearch(str, &PDF_NAME_LIST[1], PDF_ENUM_LIMIT_NAME-1, sizeof(char *), namecmp); if (stdname != NULL) - return (pdf_obj *)(intptr_t)(stdname - &PDF_NAMES[0]); + return (pdf_obj *)(intptr_t)(stdname - &PDF_NAME_LIST[0]); obj = Memento_label(fz_malloc(ctx, offsetof(pdf_obj_name, n) + strlen(str) + 1), "pdf_obj(name)"); obj->super.refs = 1; @@ -195,33 +200,31 @@ pdf_new_indirect(fz_context *ctx, pdf_document *doc, int num, int gen) pdf_obj * pdf_keep_obj(fz_context *ctx, pdf_obj *obj) { - if (obj >= PDF_OBJ__LIMIT) + if (obj >= PDF_OBJ_LIMIT) { (void)fz_keep_imp16(ctx, obj, &obj->refs); } return obj; } -#define OBJ_IS_NULL(obj) \ - (obj == PDF_OBJ_NULL) -#define OBJ_IS_BOOL(obj) \ - (obj == PDF_OBJ_TRUE || obj == PDF_OBJ_FALSE) +#define OBJ_IS_NULL(obj) (obj == PDF_NULL) +#define OBJ_IS_BOOL(obj) (obj == PDF_TRUE || obj == PDF_FALSE) #define OBJ_IS_INT(obj) \ - (obj >= PDF_OBJ__LIMIT ? obj->kind == PDF_INT : 0) + (obj >= PDF_OBJ_LIMIT ? obj->kind == PDF_INT : 0) #define OBJ_IS_REAL(obj) \ - (obj >= PDF_OBJ__LIMIT ? obj->kind == PDF_REAL : 0) + (obj >= PDF_OBJ_LIMIT ? obj->kind == PDF_REAL : 0) #define OBJ_IS_NUMBER(obj) \ - (obj >= PDF_OBJ__LIMIT ? (obj->kind == PDF_REAL || obj->kind == PDF_INT) : 0) + (obj >= PDF_OBJ_LIMIT ? (obj->kind == PDF_REAL || obj->kind == PDF_INT) : 0) #define OBJ_IS_STRING(obj) \ - (obj >= PDF_OBJ__LIMIT ? obj->kind == PDF_STRING : 0) + (obj >= PDF_OBJ_LIMIT ? obj->kind == PDF_STRING : 0) #define OBJ_IS_NAME(obj) \ - ((obj >= PDF_OBJ__LIMIT) ? (obj->kind == PDF_NAME) : (obj != NULL && obj < PDF_OBJ_NAME__LIMIT)) + ((obj >= PDF_OBJ_LIMIT) ? (obj->kind == PDF_NAME) : (obj != NULL && obj < PDF_NAME_LIMIT)) #define OBJ_IS_ARRAY(obj) \ - (obj >= PDF_OBJ__LIMIT ? obj->kind == PDF_ARRAY : 0) + (obj >= PDF_OBJ_LIMIT ? obj->kind == PDF_ARRAY : 0) #define OBJ_IS_DICT(obj) \ - (obj >= PDF_OBJ__LIMIT ? obj->kind == PDF_DICT : 0) + (obj >= PDF_OBJ_LIMIT ? obj->kind == PDF_DICT : 0) #define OBJ_IS_INDIRECT(obj) \ - (obj >= PDF_OBJ__LIMIT ? obj->kind == PDF_INDIRECT : 0) + (obj >= PDF_OBJ_LIMIT ? obj->kind == PDF_INDIRECT : 0) #define RESOLVE(obj) \ if (OBJ_IS_INDIRECT(obj)) \ @@ -289,13 +292,13 @@ int pdf_is_dict(fz_context *ctx, pdf_obj *obj) int pdf_to_bool(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); - return obj == PDF_OBJ_TRUE; + return obj == PDF_TRUE; } int pdf_to_int(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); - if (obj < PDF_OBJ__LIMIT) + if (obj < PDF_OBJ_LIMIT) return 0; if (obj->kind == PDF_INT) return (int)NUM(obj)->u.i; @@ -307,7 +310,7 @@ int pdf_to_int(fz_context *ctx, pdf_obj *obj) int64_t pdf_to_int64(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); - if (obj < PDF_OBJ__LIMIT) + if (obj < PDF_OBJ_LIMIT) return 0; if (obj->kind == PDF_INT) return NUM(obj)->u.i; @@ -319,7 +322,7 @@ int64_t pdf_to_int64(fz_context *ctx, pdf_obj *obj) float pdf_to_real(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); - if (obj < PDF_OBJ__LIMIT) + if (obj < PDF_OBJ_LIMIT) return 0; if (obj->kind == PDF_REAL) return NUM(obj)->u.f; @@ -333,8 +336,8 @@ const char *pdf_to_name(fz_context *ctx, pdf_obj *obj) RESOLVE(obj); if (!OBJ_IS_NAME(obj)) return ""; - if (obj < PDF_OBJ_NAME__LIMIT) - return PDF_NAMES[(intptr_t)obj]; + if (obj < PDF_NAME_LIMIT) + return PDF_NAME_LIST[(intptr_t)obj]; return NAME(obj)->n; } @@ -395,7 +398,7 @@ pdf_document *pdf_get_indirect_document(fz_context *ctx, pdf_obj *obj) pdf_document *pdf_get_bound_document(fz_context *ctx, pdf_obj *obj) { - if (obj < PDF_OBJ__LIMIT) + if (obj < PDF_OBJ_LIMIT) return NULL; if (obj->kind == PDF_INDIRECT) return REF(obj)->doc; @@ -424,27 +427,27 @@ pdf_objcmp(fz_context *ctx, pdf_obj *a, pdf_obj *b) if (!a || !b) return 1; - if (a < PDF_OBJ_NAME__LIMIT) + if (a < PDF_NAME_LIMIT) { - if (b < PDF_OBJ_NAME__LIMIT) + if (b < PDF_NAME_LIMIT) return a != b; - if (b < PDF_OBJ__LIMIT) + if (b < PDF_OBJ_LIMIT) return 1; if (b->kind != PDF_NAME) return 1; - return strcmp(NAME(b)->n, PDF_NAMES[(intptr_t)a]); + return strcmp(NAME(b)->n, PDF_NAME_LIST[(intptr_t)a]); } - if (b < PDF_OBJ_NAME__LIMIT) + if (b < PDF_NAME_LIMIT) { - if (a < PDF_OBJ__LIMIT) + if (a < PDF_OBJ_LIMIT) return 1; if (a->kind != PDF_NAME) return 1; - return strcmp(NAME(a)->n, PDF_NAMES[(intptr_t)b]); + return strcmp(NAME(a)->n, PDF_NAME_LIST[(intptr_t)b]); } - if (a < PDF_OBJ__LIMIT || b < PDF_OBJ__LIMIT) + if (a < PDF_OBJ_LIMIT || b < PDF_OBJ_LIMIT) return a != b; if (a->kind != b->kind) @@ -508,18 +511,25 @@ pdf_objcmp(fz_context *ctx, pdf_obj *a, pdf_obj *b) return 1; } +int pdf_name_eq(fz_context *ctx, pdf_obj *a, pdf_obj *b) +{ + /* A quick check in case they are constants */ + if (a < PDF_NAME_LIMIT) + return a == b; + return !pdf_objcmp_resolve(ctx, a, b); +} + static char * pdf_objkindstr(pdf_obj *obj) { if (!obj) return "<NULL>"; - if (obj < PDF_OBJ_NAME__LIMIT) + if (obj < PDF_NAME_LIMIT) return "name"; - if (obj == PDF_OBJ_TRUE || obj == PDF_OBJ_FALSE) + if (obj == PDF_TRUE || obj == PDF_FALSE) return "boolean"; - if (obj == PDF_OBJ_NULL) + if (obj == PDF_NULL) return "null"; - switch (obj->kind) { case PDF_INT: return "integer"; @@ -634,7 +644,7 @@ static void prepare_object_for_alteration(fz_context *ctx, pdf_obj *obj, pdf_obj obj should be a dict or an array. We don't care about any other types, as they aren't 'containers'. */ - if (obj < PDF_OBJ__LIMIT) + if (obj < PDF_OBJ_LIMIT) return; switch (obj->kind) @@ -689,7 +699,7 @@ pdf_array_put(fz_context *ctx, pdf_obj *obj, int i, pdf_obj *item) fz_throw(ctx, FZ_ERROR_GENERIC, "index out of bounds"); if (!item) - item = PDF_OBJ_NULL; + item = PDF_NULL; prepare_object_for_alteration(ctx, obj, item); pdf_drop_obj(ctx, ARRAY(obj)->items[i]); @@ -715,7 +725,7 @@ pdf_array_push(fz_context *ctx, pdf_obj *obj, pdf_obj *item) fz_throw(ctx, FZ_ERROR_GENERIC, "not an array (%s)", pdf_objkindstr(obj)); if (!item) - item = PDF_OBJ_NULL; + item = PDF_NULL; prepare_object_for_alteration(ctx, obj, item); if (ARRAY(obj)->len + 1 > ARRAY(obj)->cap) @@ -728,7 +738,7 @@ void pdf_array_push_drop(fz_context *ctx, pdf_obj *obj, pdf_obj *item) { RESOLVE(obj); - if (obj >= PDF_OBJ__LIMIT) + if (obj >= PDF_OBJ_LIMIT) { fz_try(ctx) pdf_array_push(ctx, obj, item); @@ -749,7 +759,7 @@ pdf_array_insert(fz_context *ctx, pdf_obj *obj, pdf_obj *item, int i) fz_throw(ctx, FZ_ERROR_GENERIC, "index out of bounds"); if (!item) - item = PDF_OBJ_NULL; + item = PDF_NULL; prepare_object_for_alteration(ctx, obj, item); if (ARRAY(obj)->len + 1 > ARRAY(obj)->cap) @@ -763,7 +773,7 @@ void pdf_array_insert_drop(fz_context *ctx, pdf_obj *obj, pdf_obj *item, int i) { RESOLVE(obj); - if (obj >= PDF_OBJ__LIMIT) + if (obj >= PDF_OBJ_LIMIT) { fz_try(ctx) pdf_array_insert(ctx, obj, item, i); @@ -865,16 +875,16 @@ static int keyvalcmp(const void *ap, const void *bp) /* We should never get a->k == NULL or b->k == NULL. If we * do, then they match. */ - if (a->k < PDF_OBJ_NAME__LIMIT) - an = PDF_NAMES[(intptr_t)a->k]; - else if (a->k >= PDF_OBJ__LIMIT && a->k->kind == PDF_NAME) + if (a->k < PDF_NAME_LIMIT) + an = PDF_NAME_LIST[(intptr_t)a->k]; + else if (a->k >= PDF_OBJ_LIMIT && a->k->kind == PDF_NAME) an = NAME(a->k)->n; else return 0; - if (b->k < PDF_OBJ_NAME__LIMIT) - bn = PDF_NAMES[(intptr_t)b->k]; - else if (b->k >= PDF_OBJ__LIMIT && b->k->kind == PDF_NAME) + if (b->k < PDF_NAME_LIMIT) + bn = PDF_NAME_LIST[(intptr_t)b->k]; + else if (b->k >= PDF_OBJ_LIMIT && b->k->kind == PDF_NAME) bn = NAME(b->k)->n; else return 0; @@ -1000,7 +1010,7 @@ pdf_dict_put_val_null(fz_context *ctx, pdf_obj *obj, int idx) prepare_object_for_alteration(ctx, obj, NULL); pdf_drop_obj(ctx, DICT(obj)->items[idx].v); - DICT(obj)->items[idx].v = PDF_OBJ_NULL; + DICT(obj)->items[idx].v = PDF_NULL; } /* Returns 0 <= i < len for key found. Returns -1-len < i <= -1 for key @@ -1054,7 +1064,7 @@ pdf_dict_find(fz_context *ctx, pdf_obj *obj, pdf_obj *key) int r = len - 1; pdf_obj *k = DICT(obj)->items[r].k; - if (k == key || (k >= PDF_OBJ__LIMIT && strcmp(NAME(k)->n, PDF_NAMES[(intptr_t)key]) < 0)) + if (k == key || (k >= PDF_OBJ_LIMIT && strcmp(NAME(k)->n, PDF_NAME_LIST[(intptr_t)key]) < 0)) { return -1 - (r+1); } @@ -1065,7 +1075,7 @@ pdf_dict_find(fz_context *ctx, pdf_obj *obj, pdf_obj *key) int c; k = DICT(obj)->items[m].k; - c = (k < PDF_OBJ__LIMIT ? (char *)key-(char *)k : -strcmp(NAME(k)->n, PDF_NAMES[(intptr_t)key])); + c = (k < PDF_OBJ_LIMIT ? (char *)key-(char *)k : -strcmp(NAME(k)->n, PDF_NAME_LIST[(intptr_t)key])); if (c < 0) r = m - 1; else if (c > 0) @@ -1081,14 +1091,14 @@ pdf_dict_find(fz_context *ctx, pdf_obj *obj, pdf_obj *key) for (i = 0; i < len; i++) { pdf_obj *k = DICT(obj)->items[i].k; - if (k < PDF_OBJ__LIMIT) + if (k < PDF_OBJ_LIMIT) { if (k == key) return i; } else { - if (!strcmp(PDF_NAMES[(intptr_t)key], NAME(k)->n)) + if (!strcmp(PDF_NAME_LIST[(intptr_t)key], NAME(k)->n)) return i; } } @@ -1175,7 +1185,7 @@ pdf_dict_get(fz_context *ctx, pdf_obj *obj, pdf_obj *key) if (!OBJ_IS_NAME(key)) return NULL; - if (key < PDF_OBJ_NAME__LIMIT) + if (key < PDF_NAME_LIMIT) i = pdf_dict_find(ctx, obj, key); else i = pdf_dict_finds(ctx, obj, pdf_to_name(ctx, key)); @@ -1219,12 +1229,12 @@ pdf_dict_get_put(fz_context *ctx, pdf_obj *obj, pdf_obj *key, pdf_obj *val, pdf_ fz_throw(ctx, FZ_ERROR_GENERIC, "key is not a name (%s)", pdf_objkindstr(obj)); if (!val) - val = PDF_OBJ_NULL; + val = PDF_NULL; if (DICT(obj)->len > 100 && !(obj->flags & PDF_FLAGS_SORTED)) pdf_sort_dict(ctx, obj); - if (key < PDF_OBJ_NAME__LIMIT) + if (key < PDF_NAME_LIMIT) i = pdf_dict_find(ctx, obj, key); else i = pdf_dict_finds(ctx, obj, pdf_to_name(ctx, key)); @@ -1512,8 +1522,8 @@ pdf_dict_del(fz_context *ctx, pdf_obj *obj, pdf_obj *key) if (!OBJ_IS_NAME(key)) fz_throw(ctx, FZ_ERROR_GENERIC, "key is not a name (%s)", pdf_objkindstr(key)); - if (key < PDF_OBJ_NAME__LIMIT) - pdf_dict_dels(ctx, obj, PDF_NAMES[(intptr_t)key]); + if (key < PDF_NAME_LIMIT) + pdf_dict_dels(ctx, obj, PDF_NAME_LIST[(intptr_t)key]); else pdf_dict_dels(ctx, obj, NAME(key)->n); } @@ -1534,7 +1544,7 @@ pdf_sort_dict(fz_context *ctx, pdf_obj *obj) pdf_obj * pdf_deep_copy_obj(fz_context *ctx, pdf_obj *obj) { - if (obj < PDF_OBJ__LIMIT) + if (obj < PDF_OBJ_LIMIT) { return pdf_keep_obj(ctx, obj); } @@ -1590,7 +1600,7 @@ int pdf_obj_marked(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); - if (obj < PDF_OBJ__LIMIT) + if (obj < PDF_OBJ_LIMIT) return 0; return !!(obj->flags & PDF_FLAGS_MARKED); } @@ -1600,7 +1610,7 @@ pdf_mark_obj(fz_context *ctx, pdf_obj *obj) { int marked; RESOLVE(obj); - if (obj < PDF_OBJ__LIMIT) + if (obj < PDF_OBJ_LIMIT) return 0; marked = !!(obj->flags & PDF_FLAGS_MARKED); obj->flags |= PDF_FLAGS_MARKED; @@ -1611,7 +1621,7 @@ void pdf_unmark_obj(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); - if (obj < PDF_OBJ__LIMIT) + if (obj < PDF_OBJ_LIMIT) return; obj->flags &= ~PDF_FLAGS_MARKED; } @@ -1619,7 +1629,7 @@ pdf_unmark_obj(fz_context *ctx, pdf_obj *obj) void pdf_set_obj_memo(fz_context *ctx, pdf_obj *obj, int bit, int memo) { - if (obj < PDF_OBJ__LIMIT) + if (obj < PDF_OBJ_LIMIT) return; bit <<= 1; @@ -1633,7 +1643,7 @@ pdf_set_obj_memo(fz_context *ctx, pdf_obj *obj, int bit, int memo) int pdf_obj_memo(fz_context *ctx, pdf_obj *obj, int bit, int *memo) { - if (obj < PDF_OBJ__LIMIT) + if (obj < PDF_OBJ_LIMIT) return 0; bit <<= 1; if (!(obj->flags & (PDF_FLAGS_MEMO_BASE<<bit))) @@ -1645,7 +1655,7 @@ pdf_obj_memo(fz_context *ctx, pdf_obj *obj, int bit, int *memo) int pdf_obj_is_dirty(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); - if (obj < PDF_OBJ__LIMIT) + if (obj < PDF_OBJ_LIMIT) return 0; return !!(obj->flags & PDF_FLAGS_DIRTY); } @@ -1653,14 +1663,14 @@ int pdf_obj_is_dirty(fz_context *ctx, pdf_obj *obj) void pdf_dirty_obj(fz_context *ctx, pdf_obj *obj) { RESOLVE(obj); - if (obj < PDF_OBJ__LIMIT) + if (obj < PDF_OBJ_LIMIT) return; obj->flags |= PDF_FLAGS_DIRTY; } void pdf_clean_obj(fz_context *ctx, pdf_obj *obj) { - if (obj < PDF_OBJ__LIMIT) + if (obj < PDF_OBJ_LIMIT) return; obj->flags &= ~PDF_FLAGS_DIRTY; } @@ -1694,7 +1704,7 @@ pdf_drop_dict(fz_context *ctx, pdf_obj *obj) void pdf_drop_obj(fz_context *ctx, pdf_obj *obj) { - if (obj >= PDF_OBJ__LIMIT) + if (obj >= PDF_OBJ_LIMIT) { if (fz_drop_imp16(ctx, obj, &obj->refs)) { @@ -1713,7 +1723,7 @@ pdf_set_obj_parent(fz_context *ctx, pdf_obj *obj, int num) { int n, i; - if (obj < PDF_OBJ__LIMIT) + if (obj < PDF_OBJ_LIMIT) return; switch(obj->kind) @@ -1735,7 +1745,7 @@ pdf_set_obj_parent(fz_context *ctx, pdf_obj *obj, int num) int pdf_obj_parent_num(fz_context *ctx, pdf_obj *obj) { - if (obj < PDF_OBJ__LIMIT) + if (obj < PDF_OBJ_LIMIT) return 0; switch(obj->kind) @@ -2172,7 +2182,7 @@ void pdf_debug_obj(fz_context *ctx, pdf_obj *obj) int pdf_obj_refs(fz_context *ctx, pdf_obj *ref) { - return (ref >= PDF_OBJ__LIMIT ? ref->refs : 0); + return (ref >= PDF_OBJ_LIMIT ? ref->refs : 0); } /* Convenience functions */ |