Skip to content

Latest commit

 

History

History
81 lines (66 loc) · 2.14 KB

checksum_crc32.c

File metadata and controls

81 lines (66 loc) · 2.14 KB
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "universal.h"
#if SUPPORT_CRC32
void MojoCrc32_init(MojoCrc32 *context)
{
*context = (MojoCrc32) 0xFFFFFFFF;
} // MojoCrc32_init
void MojoCrc32_append(MojoCrc32 *_crc, const uint8 *buf, uint32 len)
{
uint32 crc = (uint32) *_crc;
Sep 25, 2007
Sep 25, 2007
15
uint32 n;
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
for (n = 0; n < len; n++)
{
uint32 xorval = (uint32) ((crc ^ buf[n]) & 0xFF);
xorval = ((xorval & 1) ? (0xEDB88320 ^ (xorval >> 1)) : (xorval >> 1));
xorval = ((xorval & 1) ? (0xEDB88320 ^ (xorval >> 1)) : (xorval >> 1));
xorval = ((xorval & 1) ? (0xEDB88320 ^ (xorval >> 1)) : (xorval >> 1));
xorval = ((xorval & 1) ? (0xEDB88320 ^ (xorval >> 1)) : (xorval >> 1));
xorval = ((xorval & 1) ? (0xEDB88320 ^ (xorval >> 1)) : (xorval >> 1));
xorval = ((xorval & 1) ? (0xEDB88320 ^ (xorval >> 1)) : (xorval >> 1));
xorval = ((xorval & 1) ? (0xEDB88320 ^ (xorval >> 1)) : (xorval >> 1));
xorval = ((xorval & 1) ? (0xEDB88320 ^ (xorval >> 1)) : (xorval >> 1));
crc = xorval ^ (crc >> 8);
} // for
*_crc = (MojoCrc32) crc;
} // MojoCrc32_append
void MojoCrc32_finish(MojoCrc32 *context, uint32 *digest)
{
*digest = (*context ^ 0xFFFFFFFF);
} // MojoCrc32_finish
#endif // SUPPORT_CRC32
#if TEST_CRC32
int main(int argc, char **argv)
{
int i = 0;
for (i = 1; i < argc; i++)
{
FILE *in = NULL;
MojoCrc32 ctx;
MojoCrc32_init(&ctx);
in = fopen(argv[i], "rb");
if (!in)
perror("fopen");
else
{
uint32 digest = 0;
int err = 0;
while ( (!err) && (!feof(in)) )
{
uint8 buf[1024];
size_t rc = fread(buf, 1, sizeof (buf), in);
if (rc > 0)
MojoCrc32_append(&ctx, buf, rc);
err = ferror(in);
} // while
if (err)
perror("fread");
fclose(in);
MojoCrc32_finish(&ctx, &digest);
if (!err)
printf("%s: %X\n", argv[i], (unsigned int) digest);
} // else
} // for
return 0;
} // main
#endif
// end of checksum_crc32.c ...