aboutsummaryrefslogtreecommitdiff
path: root/archival
diff options
context:
space:
mode:
authorDenys Vlasenko <dvlasenk@redhat.com>2010-10-27 15:26:45 +0200
committerDenys Vlasenko <dvlasenk@redhat.com>2010-10-27 15:26:45 +0200
commit9ce642f9746dfc29d119d0680b769677e3ea6da6 (patch)
treef8d2bcd08c691979058b610b32573a742a3e3024 /archival
parentdd88ba88f5082b1785539b1fb87af7320515b8c9 (diff)
downloadbusybox-9ce642f9746dfc29d119d0680b769677e3ea6da6.tar.gz
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>
Diffstat (limited to 'archival')
-rw-r--r--archival/gzip.c16
-rw-r--r--archival/libunarchive/decompress_unxz.c14
-rw-r--r--archival/libunarchive/decompress_unzip.c5
-rw-r--r--archival/lzop.c22
4 files changed, 15 insertions, 42 deletions
diff --git a/archival/gzip.c b/archival/gzip.c
index 32528d96b..4d399063d 100644
--- a/archival/gzip.c
+++ b/archival/gzip.c
@@ -340,7 +340,7 @@ struct globals {
ulg bits_sent; /* bit length of the compressed data */
#endif
- uint32_t *crc_32_tab;
+ /*uint32_t *crc_32_tab;*/
uint32_t crc; /* shift register contents */
};
@@ -393,15 +393,9 @@ static void put_32bit(ulg n)
* pointer, then initialize the crc shift register contents instead.
* Return the current crc in either case.
*/
-static uint32_t updcrc(uch * s, unsigned n)
+static void updcrc(uch * s, unsigned n)
{
- uint32_t c = G1.crc;
- while (n) {
- c = G1.crc_32_tab[(uch)(c ^ *s++)] ^ (c >> 8);
- n--;
- }
- G1.crc = c;
- return c;
+ G1.crc = crc32_block_endian0(G1.crc, s, n, global_crc32_table /*G1.crc_32_tab*/);
}
@@ -2104,8 +2098,8 @@ int gzip_main(int argc UNUSED_PARAM, char **argv)
ALLOC(uch, G1.window, 2L * WSIZE);
ALLOC(ush, G1.prev, 1L << BITS);
- /* Initialise the CRC32 table */
- G1.crc_32_tab = crc32_filltable(NULL, 0);
+ /* Initialize the CRC32 table */
+ global_crc32_table = crc32_filltable(NULL, 0);
return bbunpack(argv, pack_gzip, append_ext, "gz");
}
diff --git a/archival/libunarchive/decompress_unxz.c b/archival/libunarchive/decompress_unxz.c
index faba9ca82..ca427231e 100644
--- a/archival/libunarchive/decompress_unxz.c
+++ b/archival/libunarchive/decompress_unxz.c
@@ -22,17 +22,9 @@
/* We use our own crc32 function */
#define XZ_INTERNAL_CRC32 0
-static uint32_t *crc32_table;
static uint32_t xz_crc32(const uint8_t *buf, size_t size, uint32_t crc)
{
- crc = ~crc;
-
- while (size != 0) {
- crc = crc32_table[*buf++ ^ (crc & 0xFF)] ^ (crc >> 8);
- --size;
- }
-
- return ~crc;
+ return ~crc32_block_endian0(~crc, buf, size, global_crc32_table);
}
/* We use arch-optimized unaligned accessors */
@@ -53,8 +45,8 @@ unpack_xz_stream(int src_fd, int dst_fd)
unsigned char *membuf;
IF_DESKTOP(long long) int total = 0;
- if (!crc32_table)
- crc32_table = crc32_filltable(NULL, /*endian:*/ 0);
+ if (!global_crc32_table)
+ global_crc32_table = crc32_filltable(NULL, /*endian:*/ 0);
memset(&iobuf, 0, sizeof(iobuf));
/* Preload XZ file signature */
diff --git a/archival/libunarchive/decompress_unzip.c b/archival/libunarchive/decompress_unzip.c
index 20fda9d26..cb8a3d737 100644
--- a/archival/libunarchive/decompress_unzip.c
+++ b/archival/libunarchive/decompress_unzip.c
@@ -925,10 +925,7 @@ static int inflate_block(STATE_PARAM smallint *e)
/* Two callsites, both in inflate_get_next_window */
static void calculate_gunzip_crc(STATE_PARAM_ONLY)
{
- unsigned n;
- for (n = 0; n < gunzip_outbuf_count; n++) {
- gunzip_crc = gunzip_crc_table[((int) gunzip_crc ^ (gunzip_window[n])) & 0xff] ^ (gunzip_crc >> 8);
- }
+ gunzip_crc = crc32_block_endian0(gunzip_crc, gunzip_window, gunzip_outbuf_count, gunzip_crc_table);
gunzip_bytes_out += gunzip_outbuf_count;
}
diff --git a/archival/lzop.c b/archival/lzop.c
index c6e718ad7..acb34fe14 100644
--- a/archival/lzop.c
+++ b/archival/lzop.c
@@ -393,7 +393,7 @@ typedef struct header_t {
} header_t;
struct globals {
- const uint32_t *lzo_crc32_table;
+ /*const uint32_t *lzo_crc32_table;*/
chksum_t chksum_in;
chksum_t chksum_out;
} FIX_ALIASING;
@@ -468,19 +468,10 @@ lzo_adler32(uint32_t adler, const uint8_t* buf, unsigned len)
static FAST_FUNC uint32_t
lzo_crc32(uint32_t c, const uint8_t* buf, unsigned len)
{
- uint32_t crc;
+ //if (buf == NULL) - impossible
+ // return 0;
- if (buf == NULL)
- return 0;
-
- crc = ~c;
- if (len != 0) do {
- crc = G.lzo_crc32_table[(uint8_t)((int)crc ^ *buf)] ^ (crc >> 8);
- buf += 1;
- len -= 1;
- } while (len > 0);
-
- return ~crc;
+ return ~crc32_block_endian0(~c, buf, len, global_crc32_table);
}
/**********************************************************************/
@@ -679,8 +670,7 @@ static NOINLINE smallint lzo_compress(const header_t *h)
if (dst_len < src_len) {
/* write checksum of compressed block */
if (h->flags & F_ADLER32_C)
- write32(lzo_adler32(ADLER32_INIT_VALUE, b2,
- dst_len));
+ write32(lzo_adler32(ADLER32_INIT_VALUE, b2, dst_len));
if (h->flags & F_CRC32_C)
write32(lzo_crc32(CRC32_INIT_VALUE, b2, dst_len));
/* write compressed block data */
@@ -1080,6 +1070,6 @@ int lzop_main(int argc UNUSED_PARAM, char **argv)
if (applet_name[0] == 'u')
option_mask32 |= OPT_DECOMPRESS;
- G.lzo_crc32_table = crc32_filltable(NULL, 0);
+ global_crc32_table = crc32_filltable(NULL, 0);
return bbunpack(argv, pack_lzop, make_new_name_lzop, /*unused:*/ NULL);
}