# HG changeset patch # User Matti Hamalainen # Date 1551859203 -7200 # Node ID da886b8cbb09bf050d2cc6c9474a1354a88e5af8 # Parent 81fb21dd326547209831d6d3548245fea925ee0c Improve PPM/PGM/PNM probing and header parsing. diff -r 81fb21dd3265 -r da886b8cbb09 tools/libgfx.c --- a/tools/libgfx.c Tue Mar 05 15:09:18 2019 +0200 +++ b/tools/libgfx.c Wed Mar 06 10:00:03 2019 +0200 @@ -806,6 +806,41 @@ } +// Read a PPM/PGM/PNM header line, skipping comments +static BOOL dmReadPPMHeader(DMResource *fp, char *buf, const size_t bufLen) +{ + BOOL end = FALSE, comment = FALSE; + size_t offs = 0; + + do + { + int ch = dmfgetc(fp); + if (ch == EOF) + return FALSE; + else + if (ch == '#') + comment = TRUE; + else + if (ch == '\n') + { + if (!comment) + end = TRUE; + else + comment = FALSE; + } + else + if (!comment) + { + if (offs < bufLen - 1) + buf[offs++] = ch; + } + } while (!end); + + buf[offs] = 0; + return TRUE; +} + + int dmReadPPMImage(DMResource *fp, DMImage **pimg) { DMImage *img = NULL; @@ -814,9 +849,9 @@ char hdr1[8], hdr2[32], hdr3[16]; // Read PPM header - if (dmfgets(hdr1, sizeof(hdr1), fp) == NULL || - dmfgets(hdr2, sizeof(hdr2), fp) == NULL || - dmfgets(hdr3, sizeof(hdr3), fp) == NULL) + if (!dmReadPPMHeader(fp, hdr1, sizeof(hdr1)) || + !dmReadPPMHeader(fp, hdr2, sizeof(hdr2)) || + !dmReadPPMHeader(fp, hdr3, sizeof(hdr3))) { res = dmError(DMERR_FREAD, "PPM: Could not read image header data.\n"); @@ -875,8 +910,7 @@ { if (len > 32 && buf[0] == 'P' && - (buf[1] == '5' || buf[1] == '6') && - buf[2] == 0x0a && isdigit(buf[3])) + (buf[1] == '5' || buf[1] == '6')) return DM_PROBE_SCORE_MAX; return DM_PROBE_SCORE_FALSE;