1*74a4d8c2SCharles.Forsyth #include "lib9.h" 2*74a4d8c2SCharles.Forsyth #include <flate.h> 3*74a4d8c2SCharles.Forsyth 4*74a4d8c2SCharles.Forsyth ulong* mkcrctab(ulong poly)5*74a4d8c2SCharles.Forsythmkcrctab(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.Forsythblockcrc(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