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