|
<html><head><title>dlib C++ Library - crc32.c</title></head><body bgcolor='white'><pre> |
|
<font color='#009900'>/* crc32.c -- compute the CRC-32 of a data stream |
|
* Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler |
|
* For conditions of distribution and use, see copyright notice in zlib.h |
|
* |
|
* Thanks to Rodney Brown <[email protected]> for his contribution of faster |
|
* CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing |
|
* tables for updating the shift register in one step with three exclusive-ors |
|
* instead of four steps with four exclusive-ors. This results in about a |
|
* factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3. |
|
*/</font> |
|
|
|
<font color='#009900'>/* @(#) $Id$ */</font> |
|
|
|
<font color='#009900'>/* |
|
Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore |
|
protection on the static variables used to control the first-use generation |
|
of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should |
|
first call get_crc_table() to initialize the tables before allowing more than |
|
one thread to use crc32(). |
|
|
|
DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h. |
|
*/</font> |
|
|
|
<font color='#0000FF'>#ifdef</font> MAKECRCH |
|
# include <font color='#5555FF'><</font>stdio.h<font color='#5555FF'>></font> |
|
# ifndef DYNAMIC_CRC_TABLE |
|
# define DYNAMIC_CRC_TABLE |
|
# endif <font color='#009900'>/* !DYNAMIC_CRC_TABLE */</font> |
|
<font color='#0000FF'>#endif</font> <font color='#009900'>/* MAKECRCH */</font> |
|
|
|
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='zutil.h.html'>zutil.h</a>" <font color='#009900'>/* for STDC and FAR definitions */</font> |
|
|
|
<font color='#0000FF'>#define</font> local <font color='#0000FF'>static</font> |
|
|
|
<font color='#009900'>/* Definitions for doing the crc four data bytes at a time. */</font> |
|
<font color='#0000FF'>#if</font> <font color='#5555FF'>!</font>defined<font face='Lucida Console'>(</font>NOBYFOUR<font face='Lucida Console'>)</font> <font color='#5555FF'>&</font><font color='#5555FF'>&</font> defined<font face='Lucida Console'>(</font>Z_U4<font face='Lucida Console'>)</font> |
|
# define BYFOUR |
|
<font color='#0000FF'>#endif</font> |
|
<font color='#0000FF'>#ifdef</font> BYFOUR |
|
local <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> crc32_little <b><a name='OF'></a>OF</b><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font>, |
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> FAR <font color='#5555FF'>*</font>, <font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
local <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> crc32_big <b><a name='OF'></a>OF</b><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font>, |
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> FAR <font color='#5555FF'>*</font>, <font color='#0000FF'><u>unsigned</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
# define TBLS <font color='#979000'>8</font> |
|
<font color='#0000FF'>#else</font> |
|
# define TBLS <font color='#979000'>1</font> |
|
<font color='#0000FF'>#endif</font> <font color='#009900'>/* BYFOUR */</font> |
|
|
|
<font color='#009900'>/* Local functions for crc concatenation */</font> |
|
local <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> gf2_matrix_times <b><a name='OF'></a>OF</b><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> <font color='#5555FF'>*</font>mat, |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> vec<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
local <font color='#0000FF'><u>void</u></font> gf2_matrix_square <b><a name='OF'></a>OF</b><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> <font color='#5555FF'>*</font>square, <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> <font color='#5555FF'>*</font>mat<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
local uLong crc32_combine_ <b><a name='OF'></a>OF</b><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>uLong crc1, uLong crc2, z_off64_t len2<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
|
|
|
|
<font color='#0000FF'>#ifdef</font> DYNAMIC_CRC_TABLE |
|
|
|
local <font color='#0000FF'>volatile</font> <font color='#0000FF'><u>int</u></font> crc_table_empty <font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
local z_crc_t FAR crc_table[TBLS][<font color='#979000'>256</font>]; |
|
local <font color='#0000FF'><u>void</u></font> make_crc_table <b><a name='OF'></a>OF</b><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>void</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>#ifdef</font> MAKECRCH |
|
local <font color='#0000FF'><u>void</u></font> write_table <b><a name='OF'></a>OF</b><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>FILE <font color='#5555FF'>*</font>, <font color='#0000FF'>const</font> z_crc_t FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>#endif</font> <font color='#009900'>/* MAKECRCH */</font> |
|
<font color='#009900'>/* |
|
Generate tables for a byte-wise 32-bit CRC calculation on the polynomial: |
|
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. |
|
|
|
Polynomials over GF(2) are represented in binary, one bit per coefficient, |
|
with the lowest powers in the most significant bit. Then adding polynomials |
|
is just exclusive-or, and multiplying a polynomial by x is a right shift by |
|
one. If we call the above polynomial p, and represent a byte as the |
|
polynomial q, also with the lowest power in the most significant bit (so the |
|
byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p, |
|
where a mod b means the remainder after dividing a by b. |
|
|
|
This calculation is done using the shift-register method of multiplying and |
|
taking the remainder. The register is initialized to zero, and for each |
|
incoming bit, x^32 is added mod p to the register if the bit is a one (where |
|
x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by |
|
x (which is shifting right by one and adding x^32 mod p if the bit shifted |
|
out is a one). We start with the highest power (least significant bit) of |
|
q and repeat for all eight bits of q. |
|
|
|
The first table is simply the CRC of all possible eight bit values. This is |
|
all the information needed to generate CRCs on data a byte at a time for all |
|
combinations of CRC register values and incoming bytes. The remaining tables |
|
allow for word-at-a-time CRC calculation for both big-endian and little- |
|
endian machines, where a word is four bytes. |
|
*/</font> |
|
local <font color='#0000FF'><u>void</u></font> <b><a name='make_crc_table'></a>make_crc_table</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
z_crc_t c; |
|
<font color='#0000FF'><u>int</u></font> n, k; |
|
z_crc_t poly; <font color='#009900'>/* polynomial exclusive-or pattern */</font> |
|
<font color='#009900'>/* terms of polynomial defining this crc (except x^32): */</font> |
|
<font color='#0000FF'>static</font> <font color='#0000FF'>volatile</font> <font color='#0000FF'><u>int</u></font> first <font color='#5555FF'>=</font> <font color='#979000'>1</font>; <font color='#009900'>/* flag to limit concurrent making */</font> |
|
<font color='#0000FF'>static</font> <font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> p[] <font color='#5555FF'>=</font> <b>{</b><font color='#979000'>0</font>,<font color='#979000'>1</font>,<font color='#979000'>2</font>,<font color='#979000'>4</font>,<font color='#979000'>5</font>,<font color='#979000'>7</font>,<font color='#979000'>8</font>,<font color='#979000'>10</font>,<font color='#979000'>11</font>,<font color='#979000'>12</font>,<font color='#979000'>16</font>,<font color='#979000'>22</font>,<font color='#979000'>23</font>,<font color='#979000'>26</font><b>}</b>; |
|
|
|
<font color='#009900'>/* See if another task is already doing this (not thread-safe, but better |
|
than nothing -- significantly reduces duration of vulnerability in |
|
case the advice about DYNAMIC_CRC_TABLE is ignored) */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>first<font face='Lucida Console'>)</font> <b>{</b> |
|
first <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
|
|
<font color='#009900'>/* make exclusive-or pattern from polynomial (0xedb88320UL) */</font> |
|
poly <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>n <font color='#5555FF'>=</font> <font color='#979000'>0</font>; n <font color='#5555FF'><</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font>p<font face='Lucida Console'>)</font><font color='#5555FF'>/</font><font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; n<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> |
|
poly <font color='#5555FF'>|</font><font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>z_crc_t<font face='Lucida Console'>)</font><font color='#979000'>1</font> <font color='#5555FF'><</font><font color='#5555FF'><</font> <font face='Lucida Console'>(</font><font color='#979000'>31</font> <font color='#5555FF'>-</font> p[n]<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>/* generate a crc for every 8-bit value */</font> |
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>n <font color='#5555FF'>=</font> <font color='#979000'>0</font>; n <font color='#5555FF'><</font> <font color='#979000'>256</font>; n<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b> |
|
c <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>z_crc_t<font face='Lucida Console'>)</font>n; |
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>k <font color='#5555FF'>=</font> <font color='#979000'>0</font>; k <font color='#5555FF'><</font> <font color='#979000'>8</font>; k<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> |
|
c <font color='#5555FF'>=</font> c <font color='#5555FF'>&</font> <font color='#979000'>1</font> ? poly ^ <font face='Lucida Console'>(</font>c <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> : c <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>1</font>; |
|
crc_table[<font color='#979000'>0</font>][n] <font color='#5555FF'>=</font> c; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>#ifdef</font> BYFOUR |
|
<font color='#009900'>/* generate crc for each value followed by one, two, and three zeros, |
|
and then the byte reversal of those as well as the first table */</font> |
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>n <font color='#5555FF'>=</font> <font color='#979000'>0</font>; n <font color='#5555FF'><</font> <font color='#979000'>256</font>; n<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b> |
|
c <font color='#5555FF'>=</font> crc_table[<font color='#979000'>0</font>][n]; |
|
crc_table[<font color='#979000'>4</font>][n] <font color='#5555FF'>=</font> <font color='#BB00BB'>ZSWAP32</font><font face='Lucida Console'>(</font>c<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>k <font color='#5555FF'>=</font> <font color='#979000'>1</font>; k <font color='#5555FF'><</font> <font color='#979000'>4</font>; k<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b> |
|
c <font color='#5555FF'>=</font> crc_table[<font color='#979000'>0</font>][c <font color='#5555FF'>&</font> <font color='#979000'>0xff</font>] ^ <font face='Lucida Console'>(</font>c <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>8</font><font face='Lucida Console'>)</font>; |
|
crc_table[k][n] <font color='#5555FF'>=</font> c; |
|
crc_table[k <font color='#5555FF'>+</font> <font color='#979000'>4</font>][n] <font color='#5555FF'>=</font> <font color='#BB00BB'>ZSWAP32</font><font face='Lucida Console'>(</font>c<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<b>}</b> |
|
<font color='#0000FF'>#endif</font> <font color='#009900'>/* BYFOUR */</font> |
|
|
|
crc_table_empty <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>else</font> <b>{</b> <font color='#009900'>/* not first */</font> |
|
<font color='#009900'>/* wait for the other guy to finish (not efficient, but rare) */</font> |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>crc_table_empty<font face='Lucida Console'>)</font> |
|
; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>#ifdef</font> MAKECRCH |
|
<font color='#009900'>/* write out CRC tables to crc32.h */</font> |
|
<b>{</b> |
|
FILE <font color='#5555FF'>*</font>out; |
|
|
|
out <font color='#5555FF'>=</font> <font color='#BB00BB'>fopen</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>crc32.h</font>", "<font color='#CC0000'>w</font>"<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>out <font color='#5555FF'>=</font><font color='#5555FF'>=</font> NULL<font face='Lucida Console'>)</font> <font color='#0000FF'>return</font>; |
|
<font color='#BB00BB'>fprintf</font><font face='Lucida Console'>(</font>out, "<font color='#CC0000'>/* crc32.h -- tables for rapid CRC calculation\n</font>"<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>fprintf</font><font face='Lucida Console'>(</font>out, "<font color='#CC0000'> * Generated automatically by crc32.c\n */\n\n</font>"<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>fprintf</font><font face='Lucida Console'>(</font>out, "<font color='#CC0000'>local const z_crc_t FAR </font>"<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>fprintf</font><font face='Lucida Console'>(</font>out, "<font color='#CC0000'>crc_table[TBLS][256] =\n{\n {\n</font>"<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>write_table</font><font face='Lucida Console'>(</font>out, crc_table[<font color='#979000'>0</font>]<font face='Lucida Console'>)</font>; |
|
# ifdef BYFOUR |
|
<font color='#BB00BB'>fprintf</font><font face='Lucida Console'>(</font>out, "<font color='#CC0000'>#ifdef BYFOUR\n</font>"<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>k <font color='#5555FF'>=</font> <font color='#979000'>1</font>; k <font color='#5555FF'><</font> <font color='#979000'>8</font>; k<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#BB00BB'>fprintf</font><font face='Lucida Console'>(</font>out, "<font color='#CC0000'> },\n {\n</font>"<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>write_table</font><font face='Lucida Console'>(</font>out, crc_table[k]<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#BB00BB'>fprintf</font><font face='Lucida Console'>(</font>out, "<font color='#CC0000'>#endif\n</font>"<font face='Lucida Console'>)</font>; |
|
# endif <font color='#009900'>/* BYFOUR */</font> |
|
<font color='#BB00BB'>fprintf</font><font face='Lucida Console'>(</font>out, "<font color='#CC0000'> }\n};\n</font>"<font face='Lucida Console'>)</font>; |
|
<font color='#BB00BB'>fclose</font><font face='Lucida Console'>(</font>out<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>#endif</font> <font color='#009900'>/* MAKECRCH */</font> |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>#ifdef</font> MAKECRCH |
|
local <font color='#0000FF'><u>void</u></font> <b><a name='write_table'></a>write_table</b><font face='Lucida Console'>(</font>out, table<font face='Lucida Console'>)</font> |
|
FILE <font color='#5555FF'>*</font>out; |
|
<font color='#0000FF'>const</font> z_crc_t FAR <font color='#5555FF'>*</font>table; |
|
<b>{</b> |
|
<font color='#0000FF'><u>int</u></font> n; |
|
|
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>n <font color='#5555FF'>=</font> <font color='#979000'>0</font>; n <font color='#5555FF'><</font> <font color='#979000'>256</font>; n<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> |
|
<font color='#BB00BB'>fprintf</font><font face='Lucida Console'>(</font>out, "<font color='#CC0000'>%s0x%08lxUL%s</font>", n <font color='#5555FF'>%</font> <font color='#979000'>5</font> ? "<font color='#CC0000'></font>" : "<font color='#CC0000'> </font>", |
|
<font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font>table[n]<font face='Lucida Console'>)</font>, |
|
n <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>255</font> ? "<font color='#CC0000'>\n</font>" : <font face='Lucida Console'>(</font>n <font color='#5555FF'>%</font> <font color='#979000'>5</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>4</font> ? "<font color='#CC0000'>,\n</font>" : "<font color='#CC0000'>, </font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>#endif</font> <font color='#009900'>/* MAKECRCH */</font> |
|
|
|
<font color='#0000FF'>#else</font> <font color='#009900'>/* !DYNAMIC_CRC_TABLE */</font> |
|
<font color='#009900'>/* ======================================================================== |
|
* Tables of CRC-32s of all single-byte values, made by make_crc_table(). |
|
*/</font> |
|
<font color='#0000FF'>#include</font> "<a style='text-decoration:none' href='crc32.h.html'>crc32.h</a>" |
|
<font color='#0000FF'>#endif</font> <font color='#009900'>/* DYNAMIC_CRC_TABLE */</font> |
|
|
|
<font color='#009900'>/* ========================================================================= |
|
* This function can be used by asm versions of crc32() |
|
*/</font> |
|
<font color='#0000FF'>const</font> z_crc_t FAR <font color='#5555FF'>*</font> ZEXPORT <b><a name='get_crc_table'></a>get_crc_table</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> |
|
<b>{</b> |
|
<font color='#0000FF'>#ifdef</font> DYNAMIC_CRC_TABLE |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>crc_table_empty<font face='Lucida Console'>)</font> |
|
<font color='#BB00BB'>make_crc_table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>#endif</font> <font color='#009900'>/* DYNAMIC_CRC_TABLE */</font> |
|
<font color='#0000FF'>return</font> <font face='Lucida Console'>(</font><font color='#0000FF'>const</font> z_crc_t FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>crc_table; |
|
<b>}</b> |
|
|
|
<font color='#009900'>/* ========================================================================= */</font> |
|
<font color='#0000FF'>#define</font> DO1 crc <font color='#5555FF'>=</font> crc_table[<font color='#979000'>0</font>][<font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font>crc ^ <font face='Lucida Console'>(</font><font color='#5555FF'>*</font>buf<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&</font> <font color='#979000'>0xff</font>] ^ <font face='Lucida Console'>(</font>crc <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>#define</font> DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1 |
|
|
|
<font color='#009900'>/* ========================================================================= */</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> ZEXPORT <b><a name='crc32'></a>crc32</b><font face='Lucida Console'>(</font>crc, buf, len<font face='Lucida Console'>)</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> crc; |
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> FAR <font color='#5555FF'>*</font>buf; |
|
uInt len; |
|
<b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>buf <font color='#5555FF'>=</font><font color='#5555FF'>=</font> Z_NULL<font face='Lucida Console'>)</font> <font color='#0000FF'>return</font> <font color='#979000'>0</font>UL; |
|
|
|
<font color='#0000FF'>#ifdef</font> DYNAMIC_CRC_TABLE |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>crc_table_empty<font face='Lucida Console'>)</font> |
|
<font color='#BB00BB'>make_crc_table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>#endif</font> <font color='#009900'>/* DYNAMIC_CRC_TABLE */</font> |
|
|
|
<font color='#0000FF'>#ifdef</font> BYFOUR |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>void</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#0000FF'>sizeof</font><font face='Lucida Console'>(</font>ptrdiff_t<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b> |
|
z_crc_t endian; |
|
|
|
endian <font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> <font color='#5555FF'>*</font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#5555FF'>&</font>endian<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>crc32_little</font><font face='Lucida Console'>(</font>crc, buf, len<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>else</font> |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>crc32_big</font><font face='Lucida Console'>(</font>crc, buf, len<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>#endif</font> <font color='#009900'>/* BYFOUR */</font> |
|
crc <font color='#5555FF'>=</font> crc ^ <font color='#979000'>0xffffffffUL</font>; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>len <font color='#5555FF'>></font><font color='#5555FF'>=</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <b>{</b> |
|
DO8; |
|
len <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>8</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>len<font face='Lucida Console'>)</font> <font color='#0000FF'>do</font> <b>{</b> |
|
DO1; |
|
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#5555FF'>-</font><font color='#5555FF'>-</font>len<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>return</font> crc ^ <font color='#979000'>0xffffffffUL</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>#ifdef</font> BYFOUR |
|
|
|
<font color='#009900'>/* ========================================================================= */</font> |
|
<font color='#0000FF'>#define</font> DOLIT4 c ^<font color='#5555FF'>=</font> <font color='#5555FF'>*</font>buf4<font color='#5555FF'>+</font><font color='#5555FF'>+</font>; \ |
|
c <font color='#5555FF'>=</font> crc_table[<font color='#979000'>3</font>][c <font color='#5555FF'>&</font> <font color='#979000'>0xff</font>] ^ crc_table[<font color='#979000'>2</font>][<font face='Lucida Console'>(</font>c <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&</font> <font color='#979000'>0xff</font>] ^ \ |
|
crc_table[<font color='#979000'>1</font>][<font face='Lucida Console'>(</font>c <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>16</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&</font> <font color='#979000'>0xff</font>] ^ crc_table[<font color='#979000'>0</font>][c <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>24</font>] |
|
<font color='#0000FF'>#define</font> DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4 |
|
|
|
<font color='#009900'>/* ========================================================================= */</font> |
|
local <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> <b><a name='crc32_little'></a>crc32_little</b><font face='Lucida Console'>(</font>crc, buf, len<font face='Lucida Console'>)</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> crc; |
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> FAR <font color='#5555FF'>*</font>buf; |
|
<font color='#0000FF'><u>unsigned</u></font> len; |
|
<b>{</b> |
|
<font color='#0000FF'>register</font> z_crc_t c; |
|
<font color='#0000FF'>register</font> <font color='#0000FF'>const</font> z_crc_t FAR <font color='#5555FF'>*</font>buf4; |
|
|
|
c <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>z_crc_t<font face='Lucida Console'>)</font>crc; |
|
c <font color='#5555FF'>=</font> ~c; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>len <font color='#5555FF'>&</font><font color='#5555FF'>&</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>ptrdiff_t<font face='Lucida Console'>)</font>buf <font color='#5555FF'>&</font> <font color='#979000'>3</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b> |
|
c <font color='#5555FF'>=</font> crc_table[<font color='#979000'>0</font>][<font face='Lucida Console'>(</font>c ^ <font color='#5555FF'>*</font>buf<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&</font> <font color='#979000'>0xff</font>] ^ <font face='Lucida Console'>(</font>c <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>8</font><font face='Lucida Console'>)</font>; |
|
len<font color='#5555FF'>-</font><font color='#5555FF'>-</font>; |
|
<b>}</b> |
|
|
|
buf4 <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>const</font> z_crc_t FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#0000FF'>const</font> <font color='#0000FF'><u>void</u></font> FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>buf; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>len <font color='#5555FF'>></font><font color='#5555FF'>=</font> <font color='#979000'>32</font><font face='Lucida Console'>)</font> <b>{</b> |
|
DOLIT32; |
|
len <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>32</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>len <font color='#5555FF'>></font><font color='#5555FF'>=</font> <font color='#979000'>4</font><font face='Lucida Console'>)</font> <b>{</b> |
|
DOLIT4; |
|
len <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>4</font>; |
|
<b>}</b> |
|
buf <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>buf4; |
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>len<font face='Lucida Console'>)</font> <font color='#0000FF'>do</font> <b>{</b> |
|
c <font color='#5555FF'>=</font> crc_table[<font color='#979000'>0</font>][<font face='Lucida Console'>(</font>c ^ <font color='#5555FF'>*</font>buf<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&</font> <font color='#979000'>0xff</font>] ^ <font face='Lucida Console'>(</font>c <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>8</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#5555FF'>-</font><font color='#5555FF'>-</font>len<font face='Lucida Console'>)</font>; |
|
c <font color='#5555FF'>=</font> ~c; |
|
<font color='#0000FF'>return</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font><font face='Lucida Console'>)</font>c; |
|
<b>}</b> |
|
|
|
<font color='#009900'>/* ========================================================================= */</font> |
|
<font color='#0000FF'>#define</font> DOBIG4 c ^<font color='#5555FF'>=</font> <font color='#5555FF'>*</font><font color='#5555FF'>+</font><font color='#5555FF'>+</font>buf4; \ |
|
c <font color='#5555FF'>=</font> crc_table[<font color='#979000'>4</font>][c <font color='#5555FF'>&</font> <font color='#979000'>0xff</font>] ^ crc_table[<font color='#979000'>5</font>][<font face='Lucida Console'>(</font>c <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>8</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&</font> <font color='#979000'>0xff</font>] ^ \ |
|
crc_table[<font color='#979000'>6</font>][<font face='Lucida Console'>(</font>c <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>16</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&</font> <font color='#979000'>0xff</font>] ^ crc_table[<font color='#979000'>7</font>][c <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>24</font>] |
|
<font color='#0000FF'>#define</font> DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4 |
|
|
|
<font color='#009900'>/* ========================================================================= */</font> |
|
local <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> <b><a name='crc32_big'></a>crc32_big</b><font face='Lucida Console'>(</font>crc, buf, len<font face='Lucida Console'>)</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> crc; |
|
<font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> FAR <font color='#5555FF'>*</font>buf; |
|
<font color='#0000FF'><u>unsigned</u></font> len; |
|
<b>{</b> |
|
<font color='#0000FF'>register</font> z_crc_t c; |
|
<font color='#0000FF'>register</font> <font color='#0000FF'>const</font> z_crc_t FAR <font color='#5555FF'>*</font>buf4; |
|
|
|
c <font color='#5555FF'>=</font> <font color='#BB00BB'>ZSWAP32</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>z_crc_t<font face='Lucida Console'>)</font>crc<font face='Lucida Console'>)</font>; |
|
c <font color='#5555FF'>=</font> ~c; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>len <font color='#5555FF'>&</font><font color='#5555FF'>&</font> <font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>ptrdiff_t<font face='Lucida Console'>)</font>buf <font color='#5555FF'>&</font> <font color='#979000'>3</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <b>{</b> |
|
c <font color='#5555FF'>=</font> crc_table[<font color='#979000'>4</font>][<font face='Lucida Console'>(</font>c <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>24</font><font face='Lucida Console'>)</font> ^ <font color='#5555FF'>*</font>buf<font color='#5555FF'>+</font><font color='#5555FF'>+</font>] ^ <font face='Lucida Console'>(</font>c <font color='#5555FF'><</font><font color='#5555FF'><</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font>; |
|
len<font color='#5555FF'>-</font><font color='#5555FF'>-</font>; |
|
<b>}</b> |
|
|
|
buf4 <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>const</font> z_crc_t FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#0000FF'>const</font> <font color='#0000FF'><u>void</u></font> FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>buf; |
|
buf4<font color='#5555FF'>-</font><font color='#5555FF'>-</font>; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>len <font color='#5555FF'>></font><font color='#5555FF'>=</font> <font color='#979000'>32</font><font face='Lucida Console'>)</font> <b>{</b> |
|
DOBIG32; |
|
len <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>32</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>len <font color='#5555FF'>></font><font color='#5555FF'>=</font> <font color='#979000'>4</font><font face='Lucida Console'>)</font> <b>{</b> |
|
DOBIG4; |
|
len <font color='#5555FF'>-</font><font color='#5555FF'>=</font> <font color='#979000'>4</font>; |
|
<b>}</b> |
|
buf4<font color='#5555FF'>+</font><font color='#5555FF'>+</font>; |
|
buf <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font><font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>char</u></font> FAR <font color='#5555FF'>*</font><font face='Lucida Console'>)</font>buf4; |
|
|
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>len<font face='Lucida Console'>)</font> <font color='#0000FF'>do</font> <b>{</b> |
|
c <font color='#5555FF'>=</font> crc_table[<font color='#979000'>4</font>][<font face='Lucida Console'>(</font>c <font color='#5555FF'>></font><font color='#5555FF'>></font> <font color='#979000'>24</font><font face='Lucida Console'>)</font> ^ <font color='#5555FF'>*</font>buf<font color='#5555FF'>+</font><font color='#5555FF'>+</font>] ^ <font face='Lucida Console'>(</font>c <font color='#5555FF'><</font><font color='#5555FF'><</font> <font color='#979000'>8</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#5555FF'>-</font><font color='#5555FF'>-</font>len<font face='Lucida Console'>)</font>; |
|
c <font color='#5555FF'>=</font> ~c; |
|
<font color='#0000FF'>return</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font><font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#BB00BB'>ZSWAP32</font><font face='Lucida Console'>(</font>c<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#0000FF'>#endif</font> <font color='#009900'>/* BYFOUR */</font> |
|
|
|
<font color='#0000FF'>#define</font> GF2_DIM <font color='#979000'>32</font> <font color='#009900'>/* dimension of GF(2) vectors (length of CRC) */</font> |
|
|
|
<font color='#009900'>/* ========================================================================= */</font> |
|
local <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> <b><a name='gf2_matrix_times'></a>gf2_matrix_times</b><font face='Lucida Console'>(</font>mat, vec<font face='Lucida Console'>)</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> <font color='#5555FF'>*</font>mat; |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> vec; |
|
<b>{</b> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> sum; |
|
|
|
sum <font color='#5555FF'>=</font> <font color='#979000'>0</font>; |
|
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>vec<font face='Lucida Console'>)</font> <b>{</b> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>vec <font color='#5555FF'>&</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
sum ^<font color='#5555FF'>=</font> <font color='#5555FF'>*</font>mat; |
|
vec <font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
mat<font color='#5555FF'>+</font><font color='#5555FF'>+</font>; |
|
<b>}</b> |
|
<font color='#0000FF'>return</font> sum; |
|
<b>}</b> |
|
|
|
<font color='#009900'>/* ========================================================================= */</font> |
|
local <font color='#0000FF'><u>void</u></font> <b><a name='gf2_matrix_square'></a>gf2_matrix_square</b><font face='Lucida Console'>(</font>square, mat<font face='Lucida Console'>)</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> <font color='#5555FF'>*</font>square; |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> <font color='#5555FF'>*</font>mat; |
|
<b>{</b> |
|
<font color='#0000FF'><u>int</u></font> n; |
|
|
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>n <font color='#5555FF'>=</font> <font color='#979000'>0</font>; n <font color='#5555FF'><</font> GF2_DIM; n<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> |
|
square[n] <font color='#5555FF'>=</font> <font color='#BB00BB'>gf2_matrix_times</font><font face='Lucida Console'>(</font>mat, mat[n]<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>/* ========================================================================= */</font> |
|
local uLong <b><a name='crc32_combine_'></a>crc32_combine_</b><font face='Lucida Console'>(</font>crc1, crc2, len2<font face='Lucida Console'>)</font> |
|
uLong crc1; |
|
uLong crc2; |
|
z_off64_t len2; |
|
<b>{</b> |
|
<font color='#0000FF'><u>int</u></font> n; |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> row; |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> even[GF2_DIM]; <font color='#009900'>/* even-power-of-two zeros operator */</font> |
|
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> odd[GF2_DIM]; <font color='#009900'>/* odd-power-of-two zeros operator */</font> |
|
|
|
<font color='#009900'>/* degenerate case (also disallow negative lengths) */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>len2 <font color='#5555FF'><</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>return</font> crc1; |
|
|
|
<font color='#009900'>/* put operator for one zero bit in odd */</font> |
|
odd[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> <font color='#979000'>0xedb88320UL</font>; <font color='#009900'>/* CRC-32 polynomial */</font> |
|
row <font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>n <font color='#5555FF'>=</font> <font color='#979000'>1</font>; n <font color='#5555FF'><</font> GF2_DIM; n<font color='#5555FF'>+</font><font color='#5555FF'>+</font><font face='Lucida Console'>)</font> <b>{</b> |
|
odd[n] <font color='#5555FF'>=</font> row; |
|
row <font color='#5555FF'><</font><font color='#5555FF'><</font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
<b>}</b> |
|
|
|
<font color='#009900'>/* put operator for two zero bits in even */</font> |
|
<font color='#BB00BB'>gf2_matrix_square</font><font face='Lucida Console'>(</font>even, odd<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>/* put operator for four zero bits in odd */</font> |
|
<font color='#BB00BB'>gf2_matrix_square</font><font face='Lucida Console'>(</font>odd, even<font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>/* apply len2 zeros to crc1 (first square will put the operator for one |
|
zero byte, eight zero bits, in even) */</font> |
|
<font color='#0000FF'>do</font> <b>{</b> |
|
<font color='#009900'>/* apply zeros operator for this bit of len2 */</font> |
|
<font color='#BB00BB'>gf2_matrix_square</font><font face='Lucida Console'>(</font>even, odd<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>len2 <font color='#5555FF'>&</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
crc1 <font color='#5555FF'>=</font> <font color='#BB00BB'>gf2_matrix_times</font><font face='Lucida Console'>(</font>even, crc1<font face='Lucida Console'>)</font>; |
|
len2 <font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
|
|
<font color='#009900'>/* if no more bits set, then done */</font> |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>len2 <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font> |
|
<font color='#0000FF'>break</font>; |
|
|
|
<font color='#009900'>/* another iteration of the loop with odd and even swapped */</font> |
|
<font color='#BB00BB'>gf2_matrix_square</font><font face='Lucida Console'>(</font>odd, even<font face='Lucida Console'>)</font>; |
|
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>len2 <font color='#5555FF'>&</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font> |
|
crc1 <font color='#5555FF'>=</font> <font color='#BB00BB'>gf2_matrix_times</font><font face='Lucida Console'>(</font>odd, crc1<font face='Lucida Console'>)</font>; |
|
len2 <font color='#5555FF'>></font><font color='#5555FF'>></font><font color='#5555FF'>=</font> <font color='#979000'>1</font>; |
|
|
|
<font color='#009900'>/* if no more bits set, then done */</font> |
|
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>len2 <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>; |
|
|
|
<font color='#009900'>/* return combined crc */</font> |
|
crc1 ^<font color='#5555FF'>=</font> crc2; |
|
<font color='#0000FF'>return</font> crc1; |
|
<b>}</b> |
|
|
|
<font color='#009900'>/* ========================================================================= */</font> |
|
uLong ZEXPORT <b><a name='crc32_combine'></a>crc32_combine</b><font face='Lucida Console'>(</font>crc1, crc2, len2<font face='Lucida Console'>)</font> |
|
uLong crc1; |
|
uLong crc2; |
|
z_off_t len2; |
|
<b>{</b> |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>crc32_combine_</font><font face='Lucida Console'>(</font>crc1, crc2, len2<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
uLong ZEXPORT <b><a name='crc32_combine64'></a>crc32_combine64</b><font face='Lucida Console'>(</font>crc1, crc2, len2<font face='Lucida Console'>)</font> |
|
uLong crc1; |
|
uLong crc2; |
|
z_off64_t len2; |
|
<b>{</b> |
|
<font color='#0000FF'>return</font> <font color='#BB00BB'>crc32_combine_</font><font face='Lucida Console'>(</font>crc1, crc2, len2<font face='Lucida Console'>)</font>; |
|
<b>}</b> |
|
|
|
</pre></body></html> |