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