|
0
|
1 #include "crc32i.h"
|
|
|
2
|
|
|
3 /* This builds our CRC table at compile-time rather than runtime.
|
|
|
4 * Note: We should have a way to change the polynomial at runtime too. */
|
|
|
5
|
|
|
6 #define CRC32_MASK(crc) (-((crc) & 1))
|
|
|
7
|
|
|
8 /* Does one iteration of the 8-time loop to generate one byte of the CRC table. */
|
|
|
9 #define CRC32_PRECALC_EX(crc) (((crc) >> 1) ^ ((CRC32_POLYNOMIAL) & CRC32_MASK(crc)))
|
|
|
10
|
|
|
11 /* Does all eight iterations of the loop to generate one byte. */
|
|
|
12 #define CRC32_PRECALC_E(byte) \
|
|
|
13 (CRC32_PRECALC_EX(CRC32_PRECALC_EX(CRC32_PRECALC_EX(CRC32_PRECALC_EX(CRC32_PRECALC_EX(CRC32_PRECALC_EX(CRC32_PRECALC_EX(CRC32_PRECALC_EX(byte)))))))))
|
|
|
14
|
|
|
15 /* Simple wrapper of CRC32_PRECALC_E that converts everything to uint32_t */
|
|
|
16 #define CRC32_PRECALC(byte) \
|
|
|
17 CRC32_PRECALC_E((uint32_t)(byte))
|
|
|
18
|
|
|
19 #define CRC32_PRECALC_0(byte) \
|
|
|
20 CRC32_PRECALC(byte), CRC32_PRECALC((byte) | 0x01)
|
|
|
21
|
|
|
22 #define CRC32_PRECALC_1(byte) \
|
|
|
23 CRC32_PRECALC_0(byte), CRC32_PRECALC_0((byte) | UINT32_C(0x02))
|
|
|
24
|
|
|
25 #define CRC32_PRECALC_2(byte) \
|
|
|
26 CRC32_PRECALC_1(byte), CRC32_PRECALC_1((byte) | UINT32_C(0x04))
|
|
|
27
|
|
|
28 #define CRC32_PRECALC_3(byte) \
|
|
|
29 CRC32_PRECALC_2(byte), CRC32_PRECALC_2((byte) | UINT32_C(0x08))
|
|
|
30
|
|
|
31 #define CRC32_PRECALC_4(byte) \
|
|
|
32 CRC32_PRECALC_3(byte), CRC32_PRECALC_3((byte) | UINT32_C(0x10))
|
|
|
33
|
|
|
34 #define CRC32_PRECALC_5(byte) \
|
|
|
35 CRC32_PRECALC_4(byte), CRC32_PRECALC_4((byte) | UINT32_C(0x20))
|
|
|
36
|
|
|
37 #define CRC32_PRECALC_6(byte) \
|
|
|
38 CRC32_PRECALC_5(byte), CRC32_PRECALC_5((byte) | UINT32_C(0x40))
|
|
|
39
|
|
|
40 #define CRC32_PRECALC_7(byte) \
|
|
|
41 CRC32_PRECALC_6(byte), CRC32_PRECALC_6((byte) | UINT32_C(0x80))
|
|
|
42
|
|
|
43 const uint32_t crc32_tab[256] = {
|
|
|
44 CRC32_PRECALC_7(0)
|
|
|
45 };
|
|
|
46
|
|
|
47 #undef CRC32_MASK
|
|
|
48 #undef CRC32_PRECALC_EX
|
|
|
49 #undef CRC32_PRECALC_E
|
|
|
50 #undef CRC32_PRECALC
|
|
|
51 #undef CRC32_PRECALC_0
|
|
|
52 #undef CRC32_PRECALC_1
|
|
|
53 #undef CRC32_PRECALC_2
|
|
|
54 #undef CRC32_PRECALC_3
|
|
|
55 #undef CRC32_PRECALC_4
|
|
|
56 #undef CRC32_PRECALC_5
|
|
|
57 #undef CRC32_PRECALC_6
|
|
|
58 #undef CRC32_PRECALC_7
|