diff options
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/crc32.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/libbb/crc32.c b/libbb/crc32.c index 520b1ffb9..2cc6ea779 100644 --- a/libbb/crc32.c +++ b/libbb/crc32.c | |||
@@ -18,6 +18,8 @@ | |||
18 | 18 | ||
19 | #include "libbb.h" | 19 | #include "libbb.h" |
20 | 20 | ||
21 | uint32_t *global_crc32_table; | ||
22 | |||
21 | uint32_t* FAST_FUNC crc32_filltable(uint32_t *crc_table, int endian) | 23 | uint32_t* FAST_FUNC crc32_filltable(uint32_t *crc_table, int endian) |
22 | { | 24 | { |
23 | uint32_t polynomial = endian ? 0x04c11db7 : 0xedb88320; | 25 | uint32_t polynomial = endian ? 0x04c11db7 : 0xedb88320; |
@@ -40,3 +42,25 @@ uint32_t* FAST_FUNC crc32_filltable(uint32_t *crc_table, int endian) | |||
40 | 42 | ||
41 | return crc_table - 256; | 43 | return crc_table - 256; |
42 | } | 44 | } |
45 | |||
46 | uint32_t FAST_FUNC crc32_block_endian1(uint32_t val, const void *buf, unsigned len, uint32_t *crc_table) | ||
47 | { | ||
48 | const void *end = (uint8_t*)buf + len; | ||
49 | |||
50 | while (buf != end) { | ||
51 | val = (val << 8) ^ crc_table[(val >> 24) ^ *(uint8_t*)buf]; | ||
52 | buf = (uint8_t*)buf + 1; | ||
53 | } | ||
54 | return val; | ||
55 | } | ||
56 | |||
57 | uint32_t FAST_FUNC crc32_block_endian0(uint32_t val, const void *buf, unsigned len, uint32_t *crc_table) | ||
58 | { | ||
59 | const void *end = (uint8_t*)buf + len; | ||
60 | |||
61 | while (buf != end) { | ||
62 | val = crc_table [(uint8_t)val ^ *(uint8_t*)buf] ^ (val >> 8); | ||
63 | buf = (uint8_t*)buf + 1; | ||
64 | } | ||
65 | return val; | ||
66 | } | ||