blob: d25eeec289de35066f6e9bcc324ddb763343d10a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
implement Crc;
include "crc.m";
init(poly : int, reg : int) : ref CRCstate
{
if (poly == 0)
poly = int 16redb88320;
tab := array[256] of int;
for(i := 0; i < 256; i++){
crc := i;
for(j := 0; j < 8; j++){
c := crc & 1;
crc = (crc >> 1) & 16r7fffffff;
if(c)
crc ^= poly;
}
tab[i] = crc;
}
crcs := ref CRCstate;
crcs.crc = 0;
crcs.crctab = tab;
crcs.reg = reg;
return crcs;
}
crc(crcs : ref CRCstate, buf : array of byte, nb : int) : int
{
n := nb;
if (n > len buf)
n = len buf;
crc := crcs.crc;
tab := crcs.crctab;
crc ^= crcs.reg;
for (i := 0; i < n; i++)
crc = tab[int(byte crc ^ buf[i])] ^ ((crc >> 8) & 16r00ffffff);
crc ^= crcs.reg;
crcs.crc = crc;
return crc;
}
reset(crcs : ref CRCstate)
{
crcs.crc = 0;
}
|