1 /*
2 ===========================================================================
3 Copyright (C) 1999-2005 Id Software, Inc.
4 
5 This file is part of Quake III Arena source code.
6 
7 Quake III Arena source code is free software; you can redistribute it
8 and/or modify it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 2 of the License,
10 or (at your option) any later version.
11 
12 Quake III Arena source code is distributed in the hope that it will be
13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with Quake III Arena source code; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 ===========================================================================
21 */
22 
23 /*****************************************************************************
24  * name:		l_crc.c
25  *
26  * desc:		CRC calculation
27  *
28  * $Archive: /MissionPack/CODE/botlib/l_crc.c $
29  *
30  *****************************************************************************/
31 
32 #include <stdlib.h>
33 #include <stdio.h>
34 #include <string.h>
35 
36 #include "../qcommon/q_shared.h"
37 #include "botlib.h"
38 #include "be_interface.h"			//for botimport.Print
39 
40 
41 // FIXME: byte swap?
42 
43 // this is a 16 bit, non-reflected CRC using the polynomial 0x1021
44 // and the initial and final xor values shown below...  in other words, the
45 // CCITT standard CRC used by XMODEM
46 
47 #define CRC_INIT_VALUE	0xffff
48 #define CRC_XOR_VALUE	0x0000
49 
50 unsigned short crctable[257] =
51 {
52 	0x0000,	0x1021,	0x2042,	0x3063,	0x4084,	0x50a5,	0x60c6,	0x70e7,
53 	0x8108,	0x9129,	0xa14a,	0xb16b,	0xc18c,	0xd1ad,	0xe1ce,	0xf1ef,
54 	0x1231,	0x0210,	0x3273,	0x2252,	0x52b5,	0x4294,	0x72f7,	0x62d6,
55 	0x9339,	0x8318,	0xb37b,	0xa35a,	0xd3bd,	0xc39c,	0xf3ff,	0xe3de,
56 	0x2462,	0x3443,	0x0420,	0x1401,	0x64e6,	0x74c7,	0x44a4,	0x5485,
57 	0xa56a,	0xb54b,	0x8528,	0x9509,	0xe5ee,	0xf5cf,	0xc5ac,	0xd58d,
58 	0x3653,	0x2672,	0x1611,	0x0630,	0x76d7,	0x66f6,	0x5695,	0x46b4,
59 	0xb75b,	0xa77a,	0x9719,	0x8738,	0xf7df,	0xe7fe,	0xd79d,	0xc7bc,
60 	0x48c4,	0x58e5,	0x6886,	0x78a7,	0x0840,	0x1861,	0x2802,	0x3823,
61 	0xc9cc,	0xd9ed,	0xe98e,	0xf9af,	0x8948,	0x9969,	0xa90a,	0xb92b,
62 	0x5af5,	0x4ad4,	0x7ab7,	0x6a96,	0x1a71,	0x0a50,	0x3a33,	0x2a12,
63 	0xdbfd,	0xcbdc,	0xfbbf,	0xeb9e,	0x9b79,	0x8b58,	0xbb3b,	0xab1a,
64 	0x6ca6,	0x7c87,	0x4ce4,	0x5cc5,	0x2c22,	0x3c03,	0x0c60,	0x1c41,
65 	0xedae,	0xfd8f,	0xcdec,	0xddcd,	0xad2a,	0xbd0b,	0x8d68,	0x9d49,
66 	0x7e97,	0x6eb6,	0x5ed5,	0x4ef4,	0x3e13,	0x2e32,	0x1e51,	0x0e70,
67 	0xff9f,	0xefbe,	0xdfdd,	0xcffc,	0xbf1b,	0xaf3a,	0x9f59,	0x8f78,
68 	0x9188,	0x81a9,	0xb1ca,	0xa1eb,	0xd10c,	0xc12d,	0xf14e,	0xe16f,
69 	0x1080,	0x00a1,	0x30c2,	0x20e3,	0x5004,	0x4025,	0x7046,	0x6067,
70 	0x83b9,	0x9398,	0xa3fb,	0xb3da,	0xc33d,	0xd31c,	0xe37f,	0xf35e,
71 	0x02b1,	0x1290,	0x22f3,	0x32d2,	0x4235,	0x5214,	0x6277,	0x7256,
72 	0xb5ea,	0xa5cb,	0x95a8,	0x8589,	0xf56e,	0xe54f,	0xd52c,	0xc50d,
73 	0x34e2,	0x24c3,	0x14a0,	0x0481,	0x7466,	0x6447,	0x5424,	0x4405,
74 	0xa7db,	0xb7fa,	0x8799,	0x97b8,	0xe75f,	0xf77e,	0xc71d,	0xd73c,
75 	0x26d3,	0x36f2,	0x0691,	0x16b0,	0x6657,	0x7676,	0x4615,	0x5634,
76 	0xd94c,	0xc96d,	0xf90e,	0xe92f,	0x99c8,	0x89e9,	0xb98a,	0xa9ab,
77 	0x5844,	0x4865,	0x7806,	0x6827,	0x18c0,	0x08e1,	0x3882,	0x28a3,
78 	0xcb7d,	0xdb5c,	0xeb3f,	0xfb1e,	0x8bf9,	0x9bd8,	0xabbb,	0xbb9a,
79 	0x4a75,	0x5a54,	0x6a37,	0x7a16,	0x0af1,	0x1ad0,	0x2ab3,	0x3a92,
80 	0xfd2e,	0xed0f,	0xdd6c,	0xcd4d,	0xbdaa,	0xad8b,	0x9de8,	0x8dc9,
81 	0x7c26,	0x6c07,	0x5c64,	0x4c45,	0x3ca2,	0x2c83,	0x1ce0,	0x0cc1,
82 	0xef1f,	0xff3e,	0xcf5d,	0xdf7c,	0xaf9b,	0xbfba,	0x8fd9,	0x9ff8,
83 	0x6e17,	0x7e36,	0x4e55,	0x5e74,	0x2e93,	0x3eb2,	0x0ed1,	0x1ef0
84 };
85 
86 //===========================================================================
87 //
88 // Parameter:				-
89 // Returns:					-
90 // Changes Globals:		-
91 //===========================================================================
CRC_Init(unsigned short * crcvalue)92 void CRC_Init(unsigned short *crcvalue)
93 {
94 	*crcvalue = CRC_INIT_VALUE;
95 } //end of the function CRC_Init
96 //===========================================================================
97 //
98 // Parameter:				-
99 // Returns:					-
100 // Changes Globals:		-
101 //===========================================================================
CRC_ProcessByte(unsigned short * crcvalue,byte data)102 void CRC_ProcessByte(unsigned short *crcvalue, byte data)
103 {
104 	*crcvalue = (*crcvalue << 8) ^ crctable[(*crcvalue >> 8) ^ data];
105 } //end of the function CRC_ProcessByte
106 //===========================================================================
107 //
108 // Parameter:				-
109 // Returns:					-
110 // Changes Globals:		-
111 //===========================================================================
CRC_Value(unsigned short crcvalue)112 unsigned short CRC_Value(unsigned short crcvalue)
113 {
114 	return crcvalue ^ CRC_XOR_VALUE;
115 } //end of the function CRC_Value
116 //===========================================================================
117 //
118 // Parameter:				-
119 // Returns:					-
120 // Changes Globals:		-
121 //===========================================================================
CRC_ProcessString(unsigned char * data,int length)122 unsigned short CRC_ProcessString(unsigned char *data, int length)
123 {
124 	unsigned short crcvalue;
125 	int i, ind;
126 
127 	CRC_Init(&crcvalue);
128 
129 	for (i = 0; i < length; i++)
130 	{
131 		ind = (crcvalue >> 8) ^ data[i];
132 		if (ind < 0 || ind > 256) ind = 0;
133 		crcvalue = (crcvalue << 8) ^ crctable[ind];
134 	} //end for
135 	return CRC_Value(crcvalue);
136 } //end of the function CRC_ProcessString
137 //===========================================================================
138 //
139 // Parameter:				-
140 // Returns:					-
141 // Changes Globals:		-
142 //===========================================================================
CRC_ContinueProcessString(unsigned short * crc,char * data,int length)143 void CRC_ContinueProcessString(unsigned short *crc, char *data, int length)
144 {
145 	int i;
146 
147 	for (i = 0; i < length; i++)
148 	{
149 		*crc = (*crc << 8) ^ crctable[(*crc >> 8) ^ data[i]];
150 	} //end for
151 } //end of the function CRC_ProcessString
152