/* * adler32.c (c) 2006 Bjorn Lindeijer * License: GPL, v2 or later * * Calculates Adler-32 checksums for all files passed as argument. * * Usage: adler32 [file]... */ #include #include #include /** * Calculates the Adler-32 checksum for the given file. */ unsigned long fadler32(FILE *file) { // Obtain file size fseek(file, 0, SEEK_END); long fileSize = ftell(file); rewind(file); // Calculate Adler-32 checksum char *buffer = (char*) malloc(fileSize); fread(buffer, 1, fileSize, file); unsigned long adler = adler32(0L, Z_NULL, 0); adler = adler32(adler, (Bytef*) buffer, fileSize); free(buffer); return adler; } /** * Prints out usage and exists. */ void print_usage() { printf("Usage: adler32 mode [file]...\n"); exit(0); } int main(int argc, char *argv[]) { int i; /**< Loops through arguments. */ if (argc < 2) { print_usage(); } int mode = atoi(argv[1]); for (i = 2; i < argc; ++i) { FILE *file = fopen(argv[i], "r"); if (!file) { printf("Error while opening '%s' for reading!\n", argv[i]); exit(1); } unsigned long adler = fadler32(file); switch (mode) { case 0: default: printf("%s %lx\n", argv[i], adler); break; case 1: printf("%lx", adler); break; } fclose(file); } return 0; }