diff options
Diffstat (limited to 'mupdf/nametree.c')
-rw-r--r-- | mupdf/nametree.c | 147 |
1 files changed, 28 insertions, 119 deletions
diff --git a/mupdf/nametree.c b/mupdf/nametree.c index b806ec83..1b766e64 100644 --- a/mupdf/nametree.c +++ b/mupdf/nametree.c @@ -2,24 +2,7 @@ #include <mupdf.h> static fz_error * -grownametree(pdf_nametree *tree, int amount) -{ - struct fz_keyval_s *newitems; - int newcap; - - newcap = tree->cap + amount; - newitems = fz_realloc(tree->items, sizeof(struct fz_keyval_s) * newcap); - if (!newitems) - return fz_outofmem; - - tree->items = newitems; - tree->cap = newcap; - - return nil; -} - -static fz_error * -loadnametreenode(pdf_nametree *tree, pdf_xref *xref, fz_obj *node) +loadnametreenode(fz_obj *tree, pdf_xref *xref, fz_obj *node) { fz_error *error; fz_obj *names; @@ -41,21 +24,16 @@ loadnametreenode(pdf_nametree *tree, pdf_xref *xref, fz_obj *node) len = fz_arraylen(names) / 2; - error = grownametree(tree, len); - if (error) - { - fz_dropobj(names); - goto cleanup; - } - for (i = 0; i < len; ++i) { key = fz_arrayget(names, i * 2 + 0); val = fz_arrayget(names, i * 2 + 1); - - tree->items[tree->len].k = fz_keepobj(key); - tree->items[tree->len].v = fz_keepobj(val); - tree->len ++; + error = fz_dictput(tree, key, val); + if (error) + { + fz_dropobj(names); + goto cleanup; + } } fz_dropobj(names); @@ -90,130 +68,61 @@ cleanup: return error; } -void -pdf_dropnametree(pdf_nametree *tree) -{ - int i; - for (i = 0; i < tree->len; i++) - { - fz_dropobj(tree->items[i].k); - fz_dropobj(tree->items[i].v); - } - fz_free(tree->items); - fz_free(tree); -} - fz_error * -pdf_loadnametree(pdf_nametree **treep, pdf_xref *xref, fz_obj *root) +pdf_loadnametree(fz_obj **dictp, pdf_xref *xref, fz_obj *root) { fz_error *error; - pdf_nametree *tree; - - tree = fz_malloc(sizeof(pdf_nametree)); - if (!tree) - return fz_outofmem; + fz_obj *tree; - tree->len = 0; - tree->cap = 0; - tree->items = nil; + error = fz_newdict(&tree, 128); + if (error) + return error; error = loadnametreenode(tree, xref, root); if (error) { - pdf_dropnametree(tree); + fz_dropobj(tree); return error; } - *treep = tree; - return nil; -} - -void -pdf_debugnametree(pdf_nametree *tree) -{ - int i; - for (i = 0; i < tree->len; i++) { - printf(" "); - fz_debugobj(tree->items[i].k); - printf(" "); - fz_debugobj(tree->items[i].v); - printf("\n"); - } -} - -static fz_obj * -lookup(pdf_nametree *tree, char *namestr, int namelen) -{ - int l = 0; - int r = tree->len - 1; - - while (l <= r) - { - int m = (l + r) >> 1; - char *keystr = fz_tostringbuf(tree->items[m].k); - int keylen = fz_tostringlen(tree->items[m].k); - int cmplen = MIN(namelen, keylen); - int c = strncmp(namestr, keystr, cmplen); - if (c < 0) - r = m - 1; - else if (c > 0) - l = m + 1; - else - return tree->items[m].v; - } +// fz_sortdict(tree); + *dictp = tree; return nil; } -fz_obj * -pdf_lookupname(pdf_nametree *tree, fz_obj *name) -{ - return lookup(tree, fz_tostringbuf(name), fz_tostringlen(name)); -} - -fz_obj * -pdf_lookupnames(pdf_nametree *tree, char *name) -{ - return lookup(tree, name, strlen(name)); -} - fz_error * pdf_loadnametrees(pdf_xref *xref) { fz_error *error; - fz_obj *catalog; fz_obj *names; fz_obj *dests; - catalog = fz_dictgets(xref->trailer, "Root"); - error = pdf_resolve(&catalog, xref); - if (error) - return error; + /* PDF 1.1 */ + dests = fz_dictgets(xref->root, "Dests"); + if (dests) + { + error = pdf_resolve(&dests, xref); + if (error) + return error; + xref->dests = dests; + return nil; + } - names = fz_dictgets(catalog, "Names"); + /* PDF 1.2 */ + names = fz_dictgets(xref->root, "Names"); if (names) { error = pdf_resolve(&names, xref); if (error) - { - fz_dropobj(names); - fz_dropobj(catalog); return error; - } - dests = fz_dictgets(names, "Dests"); error = pdf_loadnametree(&xref->dests, xref, dests); + fz_dropobj(names); if (error) - { - fz_dropobj(names); - fz_dropobj(catalog); return error; - } - - fz_dropobj(names); } - fz_dropobj(catalog); return nil; } |