This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
ddf0025c054c2ac8b7ebe0e56d99bf6923e34938
[perl5.git] / cpan / Compress-Raw-Zlib / zlib-src / crc32.c
1 /* crc32.c -- compute the CRC-32 of a data stream
2  * Copyright (C) 1995-2006, 2010, 2011 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 in about a
9  * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.
10  */
11
12 /* @(#) $Id$ */
13
14 /*
15   Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore
16   protection on the static variables used to control the first-use generation
17   of the crc tables.  Therefore, if you #define DYNAMIC_CRC_TABLE, you should
18   first call get_crc_table() to initialize the tables before allowing more than
19   one thread to use crc32().
20
21   DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h.
22  */
23
24 #ifdef MAKECRCH
25 #  include <stdio.h>
26 #  ifndef DYNAMIC_CRC_TABLE
27 #    define DYNAMIC_CRC_TABLE
28 #  endif /* !DYNAMIC_CRC_TABLE */
29 #endif /* MAKECRCH */
30
31 #include "zutil.h"      /* for STDC and FAR definitions */
32
33 #define local static
34
35 /* Find a four-byte integer type for crc32_little() and crc32_big(). */
36 #ifdef Z_SOLO
37 #  define NOBYFOUR
38 #endif
39 #ifndef NOBYFOUR
40 #  ifdef STDC           /* need ANSI C limits.h to determine sizes */
41 #    include <limits.h>
42 #    define BYFOUR
43 #    if (UINT_MAX == 0xffffffffUL)
44        typedef unsigned int u4;
45 #    else
46 #      if (ULONG_MAX == 0xffffffffUL)
47          typedef unsigned long u4;
48 #      else
49 #        if (USHRT_MAX == 0xffffffffUL)
50            typedef unsigned short u4;
51 #        else
52 #          undef BYFOUR     /* can't find a four-byte integer type! */
53 #        endif
54 #      endif
55 #    endif
56 #  endif /* STDC */
57 #endif /* !NOBYFOUR */
58
59 /* Definitions for doing the crc four data bytes at a time. */
60 #ifdef BYFOUR
61    typedef u4 crc_table_t;
62 #  define REV(w) ((((w)>>24)&0xff)+(((w)>>8)&0xff00)+ \
63                 (((w)&0xff00)<<8)+(((w)&0xff)<<24))
64    local unsigned long crc32_little OF((unsigned long,
65                         const unsigned char FAR *, unsigned));
66    local unsigned long crc32_big OF((unsigned long,
67                         const unsigned char FAR *, unsigned));
68 #  define TBLS 8
69 #else
70    typedef unsigned long crc_table_t;
71 #  define TBLS 1
72 #endif /* BYFOUR */
73
74 /* Local functions for crc concatenation */
75 local unsigned long gf2_matrix_times OF((unsigned long *mat,
76                                          unsigned long vec));
77 local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat));
78 local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2));
79
80
81 #ifdef DYNAMIC_CRC_TABLE
82
83 local volatile int crc_table_empty = 1;
84 local crc_table_t FAR crc_table[TBLS][256];
85 local void make_crc_table OF((void));
86 #ifdef MAKECRCH
87    local void write_table OF((FILE *, const crc_table_t FAR *));
88 #endif /* MAKECRCH */
89 /*
90   Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:
91   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.
92
93   Polynomials over GF(2) are represented in binary, one bit per coefficient,
94   with the lowest powers in the most significant bit.  Then adding polynomials
95   is just exclusive-or, and multiplying a polynomial by x is a right shift by
96   one.  If we call the above polynomial p, and represent a byte as the
97   polynomial q, also with the lowest power in the most significant bit (so the
98   byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
99   where a mod b means the remainder after dividing a by b.
100
101   This calculation is done using the shift-register method of multiplying and
102   taking the remainder.  The register is initialized to zero, and for each
103   incoming bit, x^32 is added mod p to the register if the bit is a one (where
104   x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
105   x (which is shifting right by one and adding x^32 mod p if the bit shifted
106   out is a one).  We start with the highest power (least significant bit) of
107   q and repeat for all eight bits of q.
108
109   The first table is simply the CRC of all possible eight bit values.  This is
110   all the information needed to generate CRCs on data a byte at a time for all
111   combinations of CRC register values and incoming bytes.  The remaining tables
112   allow for word-at-a-time CRC calculation for both big-endian and little-
113   endian machines, where a word is four bytes.
114 */
115 local void make_crc_table()
116 {
117     crc_table_t c;
118     int n, k;
119     crc_table_t poly;                   /* polynomial exclusive-or pattern */
120     /* terms of polynomial defining this crc (except x^32): */
121     static volatile int first = 1;      /* flag to limit concurrent making */
122     static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
123
124     /* See if another task is already doing this (not thread-safe, but better
125        than nothing -- significantly reduces duration of vulnerability in
126        case the advice about DYNAMIC_CRC_TABLE is ignored) */
127     if (first) {
128         first = 0;
129
130         /* make exclusive-or pattern from polynomial (0xedb88320UL) */
131         poly = 0;
132         for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++)
133             poly |= (crc_table_t)1 << (31 - p[n]);
134
135         /* generate a crc for every 8-bit value */
136         for (n = 0; n < 256; n++) {
137             c = (crc_table_t)n;
138             for (k = 0; k < 8; k++)
139                 c = c & 1 ? poly ^ (c >> 1) : c >> 1;
140             crc_table[0][n] = c;
141         }
142
143 #ifdef BYFOUR
144         /* generate crc for each value followed by one, two, and three zeros,
145            and then the byte reversal of those as well as the first table */
146         for (n = 0; n < 256; n++) {
147             c = crc_table[0][n];
148             crc_table[4][n] = REV(c);
149             for (k = 1; k < 4; k++) {
150                 c = crc_table[0][c & 0xff] ^ (c >> 8);
151                 crc_table[k][n] = c;
152                 crc_table[k + 4][n] = REV(c);
153             }
154         }
155 #endif /* BYFOUR */
156
157         crc_table_empty = 0;
158     }
159     else {      /* not first */
160         /* wait for the other guy to finish (not efficient, but rare) */
161         while (crc_table_empty)
162             ;
163     }
164
165 #ifdef MAKECRCH
166     /* write out CRC tables to crc32.h */
167     {
168         FILE *out;
169
170         out = fopen("crc32.h", "w");
171         if (out == NULL) return;
172         fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n");
173         fprintf(out, " * Generated automatically by crc32.c\n */\n\n");
174         fprintf(out, "local const crc_table_t FAR ");
175         fprintf(out, "crc_table[TBLS][256] =\n{\n  {\n");
176         write_table(out, crc_table[0]);
177 #  ifdef BYFOUR
178         fprintf(out, "#ifdef BYFOUR\n");
179         for (k = 1; k < 8; k++) {
180             fprintf(out, "  },\n  {\n");
181             write_table(out, crc_table[k]);
182         }
183         fprintf(out, "#endif\n");
184 #  endif /* BYFOUR */
185         fprintf(out, "  }\n};\n");
186         fclose(out);
187     }
188 #endif /* MAKECRCH */
189 }
190
191 #ifdef MAKECRCH
192 local void write_table(out, table)
193     FILE *out;
194     const crc_table_t FAR *table;
195 {
196     int n;
197
198     for (n = 0; n < 256; n++)
199         fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : "    ",
200                 (unsigned long)(table[n]),
201                 n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", "));
202 }
203 #endif /* MAKECRCH */
204
205 #else /* !DYNAMIC_CRC_TABLE */
206 /* ========================================================================
207  * Tables of CRC-32s of all single-byte values, made by make_crc_table().
208  */
209 #include "crc32.h"
210 #endif /* DYNAMIC_CRC_TABLE */
211
212 /* =========================================================================
213  * This function can be used by asm versions of crc32()
214  */
215 const unsigned long FAR * ZEXPORT get_crc_table()
216 {
217 #ifdef DYNAMIC_CRC_TABLE
218     if (crc_table_empty)
219         make_crc_table();
220 #endif /* DYNAMIC_CRC_TABLE */
221     return (const unsigned long FAR *)crc_table;
222 }
223
224 /* ========================================================================= */
225 #define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8)
226 #define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1
227
228 /* ========================================================================= */
229 unsigned long ZEXPORT crc32(crc, buf, len)
230     unsigned long crc;
231     const unsigned char FAR *buf;
232     uInt len;
233 {
234     if (buf == Z_NULL) return 0UL;
235
236 #ifdef DYNAMIC_CRC_TABLE
237     if (crc_table_empty)
238         make_crc_table();
239 #endif /* DYNAMIC_CRC_TABLE */
240
241 #ifdef BYFOUR
242     if (sizeof(void *) == sizeof(ptrdiff_t)) {
243         u4 endian;
244
245         endian = 1;
246         if (*((unsigned char *)(&endian)))
247             return crc32_little(crc, buf, len);
248         else
249             return crc32_big(crc, buf, len);
250     }
251 #endif /* BYFOUR */
252     crc = crc ^ 0xffffffffUL;
253     while (len >= 8) {
254         DO8;
255         len -= 8;
256     }
257     if (len) do {
258         DO1;
259     } while (--len);
260     return crc ^ 0xffffffffUL;
261 }
262
263 #ifdef BYFOUR
264
265 /* ========================================================================= */
266 #define DOLIT4 c ^= *buf4++; \
267         c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \
268             crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24]
269 #define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4
270
271 /* ========================================================================= */
272 local unsigned long crc32_little(crc, buf, len)
273     unsigned long crc;
274     const unsigned char FAR *buf;
275     unsigned len;
276 {
277     register u4 c;
278     register const u4 FAR *buf4;
279
280     c = (u4)crc;
281     c = ~c;
282     while (len && ((ptrdiff_t)buf & 3)) {
283         c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
284         len--;
285     }
286
287     buf4 = (const u4 FAR *)(const void FAR *)buf;
288     while (len >= 32) {
289         DOLIT32;
290         len -= 32;
291     }
292     while (len >= 4) {
293         DOLIT4;
294         len -= 4;
295     }
296     buf = (const unsigned char FAR *)buf4;
297
298     if (len) do {
299         c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
300     } while (--len);
301     c = ~c;
302     return (unsigned long)c;
303 }
304
305 /* ========================================================================= */
306 #define DOBIG4 c ^= *++buf4; \
307         c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \
308             crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24]
309 #define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4
310
311 /* ========================================================================= */
312 local unsigned long crc32_big(crc, buf, len)
313     unsigned long crc;
314     const unsigned char FAR *buf;
315     unsigned len;
316 {
317     register u4 c;
318     register const u4 FAR *buf4;
319
320     c = REV((u4)crc);
321     c = ~c;
322     while (len && ((ptrdiff_t)buf & 3)) {
323         c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
324         len--;
325     }
326
327     buf4 = (const u4 FAR *)(const void FAR *)buf;
328     buf4--;
329     while (len >= 32) {
330         DOBIG32;
331         len -= 32;
332     }
333     while (len >= 4) {
334         DOBIG4;
335         len -= 4;
336     }
337     buf4++;
338     buf = (const unsigned char FAR *)buf4;
339
340     if (len) do {
341         c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
342     } while (--len);
343     c = ~c;
344     return (unsigned long)(REV(c));
345 }
346
347 #endif /* BYFOUR */
348
349 #define GF2_DIM 32      /* dimension of GF(2) vectors (length of CRC) */
350
351 /* ========================================================================= */
352 local unsigned long gf2_matrix_times(mat, vec)
353     unsigned long *mat;
354     unsigned long vec;
355 {
356     unsigned long sum;
357
358     sum = 0;
359     while (vec) {
360         if (vec & 1)
361             sum ^= *mat;
362         vec >>= 1;
363         mat++;
364     }
365     return sum;
366 }
367
368 /* ========================================================================= */
369 local void gf2_matrix_square(square, mat)
370     unsigned long *square;
371     unsigned long *mat;
372 {
373     int n;
374
375     for (n = 0; n < GF2_DIM; n++)
376         square[n] = gf2_matrix_times(mat, mat[n]);
377 }
378
379 /* ========================================================================= */
380 local uLong crc32_combine_(crc1, crc2, len2)
381     uLong crc1;
382     uLong crc2;
383     z_off64_t len2;
384 {
385     int n;
386     unsigned long row;
387     unsigned long even[GF2_DIM];    /* even-power-of-two zeros operator */
388     unsigned long odd[GF2_DIM];     /* odd-power-of-two zeros operator */
389
390     /* degenerate case (also disallow negative lengths) */
391     if (len2 <= 0)
392         return crc1;
393
394     /* put operator for one zero bit in odd */
395     odd[0] = 0xedb88320UL;          /* CRC-32 polynomial */
396     row = 1;
397     for (n = 1; n < GF2_DIM; n++) {
398         odd[n] = row;
399         row <<= 1;
400     }
401
402     /* put operator for two zero bits in even */
403     gf2_matrix_square(even, odd);
404
405     /* put operator for four zero bits in odd */
406     gf2_matrix_square(odd, even);
407
408     /* apply len2 zeros to crc1 (first square will put the operator for one
409        zero byte, eight zero bits, in even) */
410     do {
411         /* apply zeros operator for this bit of len2 */
412         gf2_matrix_square(even, odd);
413         if (len2 & 1)
414             crc1 = gf2_matrix_times(even, crc1);
415         len2 >>= 1;
416
417         /* if no more bits set, then done */
418         if (len2 == 0)
419             break;
420
421         /* another iteration of the loop with odd and even swapped */
422         gf2_matrix_square(odd, even);
423         if (len2 & 1)
424             crc1 = gf2_matrix_times(odd, crc1);
425         len2 >>= 1;
426
427         /* if no more bits set, then done */
428     } while (len2 != 0);
429
430     /* return combined crc */
431     crc1 ^= crc2;
432     return crc1;
433 }
434
435 /* ========================================================================= */
436 uLong ZEXPORT crc32_combine(crc1, crc2, len2)
437     uLong crc1;
438     uLong crc2;
439     z_off_t len2;
440 {
441     return crc32_combine_(crc1, crc2, len2);
442 }
443
444 uLong ZEXPORT crc32_combine64(crc1, crc2, len2)
445     uLong crc1;
446     uLong crc2;
447     z_off64_t len2;
448 {
449     return crc32_combine_(crc1, crc2, len2);
450 }