1 
2 /* locals */
3 static unsigned int crc_table[256];
4 
5 
6 /* ----
7  * crc_init()
8  * ----
9  */
10 
11 void
crc_init(void)12 crc_init(void)
13 {
14 	int i;
15 	unsigned int t, *p, *q;
16 	unsigned int poly = 0x864CFB;
17 
18 	p = q = crc_table;
19 	*q++ = 0;
20 	*q++ = poly;
21 
22 	for (i = 1; i < 128; i++) {
23 		t = *(++p);
24 		if (t & 0x800000) {
25 			t <<= 1;
26 			*q++ = t ^ poly;
27 			*q++ = t;
28 		}
29 		else {
30 			t <<= 1;
31 			*q++ = t;
32 			*q++ = t ^ poly;
33 		}
34 	}
35 }
36 
37 
38 /* ----
39  * crc_calc()
40  * ----
41  * 24-bit crc
42  */
43 
44 unsigned int
crc_calc(unsigned char * data,int len)45 crc_calc(unsigned char *data, int len)
46 {
47 	unsigned int crc = 0;
48 	int i;
49 
50 	for (i = 0; i < len; i++)
51 		crc = (crc << 8) ^ crc_table[(unsigned char)(crc >> 16) ^ *data++];
52 
53 	/* ok */
54 	return (crc & 0xFFFFFF);
55 }
56 
57