#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include <math.h> /* Do not modify write_pgm() or read_pgm() */ int write_pgm(char *file, void *image, uint32_t x, uint32_t y) { FILE *o; if (!(o = fopen(file, "w"))) { perror(file); return -1; } fprintf(o, "P5\n%u %u\n255\n", x, y); /* Assume input data is correctly formatted. * * There's no way to handle it, otherwise. */ if (fwrite(image, 1, x * y, o) != (x * y)) { perror("fwrite"); fclose(o); return -1; } fclose(o); return 0; } /* A better implementation of this function would read the image dimensions * * from the input and allocate the storage, setting x and y so that the * * user can determine the size of the file at runtime. In order to * * minimize complication, I've written this version to require the user to * * know the size of the image in advance. */ int read_pgm(char *file, void *image, uint32_t x, uint32_t y) { FILE *f; char s[80]; unsigned i, j; if (!(f = fopen(file, "r"))) { perror(file); return -1; } if (!fgets(s, 80, f) || strncmp(s, "P5", 2)) { fprintf(stderr, "Expected P6\n"); return -1; } /* Eat comments */ do { fgets(s, 80, f); } while (s[0] == '#'); if (sscanf(s, "%u %u", &i, &j) != 2 || i != x || j != y) { fprintf(stderr, "Expected x and y dimensions %u %u\n", x, y); fclose(f); return -1; } /* Eat comments */ do { fgets(s, 80, f); } while (s[0] == '#'); if (strncmp(s, "255", 3)) { fprintf(stderr, "Expected 255\n"); fclose(f); return -1; } if (fread(image, 1, x * y, f) != x * y) { perror("fread"); fclose(f); return -1; } fclose(f); return 0; } int main(int argc, char *argv[]) { uint8_t image[1024][1024]; uint8_t image2[1024][1024]; read_pgm(argv[1], image, 1024, 1024); read_pgm(argv[2], image2, 1024, 1024); int i, j; int count = 0; for (i = 0; i < 1024; i++) { for (j = 0; j < 1024; j++) { if (image[i][j] != image2[i][j]) { printf("i: %d j: %d ::::: %d %d\n", i, j, (int)image[i][j], (int)image2[i][j]); count++; } } } printf("Count: %d\n", count); return 0; }