static int read_header (FILE *fp, const char *magic, int *width, int *height, int *maxval) { char m[3] = { 0 }; int ignored = fread (m, sizeof(m)-1, 1, fp); if (strcmp(m, magic)) { fprintf(stderr, "bad magic [%s]\n", m); return -1; } if (0 != skip_whitespace_and_comments(fp)) return -1; if (1 != fscanf(fp, "%d", width)) return -1; if (0 != skip_whitespace_and_comments(fp)) return -1; if (1 != fscanf(fp, "%d", height)) return -1; if (0 != skip_whitespace_and_comments(fp)) return -1; if (1 != fscanf(fp, "%d", maxval)) return -1; if (EOF == fgetc(fp)) return -1; return 0; }
int load_pnm_from_FILE(FILE *f, unsigned char ***pixels, int *width, int *height) { int maxval; char type; if (getc(f) != 'P') { fprintf(stderr, "PNM file not starts with 'P'\n"); exit(1); } type = getc(f); skip_whitespace_and_comments(f); switch(type) { case '4': fscanf(f, "%d %d", width, height); maxval = 255; break; case '5': case '6': fscanf(f, "%d %d %d", width, height, &maxval); break; default: fprintf(stderr, "only raw PNM files supported\n"); exit(1); } if (maxval != 255) { fprintf(stderr, "only 256-levels PNM supported\n"); exit(1); } switch(fgetc(f)) { case ' ': case '\t': case '\r': case '\n': break; default: fprintf(stderr, "corrupted PNM, current offset is %ld\n", ftell(f)); exit(1); } switch(type) { case '4': *pixels = allocate_bitmap(*width, *height); load_pbm_raster(f, *pixels, *width, *height); return PBM; case '5': *pixels = allocate_bitmap(*width, *height); fread(**pixels, *width, *height, f); return PGM; case '6': *pixels = allocate_bitmap(*width * 3, *height); fread(**pixels, *width * 3, *height, f); return PPM; default: assert(0); return 0; } }