changeset 2101:da886b8cbb09

Improve PPM/PGM/PNM probing and header parsing.
author Matti Hamalainen <ccr@tnsp.org>
date Wed, 06 Mar 2019 10:00:03 +0200
parents 81fb21dd3265
children e0281dae2cb8
files tools/libgfx.c
diffstat 1 files changed, 39 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- 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;