Something went wrong on our end
-
Jake Feddersen authoredJake Feddersen authored
compare.c 2.23 KiB
#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;
}