-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathcrc.c
52 lines (40 loc) · 897 Bytes
/
crc.c
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
46
47
48
49
50
51
52
#include "lib/buffer.h"
#include "lib/errmsg.h"
#include "lib/uint32.h"
uint32
crc32(uint32 crc, const char* data, size_t size) {
uint32 i, r = ~0;
const char* end = data + size;
while(data < end) {
r ^= *data++;
for(i = 0; i < 8; i++) {
uint32 t = ~((r & 1) - 1);
r = (r >> 1) ^ (0xedb88320 & t);
}
}
return ~r;
}
#if 1
int
main(int argc, char* argv[]) {
int i;
errmsg_iam(argv[0]);
for(i = 1; i < argc; ++i) {
buffer b;
unsigned long crc = 0;
if(buffer_mmapread(&b, argv[i]) == -1) {
errmsg_warn("error mapping '", argv[i], "': ", 0);
b.x = 0;
b.n = 0;
// return 127;
}
crc = crc32(crc, (const char*)b.x, b.n);
buffer_putxlong0(buffer_1, crc, 8);
buffer_putspace(buffer_1);
buffer_puts(buffer_1, argv[i]);
buffer_putnlflush(buffer_1);
buffer_close(&b);
}
return 0;
}
#endif