| #include <u.h> |
| #include <libc.h> |
| #include <flate.h> |
| |
| uint32* |
| mkcrctab(uint32 poly) |
| { |
| uint32 *crctab; |
| uint32 crc; |
| int i, j; |
| |
| crctab = malloc(256 * sizeof(ulong)); |
| if(crctab == nil) |
| return nil; |
| |
| for(i = 0; i < 256; i++){ |
| crc = i; |
| for(j = 0; j < 8; j++){ |
| if(crc & 1) |
| crc = (crc >> 1) ^ poly; |
| else |
| crc >>= 1; |
| } |
| crctab[i] = crc; |
| } |
| return crctab; |
| } |
| |
| uint32 |
| blockcrc(uint32 *crctab, uint32 crc, void *vbuf, int n) |
| { |
| uchar *buf, *ebuf; |
| |
| crc ^= 0xffffffff; |
| buf = vbuf; |
| ebuf = buf + n; |
| while(buf < ebuf) |
| crc = crctab[(crc & 0xff) ^ *buf++] ^ (crc >> 8); |
| return crc ^ 0xffffffff; |
| } |