Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
7740 pavelyakov 1
/* CRC32 function; Author PaulCodeman */
2
:dword crc32Table = 0;
3
:dword makeCRCTable(void)
4
{
5
	dword i = 0;
6
	dword c = 0;
7
	dword ii = 0;
8
	dword crcTable = 0;
9
	IF (crc32Table) RETURN 0;
10
	crc32Table = malloc(4*256);
11
	crcTable = crc32Table;
12
	WHILE (i < 256)
13
	{
14
		c = i;
15
		ii = 0;
16
		WHILE (ii < 8)
17
		{
18
			IF (c&1)
19
			{
20
				c >>= 1;
21
				c ^= 0xEDB88320;
22
			}
23
			ELSE c >>= 1;
24
			ii++;
25
		}
26
		DSDWORD[crcTable] = c;
27
		crcTable += 4;
28
		i++;
29
	}
30
}
31
:dword crc32(dword bytes, length)
32
{
33
	dword crc = 0;
34
	dword i = 0;
35
	byte b = 0;
36
	IF (!crc32Table) makeCRCTable();
37
	crc = 0xFFFFFFFF;
38
	WHILE (i < length)
39
	{
40
		b = DSBYTE[bytes];
41
		bytes++;
42
		EDX = crc^b;
43
		EDX &= 0xFF;
44
		EDX <<= 2;
45
		EDX += crc32Table;
46
		crc >>= 8;
47
		crc ^= DSDWORD[EDX];
48
		i++;
49
	}
50
	RETURN crc ^ 0xFFFFFFFF;
51
}
52
 
53
/* EXAMPLE
54
dword str = 0;
55
str = "Kevin van Zonneveld";
56
crc32(str, strlen(str));
57
IF (EAX == 1249991249) ExitProcess();
58
*/