diff --git a/pdf.c b/pdf.c index 0101ca29f9b291931a426edf8ef4c562e12d3287..6ea78eb8fef497e24448ba51fd8d32bacc012233 100644 --- a/pdf.c +++ b/pdf.c @@ -1254,12 +1254,23 @@ struct predictor { uint8_t *buf; /* previous row of input */ uint8_t c; /* byte 'c' (upper left) */ int x; /* current position */ + +#ifndef ITERATIVE // XXX + uint8_t *out; + size_t nout; +#endif }; int depred_none(struct predictor *pred, uint8_t *inp, size_t sz) { +#ifdef ITERATIVE // XXX return h_parse_chunk(pred->sp, inp, sz); +#else + pred->out = inp; + pred->nout = sz; + return false; +#endif } uint8_t pp_none(int a, int b, int c) { return 0; } @@ -1326,7 +1337,14 @@ depred_png(struct predictor *pred, uint8_t *inp, size_t sz) /* when row complete, pass it to parser and start a new row */ if (x == pred->rowsz) { +#ifdef ITERATIVE // XXX done = h_parse_chunk(pred->sp, pred->buf, pred->rowsz); +#else + pred->out = realloc(pred->out, pred->nout + pred->rowsz); + assert(pred->out != NULL); + memcpy(pred->out + pred->nout, pred->buf, pred->rowsz); + pred->nout += pred->rowsz; +#endif pred->c = pred->x = 0; if (pred->num != 2) /* support for 8-bpc TIFF */ pred->predfun = NULL; @@ -1341,7 +1359,9 @@ FlateDecode(const Dict *parms, HBytes b, HParser *p) { size_t const BUFSIZE = 8 * 1024; uint8_t *buf; +#ifdef ITERATIVE // XXX HSuspendedParser *sp; +#endif HParseResult *res; const HParsedToken *v; size_t sz; @@ -1407,10 +1427,12 @@ FlateDecode(const Dict *parms, HBytes b, HParser *p) if (buf == NULL) err(1, "FlateDecode"); +#ifdef ITERATIVE // XXX /* initialize target parser */ sp = h_parse_start(p); assert(sp != NULL); pred.sp = sp; +#endif done = 0; strm.avail_in = b.len; @@ -1429,8 +1451,12 @@ FlateDecode(const Dict *parms, HBytes b, HParser *p) done = depredict(&pred, buf, sz); } while (done == 0 && ret == Z_OK); +#ifdef ITERATIVE // XXX res = h_parse_finish(sp); // XXX always return NULL on error? +#else + res = h_parse(p, pred.out, pred.nout); +#endif inflateEnd(&strm); free(pred.buf); free(buf); @@ -1517,9 +1543,11 @@ decode_stream(const Dict *d, HBytes b, HParser *p) if (v == NULL) return h_parse(p, b.token, b.len); +#ifdef ITERATIVE // XXX /* compile to a CF backend to enable incremental parsing */ if (h_compile(p, PB_LLk, NULL) == -1) errx(1, "stream data parser: LL(1) compile failed"); +#endif if (v->token_type == TT_SEQUENCE) return NULL; // XXX filter chains not supported, yet