diff options
Diffstat (limited to 'adler32.c')
-rw-r--r-- | adler32.c | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/adler32.c b/adler32.c new file mode 100644 index 0000000..7a1a5e7 --- /dev/null +++ b/adler32.c @@ -0,0 +1,98 @@ +/* + * 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 <stdlib.h> +#include <stdint.h> +#include <stdio.h> +//#include <zlib.h> + +const uint32_t MOD_ADLER = 65521; + +uint32_t adler32(unsigned char *data, size_t len) +/* + where data is the location of the data in physical memory and + len is the length of the data in bytes +*/ +{ + uint32_t a = 1, b = 0; + size_t index; + + // Process each byte of the data in order + for (index = 0; index < len; ++index) + { + a = (a + data[index]) % MOD_ADLER; + b = (b + a) % MOD_ADLER; + } + + return (b << 16) | a; +} + + +/** + * 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 + unsigned char *buffer = (unsigned char*) malloc(fileSize); + fread(buffer, 1, fileSize, file); + //unsigned long adler = adler32(0L, Z_NULL, 0); + //adler = adler32(adler, (Bytef*) buffer, fileSize); + unsigned long adler = adler32(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; +} |