]> code.delx.au - refind/blob - filesystems/crc32c.c
Added correct filesystem name detection to HFS+ driver.
[refind] / filesystems / crc32c.c
1 /*
2 * this file take from grub 2.0
3 * for btrfs UEFI driver
4 */
5
6 static uint32_t crc32c_table [256];
7
8 static void
9 init_crc32c_table (void)
10 {
11 auto uint32_t reflect (uint32_t ref, int len);
12 uint32_t reflect (uint32_t ref, int len)
13 {
14 uint32_t result = 0;
15 int i;
16
17 for (i = 1; i <= len; i++)
18 {
19 if (ref & 1)
20 result |= 1 << (len - i);
21 ref >>= 1;
22 }
23
24 return result;
25 }
26
27 static int crc32c_table_inited;
28 if(crc32c_table_inited)
29 return;
30 crc32c_table_inited = 1;
31
32 uint32_t polynomial = 0x1edc6f41;
33 int i, j;
34
35 for(i = 0; i < 256; i++)
36 {
37 crc32c_table[i] = reflect(i, 8) << 24;
38 for (j = 0; j < 8; j++)
39 crc32c_table[i] = (crc32c_table[i] << 1) ^
40 (crc32c_table[i] & (1 << 31) ? polynomial : 0);
41 crc32c_table[i] = reflect(crc32c_table[i], 32);
42 }
43 }
44
45 uint32_t
46 grub_getcrc32c (uint32_t crc, const void *buf, int size)
47 {
48 int i;
49 const uint8_t *data = buf;
50
51 if (! crc32c_table[1])
52 init_crc32c_table ();
53
54 crc^= 0xffffffff;
55
56 for (i = 0; i < size; i++)
57 {
58 crc = (crc >> 8) ^ crc32c_table[(crc & 0xFF) ^ *data];
59 data++;
60 }
61
62 return crc ^ 0xffffffff;
63 }