comparison tools/libgfx.c @ 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 0905b2a87cbd
comparison
equal deleted inserted replaced
2100:81fb21dd3265 2101:da886b8cbb09
804 // Write image data 804 // Write image data
805 return dmWriteImageData(img, (void *) fp, dmWritePPMRow, &tmpSpec); 805 return dmWriteImageData(img, (void *) fp, dmWritePPMRow, &tmpSpec);
806 } 806 }
807 807
808 808
809 // Read a PPM/PGM/PNM header line, skipping comments
810 static BOOL dmReadPPMHeader(DMResource *fp, char *buf, const size_t bufLen)
811 {
812 BOOL end = FALSE, comment = FALSE;
813 size_t offs = 0;
814
815 do
816 {
817 int ch = dmfgetc(fp);
818 if (ch == EOF)
819 return FALSE;
820 else
821 if (ch == '#')
822 comment = TRUE;
823 else
824 if (ch == '\n')
825 {
826 if (!comment)
827 end = TRUE;
828 else
829 comment = FALSE;
830 }
831 else
832 if (!comment)
833 {
834 if (offs < bufLen - 1)
835 buf[offs++] = ch;
836 }
837 } while (!end);
838
839 buf[offs] = 0;
840 return TRUE;
841 }
842
843
809 int dmReadPPMImage(DMResource *fp, DMImage **pimg) 844 int dmReadPPMImage(DMResource *fp, DMImage **pimg)
810 { 845 {
811 DMImage *img = NULL; 846 DMImage *img = NULL;
812 unsigned int width, height; 847 unsigned int width, height;
813 int itype, res = DMERR_OK; 848 int itype, res = DMERR_OK;
814 char hdr1[8], hdr2[32], hdr3[16]; 849 char hdr1[8], hdr2[32], hdr3[16];
815 850
816 // Read PPM header 851 // Read PPM header
817 if (dmfgets(hdr1, sizeof(hdr1), fp) == NULL || 852 if (!dmReadPPMHeader(fp, hdr1, sizeof(hdr1)) ||
818 dmfgets(hdr2, sizeof(hdr2), fp) == NULL || 853 !dmReadPPMHeader(fp, hdr2, sizeof(hdr2)) ||
819 dmfgets(hdr3, sizeof(hdr3), fp) == NULL) 854 !dmReadPPMHeader(fp, hdr3, sizeof(hdr3)))
820 { 855 {
821 res = dmError(DMERR_FREAD, 856 res = dmError(DMERR_FREAD,
822 "PPM: Could not read image header data.\n"); 857 "PPM: Could not read image header data.\n");
823 goto error; 858 goto error;
824 } 859 }
873 908
874 static int fmtProbePPM(const Uint8 *buf, const size_t len) 909 static int fmtProbePPM(const Uint8 *buf, const size_t len)
875 { 910 {
876 if (len > 32 && 911 if (len > 32 &&
877 buf[0] == 'P' && 912 buf[0] == 'P' &&
878 (buf[1] == '5' || buf[1] == '6') && 913 (buf[1] == '5' || buf[1] == '6'))
879 buf[2] == 0x0a && isdigit(buf[3]))
880 return DM_PROBE_SCORE_MAX; 914 return DM_PROBE_SCORE_MAX;
881 915
882 return DM_PROBE_SCORE_FALSE; 916 return DM_PROBE_SCORE_FALSE;
883 } 917 }
884 918