doom3-gpl
Doom 3 GPL source release
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
CRC32.cpp
Go to the documentation of this file.
1 
2 #include "../precompiled.h"
3 #pragma hdrstop
4 
5 /*
6  CRC-32
7  Copyright (C) 1995-1998 Mark Adler
8 */
9 
10 #define CRC32_INIT_VALUE 0xffffffffL
11 #define CRC32_XOR_VALUE 0xffffffffL
12 
13 #ifdef CREATE_CRC_TABLE
14 
15 static unsigned long crctable[256];
16 
17 /*
18  Generate a table for a byte-wise 32-bit CRC calculation on the polynomial:
19  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+x^0.
20 
21  Polynomials over GF(2) are represented in binary, one bit per coefficient,
22  with the lowest powers in the most significant bit. Then adding polynomials
23  is just exclusive-or, and multiplying a polynomial by x is a right shift by
24  one. If we call the above polynomial p, and represent a byte as the
25  polynomial q, also with the lowest power in the most significant bit (so the
26  byte 0xb1 is the polynomial x^7+x^3+x^1+x^0), then the CRC is (q*x^32) mod p,
27  where a mod b means the remainder after dividing a by b.
28 
29  This calculation is done using the shift-register method of multiplying and
30  taking the remainder. The register is initialized to zero, and for each
31  incoming bit, x^32 is added mod p to the register if the bit is a one (where
32  x^32 mod p is p+x^32 = x^26+...+x^0), and the register is multiplied mod p by
33  x (which is shifting right by one and adding x^32 mod p if the bit shifted
34  out is a one). We start with the highest power (least significant bit) of
35  q and repeat for all eight bits of q.
36 
37  The table is simply the CRC of all possible eight bit values. This is all
38  the information needed to generate CRC's on data a byte at a time for all
39  combinations of CRC register values and incoming bytes.
40 */
41 
42 void make_crc_table( void ) {
43  int i, j;
44  unsigned long c, poly;
45  /* terms of polynomial defining this crc (except x^32): */
46  static const byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
47 
48  /* make exclusive-or pattern from polynomial (0xedb88320L) */
49  poly = 0L;
50  for ( i = 0; i < sizeof( p ) / sizeof( byte ); i++ ) {
51  poly |= 1L << ( 31 - p[i] );
52  }
53 
54  for ( i = 0; i < 256; i++ ) {
55  c = (unsigned long)i;
56  for ( j = 0; j < 8; j++ ) {
57  c = ( c & 1 ) ? poly ^ ( c >> 1 ) : ( c >> 1 );
58  }
59  crctable[i] = c;
60  }
61 }
62 
63 #else
64 
65 /*
66  Table of CRC-32's of all single-byte values (made by make_crc_table)
67 */
68 static unsigned long crctable[256] = {
69  0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL,
70  0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L,
71  0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L,
72  0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L,
73  0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
74  0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L,
75  0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL,
76  0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L,
77  0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L,
78  0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
79  0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L,
80  0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L,
81  0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L,
82  0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL,
83  0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
84  0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL,
85  0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL,
86  0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L,
87  0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L,
88  0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
89  0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL,
90  0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L,
91  0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL,
92  0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L,
93  0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
94  0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL,
95  0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L,
96  0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L,
97  0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L,
98  0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
99  0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L,
100  0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL,
101  0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL,
102  0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L,
103  0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
104  0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L,
105  0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL,
106  0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L,
107  0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL,
108  0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
109  0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L,
110  0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL,
111  0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L,
112  0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L,
113  0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
114  0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL,
115  0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L,
116  0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL,
117  0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL,
118  0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
119  0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L,
120  0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L,
121  0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL,
122  0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L,
123  0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
124  0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L,
125  0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L,
126  0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL,
127  0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L,
128  0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
129  0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L,
130  0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL,
131  0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L,
132  0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL
133 };
134 
135 #endif
136 
137 void CRC32_InitChecksum( unsigned long &crcvalue ) {
138  crcvalue = CRC32_INIT_VALUE;
139 }
140 
141 void CRC32_Update( unsigned long &crcvalue, const byte data ) {
142  crcvalue = crctable[ ( crcvalue ^ data ) & 0xff ] ^ ( crcvalue >> 8 );
143 }
144 
145 void CRC32_UpdateChecksum( unsigned long &crcvalue, const void *data, int length ) {
146  unsigned long crc;
147  const unsigned char *buf = (const unsigned char *) data;
148 
149  crc = crcvalue;
150  while( length-- ) {
151  crc = crctable[ ( crc ^ ( *buf++ ) ) & 0xff ] ^ ( crc >> 8 );
152  }
153  crcvalue = crc;
154 }
155 
156 void CRC32_FinishChecksum( unsigned long &crcvalue ) {
157  crcvalue ^= CRC32_XOR_VALUE;
158 }
159 
160 unsigned long CRC32_BlockChecksum( const void *data, int length ) {
161  unsigned long crc;
162 
163  CRC32_InitChecksum( crc );
164  CRC32_UpdateChecksum( crc, data, length );
165  CRC32_FinishChecksum( crc );
166  return crc;
167 }
unsigned long CRC32_BlockChecksum(const void *data, int length)
Definition: CRC32.cpp:160
void CRC32_Update(unsigned long &crcvalue, const byte data)
Definition: CRC32.cpp:141
#define CRC32_INIT_VALUE
Definition: CRC32.cpp:10
int i
Definition: process.py:33
void CRC32_InitChecksum(unsigned long &crcvalue)
Definition: CRC32.cpp:137
#define CRC32_XOR_VALUE
Definition: CRC32.cpp:11
const GLubyte * c
Definition: glext.h:4677
GLsizei GLsizei GLenum GLenum const GLvoid * data
Definition: glext.h:2853
Definition: eax4.h:1413
void CRC32_UpdateChecksum(unsigned long &crcvalue, const void *data, int length)
Definition: CRC32.cpp:145
void CRC32_FinishChecksum(unsigned long &crcvalue)
Definition: CRC32.cpp:156
unsigned char byte
Definition: Lib.h:75
GLsizei const GLcharARB const GLint * length
Definition: glext.h:3599
GLint j
Definition: qgl.h:264
GLfloat GLfloat p
Definition: glext.h:4674