1*a67afe4dSAndroid Build Coastguard Worker /* checksum-icc.c
2*a67afe4dSAndroid Build Coastguard Worker *
3*a67afe4dSAndroid Build Coastguard Worker * Copyright (c) 2013 John Cunningham Bowler
4*a67afe4dSAndroid Build Coastguard Worker *
5*a67afe4dSAndroid Build Coastguard Worker * This code is released under the libpng license.
6*a67afe4dSAndroid Build Coastguard Worker * For conditions of distribution and use, see the disclaimer
7*a67afe4dSAndroid Build Coastguard Worker * and license in png.h
8*a67afe4dSAndroid Build Coastguard Worker *
9*a67afe4dSAndroid Build Coastguard Worker * Generate crc32 and adler32 checksums of the given input files, used to
10*a67afe4dSAndroid Build Coastguard Worker * generate check-codes for use when matching ICC profiles within libpng.
11*a67afe4dSAndroid Build Coastguard Worker */
12*a67afe4dSAndroid Build Coastguard Worker
13*a67afe4dSAndroid Build Coastguard Worker #include <stdio.h>
14*a67afe4dSAndroid Build Coastguard Worker #include <zlib.h>
15*a67afe4dSAndroid Build Coastguard Worker
16*a67afe4dSAndroid Build Coastguard Worker static int
read_one_file(FILE * ip,const char * name)17*a67afe4dSAndroid Build Coastguard Worker read_one_file(FILE *ip, const char *name)
18*a67afe4dSAndroid Build Coastguard Worker {
19*a67afe4dSAndroid Build Coastguard Worker uLong length = 0;
20*a67afe4dSAndroid Build Coastguard Worker uLong a32 = adler32(0, NULL, 0);
21*a67afe4dSAndroid Build Coastguard Worker uLong c32 = crc32(0, NULL, 0);
22*a67afe4dSAndroid Build Coastguard Worker Byte header[132];
23*a67afe4dSAndroid Build Coastguard Worker
24*a67afe4dSAndroid Build Coastguard Worker for (;;)
25*a67afe4dSAndroid Build Coastguard Worker {
26*a67afe4dSAndroid Build Coastguard Worker int ch = getc(ip);
27*a67afe4dSAndroid Build Coastguard Worker Byte b;
28*a67afe4dSAndroid Build Coastguard Worker
29*a67afe4dSAndroid Build Coastguard Worker if (ch == EOF) break;
30*a67afe4dSAndroid Build Coastguard Worker
31*a67afe4dSAndroid Build Coastguard Worker b = (Byte)ch;
32*a67afe4dSAndroid Build Coastguard Worker
33*a67afe4dSAndroid Build Coastguard Worker if (length < sizeof header)
34*a67afe4dSAndroid Build Coastguard Worker header[length] = b;
35*a67afe4dSAndroid Build Coastguard Worker
36*a67afe4dSAndroid Build Coastguard Worker ++length;
37*a67afe4dSAndroid Build Coastguard Worker a32 = adler32(a32, &b, 1);
38*a67afe4dSAndroid Build Coastguard Worker c32 = crc32(c32, &b, 1);
39*a67afe4dSAndroid Build Coastguard Worker }
40*a67afe4dSAndroid Build Coastguard Worker
41*a67afe4dSAndroid Build Coastguard Worker if (ferror(ip))
42*a67afe4dSAndroid Build Coastguard Worker return 0;
43*a67afe4dSAndroid Build Coastguard Worker
44*a67afe4dSAndroid Build Coastguard Worker /* Success */
45*a67afe4dSAndroid Build Coastguard Worker printf("PNG_ICC_CHECKSUM(0x%8.8lx, 0x%8.8lx,\n PNG_MD5("
46*a67afe4dSAndroid Build Coastguard Worker "0x%2.2x%2.2x%2.2x%2.2x, 0x%2.2x%2.2x%2.2x%2.2x, 0x%2.2x%2.2x%2.2x%2.2x,"
47*a67afe4dSAndroid Build Coastguard Worker " 0x%2.2x%2.2x%2.2x%2.2x), %d,\n"
48*a67afe4dSAndroid Build Coastguard Worker " \"%4.4d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d\", %lu, \"%s\")\n",
49*a67afe4dSAndroid Build Coastguard Worker (unsigned long)a32, (unsigned long)c32,
50*a67afe4dSAndroid Build Coastguard Worker header[84], header[85], header[86], header[87],
51*a67afe4dSAndroid Build Coastguard Worker header[88], header[89], header[90], header[91],
52*a67afe4dSAndroid Build Coastguard Worker header[92], header[93], header[94], header[95],
53*a67afe4dSAndroid Build Coastguard Worker header[96], header[97], header[98], header[99],
54*a67afe4dSAndroid Build Coastguard Worker # define u16(x) (header[x] * 256 + header[x+1])
55*a67afe4dSAndroid Build Coastguard Worker # define u32(x) (u16(x) * 65536 + u16(x+2))
56*a67afe4dSAndroid Build Coastguard Worker u32(64), u16(24), u16(26), u16(28), u16(30), u16(32), u16(34),
57*a67afe4dSAndroid Build Coastguard Worker (unsigned long)length, name);
58*a67afe4dSAndroid Build Coastguard Worker
59*a67afe4dSAndroid Build Coastguard Worker return 1;
60*a67afe4dSAndroid Build Coastguard Worker }
61*a67afe4dSAndroid Build Coastguard Worker
main(int argc,char ** argv)62*a67afe4dSAndroid Build Coastguard Worker int main(int argc, char **argv)
63*a67afe4dSAndroid Build Coastguard Worker {
64*a67afe4dSAndroid Build Coastguard Worker int err = 0;
65*a67afe4dSAndroid Build Coastguard Worker
66*a67afe4dSAndroid Build Coastguard Worker printf("/* adler32, crc32, MD5[16], intent, date, length, file-name */\n");
67*a67afe4dSAndroid Build Coastguard Worker
68*a67afe4dSAndroid Build Coastguard Worker if (argc > 1)
69*a67afe4dSAndroid Build Coastguard Worker {
70*a67afe4dSAndroid Build Coastguard Worker int i;
71*a67afe4dSAndroid Build Coastguard Worker
72*a67afe4dSAndroid Build Coastguard Worker for (i=1; i<argc; ++i)
73*a67afe4dSAndroid Build Coastguard Worker {
74*a67afe4dSAndroid Build Coastguard Worker FILE *ip = fopen(argv[i], "rb");
75*a67afe4dSAndroid Build Coastguard Worker
76*a67afe4dSAndroid Build Coastguard Worker if (ip == NULL || !read_one_file(ip, argv[i]))
77*a67afe4dSAndroid Build Coastguard Worker {
78*a67afe4dSAndroid Build Coastguard Worker err = 1;
79*a67afe4dSAndroid Build Coastguard Worker perror(argv[i]);
80*a67afe4dSAndroid Build Coastguard Worker fprintf(stderr, "%s: read error\n", argv[i]);
81*a67afe4dSAndroid Build Coastguard Worker printf("/* ERROR: %s */\n", argv[i]);
82*a67afe4dSAndroid Build Coastguard Worker }
83*a67afe4dSAndroid Build Coastguard Worker
84*a67afe4dSAndroid Build Coastguard Worker (void)fclose(ip);
85*a67afe4dSAndroid Build Coastguard Worker }
86*a67afe4dSAndroid Build Coastguard Worker }
87*a67afe4dSAndroid Build Coastguard Worker
88*a67afe4dSAndroid Build Coastguard Worker else
89*a67afe4dSAndroid Build Coastguard Worker {
90*a67afe4dSAndroid Build Coastguard Worker if (!read_one_file(stdin, "-"))
91*a67afe4dSAndroid Build Coastguard Worker {
92*a67afe4dSAndroid Build Coastguard Worker err = 1;
93*a67afe4dSAndroid Build Coastguard Worker perror("stdin");
94*a67afe4dSAndroid Build Coastguard Worker fprintf(stderr, "stdin: read error\n");
95*a67afe4dSAndroid Build Coastguard Worker printf("/* ERROR: stdin */\n");
96*a67afe4dSAndroid Build Coastguard Worker }
97*a67afe4dSAndroid Build Coastguard Worker }
98*a67afe4dSAndroid Build Coastguard Worker
99*a67afe4dSAndroid Build Coastguard Worker return err;
100*a67afe4dSAndroid Build Coastguard Worker }
101