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 Colombiermkcrctab(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 Colombierblockcrc(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