diff --git a/pdf.c b/pdf.c index 7a033ca4b1ad424b1e8f07495e513bf01e81487b..1ee027cb47672cda40b6a19b92da119ab8e6eedf 100644 --- a/pdf.c +++ b/pdf.c @@ -612,40 +612,51 @@ lookup_xref(struct Env *aux, size_t nr, size_t gen) } const HParsedToken * -parse_obj(struct Env *aux, Ref r, size_t offset) +parse_obj(struct Env *aux, size_t nr, size_t gen, size_t offset) { HParseResult *res; - size_t nr, gen; + size_t def_nr, def_gen; if (offset >= aux->sz) { - fprintf(stderr, "%s: obj %zu %zu: position %zu (0x%zx) out of " - "bounds\n", aux->infile, r.nr, r.gen, offset, offset); + fprintf(stderr, "%s: position %zu (%#zx) for object %zu %zu is " + "out of bounds\n", aux->infile, offset, offset, nr, gen); return NULL; } res = h_parse(p_objdef, aux->input + offset, aux->sz - offset); if (res == NULL) { fprintf(stderr, "%s: error parsing object %zu %zu at position " - "%zu (0x%zx)\n", aux->infile, r.nr, r.gen, offset, offset); + "%zu (%#zx)\n", aux->infile, nr, gen, offset, offset); return NULL; } + assert(res->ast != NULL && res->ast->token_type == TT_SEQUENCE); - nr = H_INDEX_UINT(res->ast, 0); - gen = H_INDEX_UINT(res->ast, 1); - if (nr != r.nr || gen != r.gen) { + def_nr = H_INDEX_UINT(res->ast, 0); + def_gen = H_INDEX_UINT(res->ast, 1); + if (def_nr != nr || def_gen != gen) { fprintf(stderr, "%s: object ID mismatch at position %zu " "(%#zx): sought %zu %zu, found %zu %zu.\n", aux->infile, - offset, offset, r.nr, r.gen, nr, gen); + offset, offset, nr, gen, def_nr, def_gen); return NULL; } return H_INDEX_TOKEN(res->ast, 2); } +const HParsedToken * +parse_obj_stm(struct Env *aux, size_t nr, size_t stm_nr, size_t idx) +{ + //const HParsedToken *stm; + + // XXX find the stream object, decode it, parse the offset at idx, + // and parse the target object at it + return NULL; +} + const HParsedToken * resolve(struct Env *aux, const HParsedToken *v) { - XREntry *entry = NULL; + XREntry *ent = NULL; Ref *r; /* direct objects pass through */ @@ -656,32 +667,31 @@ resolve(struct Env *aux, const HParsedToken *v) r = v->user; /* find the xref entry for this reference */ - entry = lookup_xref(aux, r->nr, r->gen); - if (entry == NULL) + ent = lookup_xref(aux, r->nr, r->gen); + if (ent == NULL) return NULL; /* obj not found */ - if (entry->obj != NULL) - return resolve(aux, entry->obj); + if (ent->obj != NULL) + return resolve(aux, ent->obj); /* parse the object and memoize */ - entry->obj = v; /* break loops */ - switch (entry->type) + ent->obj = v; /* break loops */ + switch (ent->type) { case XR_FREE: return NULL; /* obj deleted */ case XR_INUSE: - if (entry->n.gen != r->gen) + if (ent->n.gen != r->gen) return NULL; /* obj nr reused */ - entry->obj = parse_obj(aux, *r, entry->n.offs); + ent->obj = parse_obj(aux, r->nr, r->gen, ent->n.offs); break; case XR_OBJSTM: if (r->gen != 0) return NULL; /* invalid entry! */ - //XXX entry->obj = parse_obj_stm(aux, entry->o.stm, entry->o.idx); - //XXX break; - return NULL; + ent->obj = parse_obj_stm(aux, r->nr, ent->o.stm, ent->o.idx); + break; } - return resolve(aux, entry->obj); + return resolve(aux, ent->obj); } /* @@ -1254,7 +1264,7 @@ parse_xrefs(const char *input, size_t sz, size_t *nxrefs) res = h_parse(p, input, sz); if (res == NULL) { fprintf(stderr, "%s: error parsing xref section at " - "position %zu (0x%zx)\n", infile, offset, offset); + "position %zu (%#zx)\n", infile, offset, offset); break; } @@ -1284,7 +1294,7 @@ parse_xrefs(const char *input, size_t sz, size_t *nxrefs) */ if (n > 1 && tok->sint >= offset) { fprintf(stderr, "%s: /Prev pointer of xref section at " - "%zu (0x%zx) points forward\n", infile, offset, + "%zu (%#zx) points forward\n", infile, offset, offset); break; } @@ -1345,7 +1355,7 @@ main(int argc, char *argv[]) if (res) { int64_t pos = res->bit_length / 8; fprintf(stderr, "%s: error after position" - " %" PRId64 " (0x%" PRIx64 ")\n", + " %" PRId64 " (%#" PRIx64 ")\n", infile, pos, pos); //h_pprintln(stderr, res->ast); // XXX debug }