From 466cb473d1600f6951baf7687e1b62932f41e026 Mon Sep 17 00:00:00 2001 From: Michael R Sweet Date: Thu, 10 Jun 2021 10:58:07 -0400 Subject: [PATCH] Fix _pdfioFileRead/Seek to fix test suite-reported error loading an object. --- pdfio-common.c | 16 ++++++++++++++++ pdfio-object.c | 7 +++++++ pdfio-stream.c | 1 - testpdfio.c | 9 ++++++--- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/pdfio-common.c b/pdfio-common.c index dcf75b0..02f96d7 100644 --- a/pdfio-common.c +++ b/pdfio-common.c @@ -141,6 +141,8 @@ _pdfioFileGets(pdfio_file_t *pdf, // I - PDF file *bufend = buffer + bufsize - 1; // Pointer to end of buffer + PDFIO_DEBUG("_pdfioFileGets(pdf=%p, buffer=%p, bufsize=%lu) bufpos=%ld, buffer=%p, bufptr=%p, bufend=%p\n", pdf, buffer, (unsigned long)bufsize, (long)pdf->bufpos, pdf->buffer, pdf->bufptr, pdf->bufend); + while (!eol) { // If there are characters ready in the buffer, use them... @@ -180,6 +182,8 @@ _pdfioFileGets(pdfio_file_t *pdf, // I - PDF file *bufptr = '\0'; + PDFIO_DEBUG("_pdfioFileGets: Returning %s, '%s'\n", eol ? "true" : "false", buffer); + return (eol); } @@ -310,6 +314,13 @@ _pdfioFileRead(pdfio_file_t *pdf, // I - PDF file // Nothing buffered... if (bytes > 1024) { + // Advance current position in file as needed... + if (pdf->bufend) + { + pdf->bufpos += pdf->bufend - pdf->buffer; + pdf->bufptr = pdf->bufend = NULL; + } + // Read directly from the file... if ((rbytes = read_buffer(pdf, bufptr, bytes)) > 0) { @@ -356,6 +367,8 @@ _pdfioFileSeek(pdfio_file_t *pdf, // I - PDF file { // Yes, seek within existing buffer... pdf->bufptr = pdf->buffer + offset - pdf->bufpos; + PDFIO_DEBUG("_pdfioFileSeek: Seek within buffer, bufpos=%ld.\n", (long)pdf->bufpos); + PDFIO_DEBUG("_pdfioFileSeek: buffer=%p, bufptr=%p, bufend=%p\n", pdf->buffer, pdf->bufptr, pdf->bufend); return (offset); } @@ -381,6 +394,9 @@ _pdfioFileSeek(pdfio_file_t *pdf, // I - PDF file return (-1); } + PDFIO_DEBUG("_pdfioFileSeek: Reset bufpos=%ld.\n", (long)pdf->bufpos); + PDFIO_DEBUG("_pdfioFileSeek: buffer=%p, bufptr=%p, bufend=%p\n", pdf->buffer, pdf->bufptr, pdf->bufend); + pdf->bufpos = offset; return (offset); diff --git a/pdfio-object.c b/pdfio-object.c index 8ce8210..c8b26bf 100644 --- a/pdfio-object.c +++ b/pdfio-object.c @@ -360,6 +360,8 @@ _pdfioObjLoad(pdfio_obj_t *obj) // I - Object return (false); } + PDFIO_DEBUG("_pdfioObjLoad: Header is '%s'.\n", line); + if (strtoimax(line, &ptr, 10) != (intmax_t)obj->number) { _pdfioFileError(obj->pdf, "Bad header for object %lu.", (unsigned long)obj->number); @@ -403,8 +405,13 @@ _pdfioObjLoad(pdfio_obj_t *obj) // I - Object { // Yes, save its location... obj->stream_offset = _pdfioFileTell(obj->pdf); + PDFIO_DEBUG("_pdfioObjLoad: stream_offset=%lu.\n", (unsigned long)obj->stream_offset); } + PDFIO_DEBUG("_pdfioObjLoad: "); + PDFIO_DEBUG_VALUE(&obj->value); + PDFIO_DEBUG("\n"); + return (true); } diff --git a/pdfio-stream.c b/pdfio-stream.c index e241417..f9624dc 100644 --- a/pdfio-stream.c +++ b/pdfio-stream.c @@ -216,7 +216,6 @@ _pdfioStreamCreate( if (predictor >= 10) st->pbsize ++; // Add PNG predictor byte - fprintf(stderr, "colors=%d, bpc=%d, pbpixel=%u\n", colors, bpc, (unsigned)st->pbpixel); if ((st->prbuffer = calloc(1, st->pbsize - 1)) == NULL || (st->psbuffer = calloc(1, st->pbsize)) == NULL) { _pdfioFileError(st->pdf, "Unable to allocate %lu bytes for Predictor buffers.", (unsigned long)st->pbsize); diff --git a/testpdfio.c b/testpdfio.c index f72e057..c694ca3 100644 --- a/testpdfio.c +++ b/testpdfio.c @@ -274,7 +274,7 @@ do_unit_tests(void) return (1); // Write a page with test images... - first_image = pdfioFileGetNumObjs(outpdf); + first_image = pdfioFileGetNumObjs(outpdf) + 1; if (write_images(outpdf, 7, helvetica)) return (1); @@ -328,7 +328,10 @@ do_unit_tests(void) // Verify the images for (i = 0; i < 7; i ++) - verify_image(pdf, first_image + (size_t)i); + { + if (verify_image(pdf, first_image + (size_t)i)) + return (1); + } // Close the new PDF file... fputs("pdfioFileClose(\"testpdfio-out.pdf\"): ", stdout); @@ -401,7 +404,7 @@ draw_image(pdfio_stream_t *st, static bool // O - `true` to stop, `false` to continue error_cb(pdfio_file_t *pdf, // I - PDF file const char *message, // I - Error message - bool *error) // IO - Have we displayed an error? + bool *error) // IO - Have we displayed an error? { (void)pdf;