xref: /haiku/src/bin/unzip/crctab.c (revision 17049c451a91f427aec94b944b75876b611103e7)
1*17049c45SAxel Dörfler /*
2*17049c45SAxel Dörfler   Copyright (c) 1990-2000 Info-ZIP.  All rights reserved.
3*17049c45SAxel Dörfler 
4*17049c45SAxel Dörfler   See the accompanying file LICENSE, version 2000-Apr-09 or later
5*17049c45SAxel Dörfler   (the contents of which are also included in zip.h) for terms of use.
6*17049c45SAxel Dörfler   If, for some reason, all these files are missing, the Info-ZIP license
7*17049c45SAxel Dörfler   also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html
8*17049c45SAxel Dörfler */
9*17049c45SAxel Dörfler /* crctab.c -- supply the CRC table needed for CRC-32 calculations.
10*17049c45SAxel Dörfler  * Copyright (C) 1995 Mark Adler
11*17049c45SAxel Dörfler  * For conditions of distribution and use, see copyright notice in zlib.h
12*17049c45SAxel Dörfler  */
13*17049c45SAxel Dörfler 
14*17049c45SAxel Dörfler /* $Id: crctab.c,v 1.1 2002/09/21 14:54:45 darkwyrm Exp $ */
15*17049c45SAxel Dörfler 
16*17049c45SAxel Dörfler /*
17*17049c45SAxel Dörfler   Generate a table for a byte-wise 32-bit CRC calculation on the polynomial:
18*17049c45SAxel 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.
19*17049c45SAxel Dörfler 
20*17049c45SAxel Dörfler   Polynomials over GF(2) are represented in binary, one bit per coefficient,
21*17049c45SAxel Dörfler   with the lowest powers in the most significant bit.  Then adding polynomials
22*17049c45SAxel Dörfler   is just exclusive-or, and multiplying a polynomial by x is a right shift by
23*17049c45SAxel Dörfler   one.  If we call the above polynomial p, and represent a byte as the
24*17049c45SAxel Dörfler   polynomial q, also with the lowest power in the most significant bit (so the
25*17049c45SAxel Dörfler   byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
26*17049c45SAxel Dörfler   where a mod b means the remainder after dividing a by b.
27*17049c45SAxel Dörfler 
28*17049c45SAxel Dörfler   This calculation is done using the shift-register method of multiplying and
29*17049c45SAxel Dörfler   taking the remainder.  The register is initialized to zero, and for each
30*17049c45SAxel Dörfler   incoming bit, x^32 is added mod p to the register if the bit is a one (where
31*17049c45SAxel Dörfler   x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
32*17049c45SAxel Dörfler   x (which is shifting right by one and adding x^32 mod p if the bit shifted
33*17049c45SAxel Dörfler   out is a one).  We start with the highest power (least significant bit) of
34*17049c45SAxel Dörfler   q and repeat for all eight bits of q.
35*17049c45SAxel Dörfler 
36*17049c45SAxel Dörfler   The table is simply the CRC of all possible eight bit values.  This is all
37*17049c45SAxel Dörfler   the information needed to generate CRC's on data a byte at a time for all
38*17049c45SAxel Dörfler   combinations of CRC register values and incoming bytes.
39*17049c45SAxel Dörfler */
40*17049c45SAxel Dörfler 
41*17049c45SAxel Dörfler #define __CRCTAB_C      /* identifies this source module */
42*17049c45SAxel Dörfler 
43*17049c45SAxel Dörfler #include "zip.h"
44*17049c45SAxel Dörfler 
45*17049c45SAxel Dörfler #if (!defined(USE_ZLIB) || defined(USE_OWN_CRCTAB))
46*17049c45SAxel Dörfler 
47*17049c45SAxel Dörfler #ifndef ZCONST
48*17049c45SAxel Dörfler #  define ZCONST const
49*17049c45SAxel Dörfler #endif
50*17049c45SAxel Dörfler 
51*17049c45SAxel Dörfler #ifdef DYNAMIC_CRC_TABLE
52*17049c45SAxel Dörfler 
53*17049c45SAxel Dörfler /* =========================================================================
54*17049c45SAxel Dörfler  * Make the crc table. This function is needed only if you want to compute
55*17049c45SAxel Dörfler  * the table dynamically.
56*17049c45SAxel Dörfler  */
57*17049c45SAxel Dörfler 
58*17049c45SAxel Dörfler local void make_crc_table OF((void));
59*17049c45SAxel Dörfler 
60*17049c45SAxel Dörfler #if (defined(DYNALLOC_CRCTAB) && defined(REENTRANT))
61*17049c45SAxel Dörfler    error: Dynamic allocation of CRC table not safe with reentrant code.
62*17049c45SAxel Dörfler #endif /* DYNALLOC_CRCTAB && REENTRANT */
63*17049c45SAxel Dörfler 
64*17049c45SAxel Dörfler #ifdef DYNALLOC_CRCTAB
65*17049c45SAxel Dörfler    local ulg near *crc_table = NULL;
66*17049c45SAxel Dörfler # if 0          /* not used, since sizeof("near *") <= sizeof(int) */
67*17049c45SAxel Dörfler    /* Use this section when access to a "local int" is faster than access to
68*17049c45SAxel Dörfler       a "local pointer" (e.g.: i86 16bit code with far pointers). */
69*17049c45SAxel Dörfler    local int crc_table_empty = 1;
70*17049c45SAxel Dörfler #  define CRC_TABLE_IS_EMPTY    (crc_table_empty != 0)
71*17049c45SAxel Dörfler #  define MARK_CRCTAB_FILLED    crc_table_empty = 0
72*17049c45SAxel Dörfler #  define MARK_CRCTAB_EMPTY     crc_table_empty = 1
73*17049c45SAxel Dörfler # else
74*17049c45SAxel Dörfler    /* Use this section on systems where the size of pointers and ints is
75*17049c45SAxel Dörfler       equal (e.g.: all 32bit systems). */
76*17049c45SAxel Dörfler #  define CRC_TABLE_IS_EMPTY    (crc_table == NULL)
77*17049c45SAxel Dörfler #  define MARK_CRCTAB_FILLED    crc_table = crctab_p
78*17049c45SAxel Dörfler #  define MARK_CRCTAB_EMPTY     crc_table = NULL
79*17049c45SAxel Dörfler # endif
80*17049c45SAxel Dörfler #else /* !DYNALLOC_CRCTAB */
81*17049c45SAxel Dörfler    local ulg near crc_table[256];
82*17049c45SAxel Dörfler    local int crc_table_empty = 1;
83*17049c45SAxel Dörfler #  define CRC_TABLE_IS_EMPTY    (crc_table_empty != 0)
84*17049c45SAxel Dörfler #  define MARK_CRCTAB_FILLED    crc_table_empty = 0
85*17049c45SAxel Dörfler #endif /* ?DYNALLOC_CRCTAB */
86*17049c45SAxel Dörfler 
87*17049c45SAxel Dörfler 
88*17049c45SAxel Dörfler local void make_crc_table()
89*17049c45SAxel Dörfler {
90*17049c45SAxel Dörfler   ulg c;                /* crc shift register */
91*17049c45SAxel Dörfler   int n;                /* counter for all possible eight bit values */
92*17049c45SAxel Dörfler   int k;                /* byte being shifted into crc apparatus */
93*17049c45SAxel Dörfler #ifdef DYNALLOC_CRCTAB
94*17049c45SAxel Dörfler   ulg near *crctab_p;   /* temporary pointer to allocated crc_table area */
95*17049c45SAxel Dörfler #else /* !DYNALLOC_CRCTAB */
96*17049c45SAxel Dörfler # define crctab_p crc_table
97*17049c45SAxel Dörfler #endif /* DYNALLOC_CRCTAB */
98*17049c45SAxel Dörfler 
99*17049c45SAxel Dörfler #ifdef COMPUTE_XOR_PATTERN
100*17049c45SAxel Dörfler   /* This piece of code has been left here to explain how the XOR pattern
101*17049c45SAxel Dörfler    * used in the creation of the crc_table values can be recomputed.
102*17049c45SAxel Dörfler    * For production versions of this function, it is more efficient to
103*17049c45SAxel Dörfler    * supply the resultant pattern at compile time.
104*17049c45SAxel Dörfler    */
105*17049c45SAxel Dörfler   ulg xor;              /* polynomial exclusive-or pattern */
106*17049c45SAxel Dörfler   /* terms of polynomial defining this crc (except x^32): */
107*17049c45SAxel Dörfler   static uch p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
108*17049c45SAxel Dörfler 
109*17049c45SAxel Dörfler   /* make exclusive-or pattern from polynomial (0xedb88320L) */
110*17049c45SAxel Dörfler   xor = 0L;
111*17049c45SAxel Dörfler   for (i = 0; i < sizeof(p)/sizeof(uch); i++)
112*17049c45SAxel Dörfler     xor |= 1L << (31 - p[i]);
113*17049c45SAxel Dörfler #else
114*17049c45SAxel Dörfler # define xor 0xedb88320L
115*17049c45SAxel Dörfler #endif
116*17049c45SAxel Dörfler 
117*17049c45SAxel Dörfler #ifdef DYNALLOC_CRCTAB
118*17049c45SAxel Dörfler   crctab_p = (ulg near *) nearmalloc (256*sizeof(ulg));
119*17049c45SAxel Dörfler   if (crctab_p == NULL) {
120*17049c45SAxel Dörfler     ziperr(ZE_MEM, "crc_table allocation");
121*17049c45SAxel Dörfler   }
122*17049c45SAxel Dörfler #endif /* DYNALLOC_CRCTAB */
123*17049c45SAxel Dörfler 
124*17049c45SAxel Dörfler   for (n = 0; n < 256; n++) {
125*17049c45SAxel Dörfler     c = (ulg)n;
126*17049c45SAxel Dörfler     for (k = 8; k; k--)
127*17049c45SAxel Dörfler       c = c & 1 ? xor ^ (c >> 1) : c >> 1;
128*17049c45SAxel Dörfler     crctab_p[n] = c;
129*17049c45SAxel Dörfler   }
130*17049c45SAxel Dörfler   MARK_CRCTAB_FILLED;
131*17049c45SAxel Dörfler }
132*17049c45SAxel Dörfler 
133*17049c45SAxel Dörfler #else /* !DYNAMIC_CRC_TABLE */
134*17049c45SAxel Dörfler 
135*17049c45SAxel Dörfler #ifdef DYNALLOC_CRCTAB
136*17049c45SAxel Dörfler    error: Inconsistent flags, DYNALLOC_CRCTAB without DYNAMIC_CRC_TABLE.
137*17049c45SAxel Dörfler #endif
138*17049c45SAxel Dörfler 
139*17049c45SAxel Dörfler /* ========================================================================
140*17049c45SAxel Dörfler  * Table of CRC-32's of all single-byte values (made by make_crc_table)
141*17049c45SAxel Dörfler  */
142*17049c45SAxel Dörfler local ZCONST ulg near crc_table[256] = {
143*17049c45SAxel Dörfler   0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
144*17049c45SAxel Dörfler   0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
145*17049c45SAxel Dörfler   0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
146*17049c45SAxel Dörfler   0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
147*17049c45SAxel Dörfler   0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
148*17049c45SAxel Dörfler   0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
149*17049c45SAxel Dörfler   0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
150*17049c45SAxel Dörfler   0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
151*17049c45SAxel Dörfler   0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
152*17049c45SAxel Dörfler   0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
153*17049c45SAxel Dörfler   0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
154*17049c45SAxel Dörfler   0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
155*17049c45SAxel Dörfler   0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
156*17049c45SAxel Dörfler   0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
157*17049c45SAxel Dörfler   0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
158*17049c45SAxel Dörfler   0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
159*17049c45SAxel Dörfler   0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
160*17049c45SAxel Dörfler   0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
161*17049c45SAxel Dörfler   0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
162*17049c45SAxel Dörfler   0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
163*17049c45SAxel Dörfler   0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
164*17049c45SAxel Dörfler   0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
165*17049c45SAxel Dörfler   0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
166*17049c45SAxel Dörfler   0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
167*17049c45SAxel Dörfler   0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
168*17049c45SAxel Dörfler   0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
169*17049c45SAxel Dörfler   0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
170*17049c45SAxel Dörfler   0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
171*17049c45SAxel Dörfler   0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
172*17049c45SAxel Dörfler   0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
173*17049c45SAxel Dörfler   0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
174*17049c45SAxel Dörfler   0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
175*17049c45SAxel Dörfler   0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
176*17049c45SAxel Dörfler   0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
177*17049c45SAxel Dörfler   0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
178*17049c45SAxel Dörfler   0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
179*17049c45SAxel Dörfler   0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
180*17049c45SAxel Dörfler   0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
181*17049c45SAxel Dörfler   0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
182*17049c45SAxel Dörfler   0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
183*17049c45SAxel Dörfler   0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
184*17049c45SAxel Dörfler   0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
185*17049c45SAxel Dörfler   0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
186*17049c45SAxel Dörfler   0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
187*17049c45SAxel Dörfler   0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
188*17049c45SAxel Dörfler   0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
189*17049c45SAxel Dörfler   0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
190*17049c45SAxel Dörfler   0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
191*17049c45SAxel Dörfler   0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
192*17049c45SAxel Dörfler   0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
193*17049c45SAxel Dörfler   0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
194*17049c45SAxel Dörfler   0x2d02ef8dL
195*17049c45SAxel Dörfler };
196*17049c45SAxel Dörfler #endif /* ?DYNAMIC_CRC_TABLE */
197*17049c45SAxel Dörfler 
198*17049c45SAxel Dörfler /* use "OF((void))" here to work around a Borland TC++ 1.0 problem */
199*17049c45SAxel Dörfler #ifdef USE_ZLIB
200*17049c45SAxel Dörfler ZCONST uLongf *get_crc_table OF((void))
201*17049c45SAxel Dörfler #else
202*17049c45SAxel Dörfler ZCONST ulg near *get_crc_table OF((void))
203*17049c45SAxel Dörfler #endif
204*17049c45SAxel Dörfler {
205*17049c45SAxel Dörfler #ifdef DYNAMIC_CRC_TABLE
206*17049c45SAxel Dörfler   if (CRC_TABLE_IS_EMPTY)
207*17049c45SAxel Dörfler     make_crc_table();
208*17049c45SAxel Dörfler #endif
209*17049c45SAxel Dörfler #ifdef USE_ZLIB
210*17049c45SAxel Dörfler   return (ZCONST uLongf *)crc_table;
211*17049c45SAxel Dörfler #else
212*17049c45SAxel Dörfler   return (ZCONST ulg near *)crc_table;
213*17049c45SAxel Dörfler #endif
214*17049c45SAxel Dörfler }
215*17049c45SAxel Dörfler 
216*17049c45SAxel Dörfler #ifdef DYNALLOC_CRCTAB
217*17049c45SAxel Dörfler void free_crc_table()
218*17049c45SAxel Dörfler {
219*17049c45SAxel Dörfler   if (!CRC_TABLE_IS_EMPTY)
220*17049c45SAxel Dörfler   {
221*17049c45SAxel Dörfler     nearfree((ulg near *)crc_table);
222*17049c45SAxel Dörfler     MARK_CRCTAB_EMPTY;
223*17049c45SAxel Dörfler   }
224*17049c45SAxel Dörfler }
225*17049c45SAxel Dörfler #endif
226*17049c45SAxel Dörfler 
227*17049c45SAxel Dörfler #endif /* !USE_ZLIB || USE_OWN_CRCTAB */
228