xref: /inferno-os/os/boot/libflate/crc.c (revision 74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a)
1*74a4d8c2SCharles.Forsyth #include "lib9.h"
2*74a4d8c2SCharles.Forsyth #include <flate.h>
3*74a4d8c2SCharles.Forsyth 
4*74a4d8c2SCharles.Forsyth ulong*
mkcrctab(ulong poly)5*74a4d8c2SCharles.Forsyth mkcrctab(ulong poly)
6*74a4d8c2SCharles.Forsyth {
7*74a4d8c2SCharles.Forsyth 	ulong *crctab;
8*74a4d8c2SCharles.Forsyth 	ulong crc;
9*74a4d8c2SCharles.Forsyth 	int i, j;
10*74a4d8c2SCharles.Forsyth 
11*74a4d8c2SCharles.Forsyth 	crctab = malloc(256 * sizeof(ulong));
12*74a4d8c2SCharles.Forsyth 	if(crctab == nil)
13*74a4d8c2SCharles.Forsyth 		return nil;
14*74a4d8c2SCharles.Forsyth 
15*74a4d8c2SCharles.Forsyth 	for(i = 0; i < 256; i++){
16*74a4d8c2SCharles.Forsyth 		crc = i;
17*74a4d8c2SCharles.Forsyth 		for(j = 0; j < 8; j++){
18*74a4d8c2SCharles.Forsyth 			if(crc & 1)
19*74a4d8c2SCharles.Forsyth 				crc = (crc >> 1) ^ poly;
20*74a4d8c2SCharles.Forsyth 			else
21*74a4d8c2SCharles.Forsyth 				crc >>= 1;
22*74a4d8c2SCharles.Forsyth 		}
23*74a4d8c2SCharles.Forsyth 		crctab[i] = crc;
24*74a4d8c2SCharles.Forsyth 	}
25*74a4d8c2SCharles.Forsyth 	return crctab;
26*74a4d8c2SCharles.Forsyth }
27*74a4d8c2SCharles.Forsyth 
28*74a4d8c2SCharles.Forsyth ulong
blockcrc(ulong * crctab,ulong crc,void * vbuf,int n)29*74a4d8c2SCharles.Forsyth blockcrc(ulong *crctab, ulong crc, void *vbuf, int n)
30*74a4d8c2SCharles.Forsyth {
31*74a4d8c2SCharles.Forsyth 	uchar *buf, *ebuf;
32*74a4d8c2SCharles.Forsyth 
33*74a4d8c2SCharles.Forsyth 	crc ^= 0xffffffff;
34*74a4d8c2SCharles.Forsyth 	buf = vbuf;
35*74a4d8c2SCharles.Forsyth 	ebuf = buf + n;
36*74a4d8c2SCharles.Forsyth 	while(buf < ebuf)
37*74a4d8c2SCharles.Forsyth 		crc = crctab[(crc & 0xff) ^ *buf++] ^ (crc >> 8);
38*74a4d8c2SCharles.Forsyth 	return crc ^ 0xffffffff;
39*74a4d8c2SCharles.Forsyth }
40