117049c45SAxel Dörfler /*
217049c45SAxel Dörfler Copyright (c) 1990-2000 Info-ZIP. All rights reserved.
317049c45SAxel Dörfler
417049c45SAxel Dörfler See the accompanying file LICENSE, version 2000-Apr-09 or later
517049c45SAxel Dörfler (the contents of which are also included in zip.h) for terms of use.
617049c45SAxel Dörfler If, for some reason, all these files are missing, the Info-ZIP license
717049c45SAxel Dörfler also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
817049c45SAxel Dörfler */
917049c45SAxel Dörfler /* crctab.c -- supply the CRC table needed for CRC-32 calculations.
1017049c45SAxel Dörfler * Copyright (C) 1995 Mark Adler
1117049c45SAxel Dörfler * For conditions of distribution and use, see copyright notice in zlib.h
1217049c45SAxel Dörfler */
1317049c45SAxel Dörfler
14*571d840aSOliver Tappe /* $Id: crctab.c 1101 2002-09-21 14:54:45Z darkwyrm $ */
1517049c45SAxel Dörfler
1617049c45SAxel Dörfler /*
1717049c45SAxel Dörfler Generate a table for a byte-wise 32-bit CRC calculation on the polynomial:
1817049c45SAxel Dörfler x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
1917049c45SAxel Dörfler
2017049c45SAxel Dörfler Polynomials over GF(2) are represented in binary, one bit per coefficient,
2117049c45SAxel Dörfler with the lowest powers in the most significant bit. Then adding polynomials
2217049c45SAxel Dörfler is just exclusive-or, and multiplying a polynomial by x is a right shift by
2317049c45SAxel Dörfler one. If we call the above polynomial p, and represent a byte as the
2417049c45SAxel Dörfler polynomial q, also with the lowest power in the most significant bit (so the
2517049c45SAxel Dörfler byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
2617049c45SAxel Dörfler where a mod b means the remainder after dividing a by b.
2717049c45SAxel Dörfler
2817049c45SAxel Dörfler This calculation is done using the shift-register method of multiplying and
2917049c45SAxel Dörfler taking the remainder. The register is initialized to zero, and for each
3017049c45SAxel Dörfler incoming bit, x^32 is added mod p to the register if the bit is a one (where
3117049c45SAxel Dörfler x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
3217049c45SAxel Dörfler x (which is shifting right by one and adding x^32 mod p if the bit shifted
3317049c45SAxel Dörfler out is a one). We start with the highest power (least significant bit) of
3417049c45SAxel Dörfler q and repeat for all eight bits of q.
3517049c45SAxel Dörfler
3617049c45SAxel Dörfler The table is simply the CRC of all possible eight bit values. This is all
3717049c45SAxel Dörfler the information needed to generate CRC's on data a byte at a time for all
3817049c45SAxel Dörfler combinations of CRC register values and incoming bytes.
3917049c45SAxel Dörfler */
4017049c45SAxel Dörfler
4117049c45SAxel Dörfler #define __CRCTAB_C /* identifies this source module */
4217049c45SAxel Dörfler
4317049c45SAxel Dörfler #include "zip.h"
4417049c45SAxel Dörfler
4517049c45SAxel Dörfler #if (!defined(USE_ZLIB) || defined(USE_OWN_CRCTAB))
4617049c45SAxel Dörfler
4717049c45SAxel Dörfler #ifndef ZCONST
4817049c45SAxel Dörfler # define ZCONST const
4917049c45SAxel Dörfler #endif
5017049c45SAxel Dörfler
5117049c45SAxel Dörfler #ifdef DYNAMIC_CRC_TABLE
5217049c45SAxel Dörfler
5317049c45SAxel Dörfler /* =========================================================================
5417049c45SAxel Dörfler * Make the crc table. This function is needed only if you want to compute
5517049c45SAxel Dörfler * the table dynamically.
5617049c45SAxel Dörfler */
5717049c45SAxel Dörfler
5817049c45SAxel Dörfler local void make_crc_table OF((void));
5917049c45SAxel Dörfler
6017049c45SAxel Dörfler #if (defined(DYNALLOC_CRCTAB) && defined(REENTRANT))
6117049c45SAxel Dörfler error: Dynamic allocation of CRC table not safe with reentrant code.
6217049c45SAxel Dörfler #endif /* DYNALLOC_CRCTAB && REENTRANT */
6317049c45SAxel Dörfler
6417049c45SAxel Dörfler #ifdef DYNALLOC_CRCTAB
6517049c45SAxel Dörfler local ulg near *crc_table = NULL;
6617049c45SAxel Dörfler # if 0 /* not used, since sizeof("near *") <= sizeof(int) */
6717049c45SAxel Dörfler /* Use this section when access to a "local int" is faster than access to
6817049c45SAxel Dörfler a "local pointer" (e.g.: i86 16bit code with far pointers). */
6917049c45SAxel Dörfler local int crc_table_empty = 1;
7017049c45SAxel Dörfler # define CRC_TABLE_IS_EMPTY (crc_table_empty != 0)
7117049c45SAxel Dörfler # define MARK_CRCTAB_FILLED crc_table_empty = 0
7217049c45SAxel Dörfler # define MARK_CRCTAB_EMPTY crc_table_empty = 1
7317049c45SAxel Dörfler # else
7417049c45SAxel Dörfler /* Use this section on systems where the size of pointers and ints is
7517049c45SAxel Dörfler equal (e.g.: all 32bit systems). */
7617049c45SAxel Dörfler # define CRC_TABLE_IS_EMPTY (crc_table == NULL)
7717049c45SAxel Dörfler # define MARK_CRCTAB_FILLED crc_table = crctab_p
7817049c45SAxel Dörfler # define MARK_CRCTAB_EMPTY crc_table = NULL
7917049c45SAxel Dörfler # endif
8017049c45SAxel Dörfler #else /* !DYNALLOC_CRCTAB */
8117049c45SAxel Dörfler local ulg near crc_table[256];
8217049c45SAxel Dörfler local int crc_table_empty = 1;
8317049c45SAxel Dörfler # define CRC_TABLE_IS_EMPTY (crc_table_empty != 0)
8417049c45SAxel Dörfler # define MARK_CRCTAB_FILLED crc_table_empty = 0
8517049c45SAxel Dörfler #endif /* ?DYNALLOC_CRCTAB */
8617049c45SAxel Dörfler
8717049c45SAxel Dörfler
make_crc_table()8817049c45SAxel Dörfler local void make_crc_table()
8917049c45SAxel Dörfler {
9017049c45SAxel Dörfler ulg c; /* crc shift register */
9117049c45SAxel Dörfler int n; /* counter for all possible eight bit values */
9217049c45SAxel Dörfler int k; /* byte being shifted into crc apparatus */
9317049c45SAxel Dörfler #ifdef DYNALLOC_CRCTAB
9417049c45SAxel Dörfler ulg near *crctab_p; /* temporary pointer to allocated crc_table area */
9517049c45SAxel Dörfler #else /* !DYNALLOC_CRCTAB */
9617049c45SAxel Dörfler # define crctab_p crc_table
9717049c45SAxel Dörfler #endif /* DYNALLOC_CRCTAB */
9817049c45SAxel Dörfler
9917049c45SAxel Dörfler #ifdef COMPUTE_XOR_PATTERN
10017049c45SAxel Dörfler /* This piece of code has been left here to explain how the XOR pattern
10117049c45SAxel Dörfler * used in the creation of the crc_table values can be recomputed.
10217049c45SAxel Dörfler * For production versions of this function, it is more efficient to
10317049c45SAxel Dörfler * supply the resultant pattern at compile time.
10417049c45SAxel Dörfler */
10517049c45SAxel Dörfler ulg xor; /* polynomial exclusive-or pattern */
10617049c45SAxel Dörfler /* terms of polynomial defining this crc (except x^32): */
10717049c45SAxel Dörfler static uch p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
10817049c45SAxel Dörfler
10917049c45SAxel Dörfler /* make exclusive-or pattern from polynomial (0xedb88320L) */
11017049c45SAxel Dörfler xor = 0L;
11117049c45SAxel Dörfler for (i = 0; i < sizeof(p)/sizeof(uch); i++)
11217049c45SAxel Dörfler xor |= 1L << (31 - p[i]);
11317049c45SAxel Dörfler #else
11417049c45SAxel Dörfler # define xor 0xedb88320L
11517049c45SAxel Dörfler #endif
11617049c45SAxel Dörfler
11717049c45SAxel Dörfler #ifdef DYNALLOC_CRCTAB
11817049c45SAxel Dörfler crctab_p = (ulg near *) nearmalloc (256*sizeof(ulg));
11917049c45SAxel Dörfler if (crctab_p == NULL) {
12017049c45SAxel Dörfler ziperr(ZE_MEM, "crc_table allocation");
12117049c45SAxel Dörfler }
12217049c45SAxel Dörfler #endif /* DYNALLOC_CRCTAB */
12317049c45SAxel Dörfler
12417049c45SAxel Dörfler for (n = 0; n < 256; n++) {
12517049c45SAxel Dörfler c = (ulg)n;
12617049c45SAxel Dörfler for (k = 8; k; k--)
12717049c45SAxel Dörfler c = c & 1 ? xor ^ (c >> 1) : c >> 1;
12817049c45SAxel Dörfler crctab_p[n] = c;
12917049c45SAxel Dörfler }
13017049c45SAxel Dörfler MARK_CRCTAB_FILLED;
13117049c45SAxel Dörfler }
13217049c45SAxel Dörfler
13317049c45SAxel Dörfler #else /* !DYNAMIC_CRC_TABLE */
13417049c45SAxel Dörfler
13517049c45SAxel Dörfler #ifdef DYNALLOC_CRCTAB
13617049c45SAxel Dörfler error: Inconsistent flags, DYNALLOC_CRCTAB without DYNAMIC_CRC_TABLE.
13717049c45SAxel Dörfler #endif
13817049c45SAxel Dörfler
13917049c45SAxel Dörfler /* ========================================================================
14017049c45SAxel Dörfler * Table of CRC-32's of all single-byte values (made by make_crc_table)
14117049c45SAxel Dörfler */
14217049c45SAxel Dörfler local ZCONST ulg near crc_table[256] = {
14317049c45SAxel Dörfler 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
14417049c45SAxel Dörfler 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
14517049c45SAxel Dörfler 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
14617049c45SAxel Dörfler 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
14717049c45SAxel Dörfler 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
14817049c45SAxel Dörfler 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
14917049c45SAxel Dörfler 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
15017049c45SAxel Dörfler 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
15117049c45SAxel Dörfler 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
15217049c45SAxel Dörfler 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
15317049c45SAxel Dörfler 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
15417049c45SAxel Dörfler 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
15517049c45SAxel Dörfler 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
15617049c45SAxel Dörfler 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
15717049c45SAxel Dörfler 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
15817049c45SAxel Dörfler 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
15917049c45SAxel Dörfler 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
16017049c45SAxel Dörfler 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
16117049c45SAxel Dörfler 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
16217049c45SAxel Dörfler 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
16317049c45SAxel Dörfler 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
16417049c45SAxel Dörfler 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
16517049c45SAxel Dörfler 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
16617049c45SAxel Dörfler 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
16717049c45SAxel Dörfler 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
16817049c45SAxel Dörfler 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
16917049c45SAxel Dörfler 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
17017049c45SAxel Dörfler 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
17117049c45SAxel Dörfler 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
17217049c45SAxel Dörfler 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
17317049c45SAxel Dörfler 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
17417049c45SAxel Dörfler 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
17517049c45SAxel Dörfler 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
17617049c45SAxel Dörfler 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
17717049c45SAxel Dörfler 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
17817049c45SAxel Dörfler 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
17917049c45SAxel Dörfler 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
18017049c45SAxel Dörfler 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
18117049c45SAxel Dörfler 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
18217049c45SAxel Dörfler 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
18317049c45SAxel Dörfler 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
18417049c45SAxel Dörfler 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
18517049c45SAxel Dörfler 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
18617049c45SAxel Dörfler 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
18717049c45SAxel Dörfler 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
18817049c45SAxel Dörfler 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
18917049c45SAxel Dörfler 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
19017049c45SAxel Dörfler 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
19117049c45SAxel Dörfler 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
19217049c45SAxel Dörfler 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
19317049c45SAxel Dörfler 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
19417049c45SAxel Dörfler 0x2d02ef8dL
19517049c45SAxel Dörfler };
19617049c45SAxel Dörfler #endif /* ?DYNAMIC_CRC_TABLE */
19717049c45SAxel Dörfler
19817049c45SAxel Dörfler /* use "OF((void))" here to work around a Borland TC++ 1.0 problem */
19917049c45SAxel Dörfler #ifdef USE_ZLIB
get_crc_table(void)20017049c45SAxel Dörfler ZCONST uLongf *get_crc_table OF((void))
20117049c45SAxel Dörfler #else
20217049c45SAxel Dörfler ZCONST ulg near *get_crc_table OF((void))
20317049c45SAxel Dörfler #endif
20417049c45SAxel Dörfler {
20517049c45SAxel Dörfler #ifdef DYNAMIC_CRC_TABLE
20617049c45SAxel Dörfler if (CRC_TABLE_IS_EMPTY)
20717049c45SAxel Dörfler make_crc_table();
20817049c45SAxel Dörfler #endif
20917049c45SAxel Dörfler #ifdef USE_ZLIB
21017049c45SAxel Dörfler return (ZCONST uLongf *)crc_table;
21117049c45SAxel Dörfler #else
21217049c45SAxel Dörfler return (ZCONST ulg near *)crc_table;
21317049c45SAxel Dörfler #endif
21417049c45SAxel Dörfler }
21517049c45SAxel Dörfler
21617049c45SAxel Dörfler #ifdef DYNALLOC_CRCTAB
free_crc_table()21717049c45SAxel Dörfler void free_crc_table()
21817049c45SAxel Dörfler {
21917049c45SAxel Dörfler if (!CRC_TABLE_IS_EMPTY)
22017049c45SAxel Dörfler {
22117049c45SAxel Dörfler nearfree((ulg near *)crc_table);
22217049c45SAxel Dörfler MARK_CRCTAB_EMPTY;
22317049c45SAxel Dörfler }
22417049c45SAxel Dörfler }
22517049c45SAxel Dörfler #endif
22617049c45SAxel Dörfler
22717049c45SAxel Dörfler #endif /* !USE_ZLIB || USE_OWN_CRCTAB */
228