annotate src/zlib-1.2.7/crc32.c @ 4:e13257ea84a4

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