123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- /* checksum-icc.c
- *
- * Copyright (c) 2013 John Cunningham Bowler
- *
- * Last changed in libpng 1.6.0 [February 14, 2013]
- *
- * This code is released under the libpng license.
- * For conditions of distribution and use, see the disclaimer
- * and license in png.h
- *
- * Generate crc32 and adler32 checksums of the given input files, used to
- * generate check-codes for use when matching ICC profiles within libpng.
- */
- #include <stdio.h>
- #include <zlib.h>
- static int
- read_one_file(FILE *ip, const char *name)
- {
- uLong length = 0;
- uLong a32 = adler32(0, NULL, 0);
- uLong c32 = crc32(0, NULL, 0);
- Byte header[132];
- for (;;)
- {
- int ch = getc(ip);
- Byte b;
- if (ch == EOF) break;
- b = (Byte)ch;
- if (length < sizeof header)
- header[length] = b;
- ++length;
- a32 = adler32(a32, &b, 1);
- c32 = crc32(c32, &b, 1);
- }
- if (ferror(ip))
- return 0;
- /* Success */
- printf("PNG_ICC_CHECKSUM(0x%8.8lx, 0x%8.8lx,\n PNG_MD5("
- "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,"
- " 0x%2.2x%2.2x%2.2x%2.2x), %d,\n"
- " \"%4.4d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d\", %lu, \"%s\")\n",
- (unsigned long)a32, (unsigned long)c32,
- header[84], header[85], header[86], header[87],
- header[88], header[89], header[90], header[91],
- header[92], header[93], header[94], header[95],
- header[96], header[97], header[98], header[99],
- # define u16(x) (header[x] * 256 + header[x+1])
- # define u32(x) (u16(x) * 65536 + u16(x+2))
- u32(64), u16(24), u16(26), u16(28), u16(30), u16(32), u16(34),
- (unsigned long)length, name);
- return 1;
- }
- int main(int argc, char **argv)
- {
- int err = 0;
- printf("/* adler32, crc32, MD5[16], intent, date, length, file-name */\n");
- if (argc > 1)
- {
- int i;
- for (i=1; i<argc; ++i)
- {
- FILE *ip = fopen(argv[i], "rb");
- if (ip == NULL || !read_one_file(ip, argv[i]))
- {
- err = 1;
- perror(argv[i]);
- fprintf(stderr, "%s: read error\n", argv[i]);
- printf("/* ERROR: %s */\n", argv[i]);
- }
- (void)fclose(ip);
- }
- }
- else
- {
- if (!read_one_file(stdin, "-"))
- {
- err = 1;
- perror("stdin");
- fprintf(stderr, "stdin: read error\n");
- printf("/* ERROR: stdin */\n");
- }
- }
- return err;
- }
|