libbb: introduce and use common crc32 routine
function old new delta crc32_block_endian1 - 37 +37 crc32_block_endian0 - 34 +34 global_crc32_table - 8 +8 file_read 82 87 +5 gzip_main 211 214 +3 xz_crc32 40 35 -5 crc32_table 8 - -8 calculate_gunzip_crc 54 34 -20 lzo_crc32 54 25 -29 cksum_main 298 211 -87 ------------------------------------------------------------------------------ (add/remove: 3/1 grow/shrink: 2/4 up/down: 87/-149) Total: -62 bytes Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
This commit is contained in:
@@ -18,6 +18,8 @@
|
||||
|
||||
#include "libbb.h"
|
||||
|
||||
uint32_t *global_crc32_table;
|
||||
|
||||
uint32_t* FAST_FUNC crc32_filltable(uint32_t *crc_table, int endian)
|
||||
{
|
||||
uint32_t polynomial = endian ? 0x04c11db7 : 0xedb88320;
|
||||
@@ -40,3 +42,25 @@ uint32_t* FAST_FUNC crc32_filltable(uint32_t *crc_table, int endian)
|
||||
|
||||
return crc_table - 256;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user