Main Page | Alphabetical List | Compound List | File List | Compound Members | File Members

crc32.c

Go to the documentation of this file.
00001 /****************************************************************************************/
00002 /*  CRC32.C                                                                             */
00003 /*                                                                                      */
00004 /*  Author: Charles Bloom                                                               */
00005 /*  Description: CRC construction module                                                */
00006 /*                                                                                      */
00007 /*  The contents of this file are subject to the Genesis3D Public License               */
00008 /*  Version 1.01 (the "License"); you may not use this file except in                   */
00009 /*  compliance with the License. You may obtain a copy of the License at                */
00010 /*  http://www.genesis3d.com                                                            */
00011 /*                                                                                      */
00012 /*  Software distributed under the License is distributed on an "AS IS"                 */
00013 /*  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See                */
00014 /*  the License for the specific language governing rights and limitations              */
00015 /*  under the License.                                                                  */
00016 /*                                                                                      */
00017 /*  The Original Code is Genesis3D, released March 25, 1999.                            */
00018 /*Genesis3D Version 1.1 released November 15, 1999                            */
00019 /*  Copyright (C) 1999 WildTangent, Inc. All Rights Reserved           */
00020 /*                                                                                      */
00021 /****************************************************************************************/
00022 #include "crc32.h"
00023 
00024 static uint32 crc_table[256] =
00025 {
00026   0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419,
00027   0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4,
00028   0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07,
00029   0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
00030   0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856,
00031   0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,
00032   0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4,
00033   0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
00034   0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3,
00035   0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A,
00036   0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599,
00037   0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
00038   0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190,
00039   0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F,
00040   0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E,
00041   0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
00042   0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED,
00043   0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,
00044   0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3,
00045   0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
00046   0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A,
00047   0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5,
00048   0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010,
00049   0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
00050   0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17,
00051   0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6,
00052   0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615,
00053   0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
00054   0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344,
00055   0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
00056   0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A,
00057   0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
00058   0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1,
00059   0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C,
00060   0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF,
00061   0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
00062   0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE,
00063   0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31,
00064   0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C,
00065   0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
00066   0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B,
00067   0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,
00068   0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1,
00069   0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
00070   0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278,
00071   0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7,
00072   0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66,
00073   0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
00074   0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605,
00075   0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8,
00076   0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B,
00077   0x2D02EF8D
00078 };
00079 
00080 #define STEPCRC(crc,byte) crc = crc_table[((int)crc ^ (byte)) & 0xff] ^ (crc >> 8)
00081 
00082 uint32 CRC32_Start(void)
00083 {
00084 return (~((uint32)0));
00085 }
00086 
00087 uint32 CRC32_Finish(uint32 crc)
00088 {
00089 return (~crc);
00090 }
00091 
00092 uint32 CRC32_AddByte(uint32 crc,uint8 b) 
00093 {
00094         STEPCRC(crc,b);
00095 return(crc); 
00096 }
00097 
00098 uint32 CRC32_AddWord(uint32 crc,uint16 w) 
00099 { 
00100 uint8 *ptr;
00101         ptr = (uint8 *)&w;
00102         STEPCRC(crc,ptr[0]);
00103         STEPCRC(crc,ptr[1]);
00104 return(crc); 
00105 }
00106 
00107 uint32 CRC32_AddLong(uint32 crc,uint32 l) 
00108 {
00109 uint8 *ptr;
00110         ptr = (uint8 *)&l;
00111         STEPCRC(crc,ptr[0]);
00112         STEPCRC(crc,ptr[1]);
00113         STEPCRC(crc,ptr[2]);
00114         STEPCRC(crc,ptr[3]);
00115 return(crc); 
00116 }
00117 
00118 uint32 CRC32_Array(const uint8 * buf,uint32 buflen)
00119 {
00120 uint32 crc = (~((uint32)0));
00121 
00122         if (!buf ) return 0;
00123 
00124         while( (buflen&0xF) != 0 )
00125         {
00126                 STEPCRC(crc,*buf); buf++;
00127                 buflen--;
00128         }
00129 
00130         buflen>>=4; /* 16 at a time */
00131 
00132         while(buflen--)
00133         {
00134                 STEPCRC(crc,*buf); buf++;
00135                 STEPCRC(crc,*buf); buf++;
00136                 STEPCRC(crc,*buf); buf++;
00137                 STEPCRC(crc,*buf); buf++;
00138 
00139                 STEPCRC(crc,*buf); buf++;
00140                 STEPCRC(crc,*buf); buf++;
00141                 STEPCRC(crc,*buf); buf++;
00142                 STEPCRC(crc,*buf); buf++;
00143 
00144                 STEPCRC(crc,*buf); buf++;
00145                 STEPCRC(crc,*buf); buf++;
00146                 STEPCRC(crc,*buf); buf++;
00147                 STEPCRC(crc,*buf); buf++;
00148 
00149                 STEPCRC(crc,*buf); buf++;
00150                 STEPCRC(crc,*buf); buf++;
00151                 STEPCRC(crc,*buf); buf++;
00152                 STEPCRC(crc,*buf); buf++;
00153         }
00154 
00155         crc ^= 0xFFFFFFFF;
00156 
00157 return crc;
00158 }
00159 

Generated on Tue Sep 30 12:35:26 2003 for GTestAndEngine by doxygen 1.3.2