1
/*
2
 * adler32.c (c) 2006 Bjorn Lindeijer
3
 * License: GPL, v2 or later
4
 *
5
 * Calculates Adler-32 checksums for all files passed as argument.
6
 *
7
 *  Usage: adler32 [file]...
8
 */
9
10
#include <stdlib.h>
11
#include <stdio.h>
12
#include <zlib.h>
13
14
/**
15
 * Calculates the Adler-32 checksum for the given file.
16
 */
17
unsigned long fadler32(FILE *file)
18
{
19
    // Obtain file size
20
    fseek(file, 0, SEEK_END);
21
    long fileSize = ftell(file);
22
    rewind(file);
23
24
    // Calculate Adler-32 checksum
25
    char *buffer = (char*) malloc(fileSize);
26
    fread(buffer, 1, fileSize, file);
27
    unsigned long adler = adler32(0L, Z_NULL, 0);
28
    adler = adler32(adler, (Bytef*) buffer, fileSize);
29
    free(buffer);
30
31
    return adler;
32
}
33
34
/**
35
 * Prints out usage and exists.
36
 */
37
void print_usage()
38
{
39
    printf("Usage: adler32 [file]...\n");
40
    exit(0);
41
}
42
43
int main(int argc, char *argv[])
44
{
45
    int i;                            /**< Loops through arguments. */
46
47
    if (argc == 1)
48
    {
49
        print_usage();
50
    }
51
52
    for (i = 1; i < argc; ++i)
53
    {
54
        FILE *file = fopen(argv[i], "r");
55
56
        if (!file)
57
        {
58
            printf("Error while opening '%s' for reading!\n", argv[i]);
59
            exit(1);
60
        }
61
62
        unsigned long adler = fadler32(file);
63
        printf("%s %lx\n", argv[i], adler);
64
        fclose(file);
65
    }
66
67
    return 0;
68
}