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