*
* endian = 1: big-endian
* endian = 0: little-endian
+ *
+ * Licensed under GPLv2, see file LICENSE in this source tree.
*/
-
#include "libbb.h"
-uint32_t *crc32_filltable(uint32_t *crc_table, int endian)
+uint32_t *global_crc32_table;
+
+uint32_t* FAST_FUNC crc32_filltable(uint32_t *crc_table, int endian)
{
uint32_t polynomial = endian ? 0x04c11db7 : 0xedb88320;
uint32_t c;
- int i, j;
+ unsigned i, j;
if (!crc_table)
crc_table = xmalloc(256 * sizeof(uint32_t));
return crc_table - 256;
}
+/* Common uses: */
+uint32_t* FAST_FUNC crc32_new_table_le(void)
+{
+ return crc32_filltable(NULL, 0);
+}
+uint32_t* FAST_FUNC global_crc32_new_table_le(void)
+{
+ global_crc32_table = crc32_new_table_le();
+ return global_crc32_table;
+}
+
+uint32_t FAST_FUNC crc32_block_endian1(uint32_t val, const void *buf, unsigned len, uint32_t *crc_table)
+{
+ const void *end = (uint8_t*)buf + len;
+
+ while (buf != end) {
+ val = (val << 8) ^ crc_table[(val >> 24) ^ *(uint8_t*)buf];
+ buf = (uint8_t*)buf + 1;
+ }
+ return val;
+}
+
+uint32_t FAST_FUNC crc32_block_endian0(uint32_t val, const void *buf, unsigned len, uint32_t *crc_table)
+{
+ const void *end = (uint8_t*)buf + len;
+
+ while (buf != end) {
+ val = crc_table[(uint8_t)val ^ *(uint8_t*)buf] ^ (val >> 8);
+ buf = (uint8_t*)buf + 1;
+ }
+ return val;
+}