1 /* crc32.c -- compute the CRC-32 of a data stream
2 * Copyright (C) 1995-2003 Mark Adler
3 * For conditions of distribution and use, see copyright notice in zlib.h
4 *
5 * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster
6 * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing
7 * tables for updating the shift register in one step with three exclusive-ors
8 * instead of four steps with four exclusive-ors. This results about a factor
9 * of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.
10 */
11
12 /* @(#) $Id$ */
13
14 #ifdef MAKECRCH
15 # include <stdio.h>
16 # ifndef DYNAMIC_CRC_TABLE
17 # define DYNAMIC_CRC_TABLE
18 # endif /* !DYNAMIC_CRC_TABLE */
19 #endif /* MAKECRCH */
20
21 #define local static
22 #define STDC
23 #define FAR
24 #define ZEXPORT
25 #define Z_NULL 0
26 #define OF(args) args
27 #include "crc32.h"
28
29 #ifndef _WIN32
30 #define ptrdiff_t long
31 #else
32 #include <stdlib.h>
33 #endif
34
35 /* Find a four-byte integer type for crc32_little() and crc32_big(). */
36 #ifndef NOBYFOUR
37 # ifdef STDC /* need ANSI C limits.h to determine sizes */
38 # include <limits.h>
39 # define BYFOUR
40 # if (UINT_MAX == 0xffffffffUL)
41 typedef unsigned int u4;
42 # else
43 # if (ULONG_MAX == 0xffffffffUL)
44 typedef unsigned long u4;
45 # else
46 # if (USHRT_MAX == 0xffffffffUL)
47 typedef unsigned short u4;
48 # else
49 # undef BYFOUR /* can't find a four-byte integer type! */
50 # endif
51 # endif
52 # endif
53 # endif /* STDC */
54 #endif /* !NOBYFOUR */
55
56 /* Definitions for doing the crc four data bytes at a time. */
57 #ifdef BYFOUR
58 # define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \
59 (((w)&0xff00)<<8)+(((w)&0xff)<<24))
60 local unsigned long crc32_little OF((unsigned long,
61 const unsigned char FAR *, unsigned));
62 local unsigned long crc32_big OF((unsigned long,
63 const unsigned char FAR *, unsigned));
64 # define TBLS 8
65 #else
66 # define TBLS 1
67 #endif /* BYFOUR */
68
69 #ifdef DYNAMIC_CRC_TABLE
70
71 local int crc_table_empty = 1;
72 local unsigned long FAR crc_table[TBLS][256];
73 local void make_crc_table OF((void));
74 #ifdef MAKECRCH
75 local void write_table OF((FILE *, const unsigned long FAR *));
76 #endif /* MAKECRCH */
77
78 /*
79 Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:
80 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.
81
82 Polynomials over GF(2) are represented in binary, one bit per coefficient,
83 with the lowest powers in the most significant bit. Then adding polynomials
84 is just exclusive-or, and multiplying a polynomial by x is a right shift by
85 one. If we call the above polynomial p, and represent a byte as the
86 polynomial q, also with the lowest power in the most significant bit (so the
87 byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
88 where a mod b means the remainder after dividing a by b.
89
90 This calculation is done using the shift-register method of multiplying and
91 taking the remainder. The register is initialized to zero, and for each
92 incoming bit, x^32 is added mod p to the register if the bit is a one (where
93 x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
94 x (which is shifting right by one and adding x^32 mod p if the bit shifted
95 out is a one). We start with the highest power (least significant bit) of
96 q and repeat for all eight bits of q.
97
98 The first table is simply the CRC of all possible eight bit values. This is
99 all the information needed to generate CRCs on data a byte at a time for all
100 combinations of CRC register values and incoming bytes. The remaining tables
101 allow for word-at-a-time CRC calculation for both big-endian and little-
102 endian machines, where a word is four bytes.
103 */
make_crc_table()104 local void make_crc_table()
105 {
106 unsigned long c;
107 int n, k;
108 unsigned long poly; /* polynomial exclusive-or pattern */
109 /* terms of polynomial defining this crc (except x^32): */
110 static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
111
112 /* make exclusive-or pattern from polynomial (0xedb88320UL) */
113 poly = 0UL;
114 for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++)
115 poly |= 1UL << (31 - p[n]);
116
117 /* generate a crc for every 8-bit value */
118 for (n = 0; n < 256; n++) {
119 c = (unsigned long)n;
120 for (k = 0; k < 8; k++)
121 c = c & 1 ? poly ^ (c >> 1) : c >> 1;
122 crc_table[0][n] = c;
123 }
124
125 #ifdef BYFOUR
126 /* generate crc for each value followed by one, two, and three zeros, and
127 then the byte reversal of those as well as the first table */
128 for (n = 0; n < 256; n++) {
129 c = crc_table[0][n];
130 crc_table[4][n] = REV(c);
131 for (k = 1; k < 4; k++) {
132 c = crc_table[0][c & 0xff] ^ (c >> 8);
133 crc_table[k][n] = c;
134 crc_table[k + 4][n] = REV(c);
135 }
136 }
137 #endif /* BYFOUR */
138
139 crc_table_empty = 0;
140
141 #ifdef MAKECRCH
142 /* write out CRC tables to crc32.h */
143 {
144 FILE *out;
145
146 out = fopen("crc32.h", "w");
147 if (out == NULL) return;
148 fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n");
149 fprintf(out, " * Generated automatically by crc32.c\n */\n\n");
150 fprintf(out, "local const unsigned long FAR ");
151 fprintf(out, "crc_table[TBLS][256] =\n{\n {\n");
152 write_table(out, crc_table[0]);
153 # ifdef BYFOUR
154 fprintf(out, "#ifdef BYFOUR\n");
155 for (k = 1; k < 8; k++) {
156 fprintf(out, " },\n {\n");
157 write_table(out, crc_table[k]);
158 }
159 fprintf(out, "#endif\n");
160 # endif /* BYFOUR */
161 fprintf(out, " }\n};\n");
162 fclose(out);
163 }
164 #endif /* MAKECRCH */
165 }
166
167 #ifdef MAKECRCH
write_table(out,table)168 local void write_table(out, table)
169 FILE *out;
170 const unsigned long FAR *table;
171 {
172 int n;
173
174 for (n = 0; n < 256; n++)
175 fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n],
176 n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", "));
177 }
178 #endif /* MAKECRCH */
179
180 #else /* !DYNAMIC_CRC_TABLE */
181 /* ========================================================================
182 * Tables of CRC-32s of all single-byte values, made by make_crc_table().
183 */
184 #include "crc32tbl.h"
185 #endif /* DYNAMIC_CRC_TABLE */
186
187 /* ========================================================================= */
188 #define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8)
189 #define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1
190
191
192
193 /* ========================================================================= */
crc32(crc,buf,len)194 unsigned long ZEXPORT crc32(crc, buf, len)
195 unsigned long crc;
196 const unsigned char FAR *buf;
197 unsigned len;
198 {
199 if (buf == Z_NULL) return 0UL;
200
201 #ifdef DYNAMIC_CRC_TABLE
202 if (crc_table_empty)
203 make_crc_table();
204 #endif /* DYNAMIC_CRC_TABLE */
205
206 #ifdef BYFOUR
207 if (sizeof(void *) == sizeof(ptrdiff_t)) {
208 u4 endian;
209
210 endian = 1;
211 if (*((unsigned char *)(&endian)))
212 return crc32_little(crc, buf, len);
213 else
214 return crc32_big(crc, buf, len);
215 }
216 #endif /* BYFOUR */
217 crc = crc ^ 0xffffffffUL;
218 while (len >= 8) {
219 DO8;
220 len -= 8;
221 }
222 if (len) do {
223 DO1;
224 } while (--len);
225 return crc ^ 0xffffffffUL;
226 }
227
228 #ifdef BYFOUR
229
230 /* ========================================================================= */
231 #define DOLIT4 c ^= *buf4++; \
232 c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \
233 crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24]
234 #define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4
235
236 /* ========================================================================= */
crc32_little(crc,buf,len)237 local unsigned long crc32_little(crc, buf, len)
238 unsigned long crc;
239 const unsigned char FAR *buf;
240 unsigned len;
241 {
242 register u4 c;
243 register const u4 FAR *buf4;
244
245 c = (u4)crc;
246 c = ~c;
247 while (len && ((ptrdiff_t)buf & 3)) {
248 c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
249 len--;
250 }
251
252 buf4 = (const u4 FAR *)(void *)buf;
253 while (len >= 32) {
254 DOLIT32;
255 len -= 32;
256 }
257 while (len >= 4) {
258 DOLIT4;
259 len -= 4;
260 }
261 buf = (const unsigned char FAR *)buf4;
262
263 if (len) do {
264 c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
265 } while (--len);
266 c = ~c;
267 return (unsigned long)c;
268 }
269
270 /* ========================================================================= */
271 #define DOBIG4 c ^= *++buf4; \
272 c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \
273 crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24]
274 #define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4
275
276 /* ========================================================================= */
crc32_big(crc,buf,len)277 local unsigned long crc32_big(crc, buf, len)
278 unsigned long crc;
279 const unsigned char FAR *buf;
280 unsigned len;
281 {
282 register u4 c;
283 register const u4 FAR *buf4;
284
285 c = REV((u4)crc);
286 c = ~c;
287 while (len && ((ptrdiff_t)buf & 3)) {
288 c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
289 len--;
290 }
291
292 buf4 = (const u4 FAR *)(void *)buf;
293 buf4--;
294 while (len >= 32) {
295 DOBIG32;
296 len -= 32;
297 }
298 while (len >= 4) {
299 DOBIG4;
300 len -= 4;
301 }
302 buf4++;
303 buf = (const unsigned char FAR *)buf4;
304
305 if (len) do {
306 c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
307 } while (--len);
308 c = ~c;
309 return (unsigned long)(REV(c));
310 }
311
312 #endif /* BYFOUR */
313