mirror of
				https://git.code.sf.net/p/libpng/code.git
				synced 2025-07-10 18:04:09 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			103 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* 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;
 | |
| }
 | 
