Main Page | Class Hierarchy | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

l_crc.c

Go to the documentation of this file.
00001 /*
00002 ===========================================================================
00003 Copyright (C) 1999-2005 Id Software, Inc.
00004 
00005 This file is part of Quake III Arena source code.
00006 
00007 Quake III Arena source code is free software; you can redistribute it
00008 and/or modify it under the terms of the GNU General Public License as
00009 published by the Free Software Foundation; either version 2 of the License,
00010 or (at your option) any later version.
00011 
00012 Quake III Arena source code is distributed in the hope that it will be
00013 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015 GNU General Public License for more details.
00016 
00017 You should have received a copy of the GNU General Public License
00018 along with Foobar; if not, write to the Free Software
00019 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00020 ===========================================================================
00021 */
00022 
00023 /*****************************************************************************
00024  * name:        l_crc.c
00025  *
00026  * desc:        CRC calculation
00027  *
00028  * $Archive: /MissionPack/CODE/botlib/l_crc.c $
00029  *
00030  *****************************************************************************/
00031 
00032 #include <stdlib.h>
00033 #include <stdio.h>
00034 #include <string.h>
00035 
00036 #include "../game/q_shared.h"
00037 #include "../game/botlib.h"
00038 #include "be_interface.h"           //for botimport.Print
00039 
00040 
00041 // FIXME: byte swap?
00042 
00043 // this is a 16 bit, non-reflected CRC using the polynomial 0x1021
00044 // and the initial and final xor values shown below...  in other words, the
00045 // CCITT standard CRC used by XMODEM
00046 
00047 #define CRC_INIT_VALUE  0xffff
00048 #define CRC_XOR_VALUE   0x0000
00049 
00050 unsigned short crctable[257] =
00051 {
00052     0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
00053     0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
00054     0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
00055     0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
00056     0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
00057     0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
00058     0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
00059     0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
00060     0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
00061     0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
00062     0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
00063     0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
00064     0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
00065     0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
00066     0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
00067     0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
00068     0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
00069     0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
00070     0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
00071     0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
00072     0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
00073     0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
00074     0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
00075     0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
00076     0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
00077     0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
00078     0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
00079     0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
00080     0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
00081     0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
00082     0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
00083     0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
00084 };
00085 
00086 //===========================================================================
00087 //
00088 // Parameter:               -
00089 // Returns:                 -
00090 // Changes Globals:     -
00091 //===========================================================================
00092 void CRC_Init(unsigned short *crcvalue)
00093 {
00094     *crcvalue = CRC_INIT_VALUE;
00095 } //end of the function CRC_Init
00096 //===========================================================================
00097 //
00098 // Parameter:               -
00099 // Returns:                 -
00100 // Changes Globals:     -
00101 //===========================================================================
00102 void CRC_ProcessByte(unsigned short *crcvalue, byte data)
00103 {
00104     *crcvalue = (*crcvalue << 8) ^ crctable[(*crcvalue >> 8) ^ data];
00105 } //end of the function CRC_ProcessByte
00106 //===========================================================================
00107 //
00108 // Parameter:               -
00109 // Returns:                 -
00110 // Changes Globals:     -
00111 //===========================================================================
00112 unsigned short CRC_Value(unsigned short crcvalue)
00113 {
00114     return crcvalue ^ CRC_XOR_VALUE;
00115 } //end of the function CRC_Value
00116 //===========================================================================
00117 //
00118 // Parameter:               -
00119 // Returns:                 -
00120 // Changes Globals:     -
00121 //===========================================================================
00122 unsigned short CRC_ProcessString(unsigned char *data, int length)
00123 {
00124     unsigned short crcvalue;
00125     int i, ind;
00126 
00127     CRC_Init(&crcvalue);
00128 
00129     for (i = 0; i < length; i++)
00130     {
00131         ind = (crcvalue >> 8) ^ data[i];
00132         if (ind < 0 || ind > 256) ind = 0;
00133         crcvalue = (crcvalue << 8) ^ crctable[ind];
00134     } //end for
00135     return CRC_Value(crcvalue);
00136 } //end of the function CRC_ProcessString
00137 //===========================================================================
00138 //
00139 // Parameter:               -
00140 // Returns:                 -
00141 // Changes Globals:     -
00142 //===========================================================================
00143 void CRC_ContinueProcessString(unsigned short *crc, char *data, int length)
00144 {
00145     int i;
00146 
00147     for (i = 0; i < length; i++)
00148     {
00149         *crc = (*crc << 8) ^ crctable[(*crc >> 8) ^ data[i]];
00150     } //end for
00151 } //end of the function CRC_ProcessString

Generated on Thu Aug 25 12:37:12 2005 for Quake III Arena by  doxygen 1.3.9.1