mirror of
https://github.com/9fans/plan9port.git
synced 2025-01-15 11:20:03 +00:00
41 lines
604 B
C
41 lines
604 B
C
|
#include <u.h>
|
||
|
#include <libc.h>
|
||
|
#include <flate.h>
|
||
|
|
||
|
ulong*
|
||
|
mkcrctab(ulong poly)
|
||
|
{
|
||
|
ulong *crctab;
|
||
|
ulong 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;
|
||
|
}
|
||
|
|
||
|
ulong
|
||
|
blockcrc(ulong *crctab, ulong 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;
|
||
|
}
|