From 9ce642f9746dfc29d119d0680b769677e3ea6da6 Mon Sep 17 00:00:00 2001
From: Denys Vlasenko <dvlasenk@redhat.com>
Date: Wed, 27 Oct 2010 15:26:45 +0200
Subject: 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>
---
 libbb/crc32.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

(limited to 'libbb')

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 @@
 
 #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;
+}
-- 
cgit v1.2.3-55-g6feb