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