Line data Source code
1 : //
2 : // compute CRC32C checksum
3 : //
4 :
5 : #include <stdio.h>
6 : #include <stdlib.h>
7 : #include <unistd.h>
8 : #include "crc32c.h"
9 :
10 : #define SIZE (262144*3)
11 : #define CHUNK SIZE
12 :
13 0 : int main(int argc, char **argv)
14 : {
15 : char *buf;
16 : ssize_t got;
17 : size_t off, n;
18 : uint32_t crc;
19 :
20 : (void)argv;
21 0 : crc = 0;
22 0 : buf = (char*)malloc(SIZE);
23 0 : if (buf == NULL) {
24 0 : fputs("out of memory", stderr);
25 0 : return 1;
26 : }
27 0 : while ((got = read(0, buf, SIZE)) > 0) {
28 0 : off = 0;
29 : do {
30 0 : n = (size_t)got - off;
31 0 : if (n > CHUNK)
32 0 : n = CHUNK;
33 0 : crc = argc > 1 ? crc32c_sw(crc, buf + off, n) :
34 0 : crc32c(crc, buf + off, n);
35 0 : off += n;
36 0 : } while (off < (size_t)got);
37 : }
38 0 : free(buf);
39 0 : if (got == -1) {
40 0 : fputs("read error\n", stderr);
41 0 : return 1;
42 : }
43 0 : printf("%08x\n", crc);
44 0 : return 0;
45 : }
46 :
47 : /* emacs
48 : * Local Variables:
49 : * tab-width: 8
50 : * c-basic-offset: 3
51 : * indent-tabs-mode: nil
52 : * End:
53 : */
|