diff options
author | landley <landley@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2006-04-10 17:07:15 +0000 |
---|---|---|
committer | landley <landley@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2006-04-10 17:07:15 +0000 |
commit | f842a4683d0b95694fea213bf29de028ab33203b (patch) | |
tree | 8325e7bd6a9a270e931b383d33b5901751dd2a5e /libbb | |
parent | 9ba72d7b7942e7670a701647252d49a32da87b69 (diff) | |
download | busybox-w32-f842a4683d0b95694fea213bf29de028ab33203b.tar.gz busybox-w32-f842a4683d0b95694fea213bf29de028ab33203b.tar.bz2 busybox-w32-f842a4683d0b95694fea213bf29de028ab33203b.zip |
Patch from Rob Sullivan to consolidate crc32 table generation.
git-svn-id: svn://busybox.net/trunk/busybox@14785 69ca8d6d-28ef-0310-b511-8ec308f3f277
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/Makefile.in | 2 | ||||
-rw-r--r-- | libbb/crc32.c | 40 |
2 files changed, 41 insertions, 1 deletions
diff --git a/libbb/Makefile.in b/libbb/Makefile.in index 338a5be97..2d9a1745d 100644 --- a/libbb/Makefile.in +++ b/libbb/Makefile.in | |||
@@ -13,7 +13,7 @@ LIBBB-n:= | |||
13 | LIBBB-y:= \ | 13 | LIBBB-y:= \ |
14 | bb_asprintf.c ask_confirmation.c change_identity.c chomp.c \ | 14 | bb_asprintf.c ask_confirmation.c change_identity.c chomp.c \ |
15 | compare_string_array.c concat_path_file.c copy_file.c copyfd.c \ | 15 | compare_string_array.c concat_path_file.c copy_file.c copyfd.c \ |
16 | create_icmp_socket.c create_icmp6_socket.c \ | 16 | crc32.c create_icmp_socket.c create_icmp6_socket.c \ |
17 | device_open.c dump.c error_msg.c error_msg_and_die.c find_mount_point.c \ | 17 | device_open.c dump.c error_msg.c error_msg_and_die.c find_mount_point.c \ |
18 | find_pid_by_name.c find_root_device.c fgets_str.c full_read.c \ | 18 | find_pid_by_name.c find_root_device.c fgets_str.c full_read.c \ |
19 | full_write.c get_last_path_component.c get_line_from_file.c \ | 19 | full_write.c get_last_path_component.c get_line_from_file.c \ |
diff --git a/libbb/crc32.c b/libbb/crc32.c new file mode 100644 index 000000000..03609952d --- /dev/null +++ b/libbb/crc32.c | |||
@@ -0,0 +1,40 @@ | |||
1 | /* vi: set sw=4 ts=4: */ | ||
2 | /* | ||
3 | * CRC32 table fill function | ||
4 | * Copyright (C) 2006 by Rob Sullivan <cogito.ergo.cogito@gmail.com> | ||
5 | * (I can't really claim much credit however, as the algorithm is | ||
6 | * very well-known) | ||
7 | * | ||
8 | * The following function creates a CRC32 table depending on whether | ||
9 | * a big-endian (0x04c11db7) or little-endian (0xedb88320) CRC32 is | ||
10 | * required. Admittedly, there are other CRC32 polynomials floating | ||
11 | * around, but Busybox doesn't use them. | ||
12 | * | ||
13 | * endian = 1: big-endian | ||
14 | * endian = 0: little-endian | ||
15 | */ | ||
16 | |||
17 | #include <stdio.h> | ||
18 | #include <stdlib.h> | ||
19 | #include "libbb.h" | ||
20 | |||
21 | uint32_t *bb_crc32_filltable (int endian) { | ||
22 | |||
23 | uint32_t *crc_table = xmalloc(256 * sizeof(uint32_t)); | ||
24 | uint32_t polynomial = endian ? 0x04c11db7 : 0xedb88320; | ||
25 | uint32_t c; | ||
26 | int i, j; | ||
27 | |||
28 | for (i = 0; i < 256; i++) { | ||
29 | c = endian ? (i << 24) : i; | ||
30 | for (j = 8; j; j--) { | ||
31 | if (endian) | ||
32 | c = (c&0x80000000) ? ((c << 1) ^ polynomial) : (c << 1); | ||
33 | else | ||
34 | c = (c&1) ? ((c >> 1) ^ polynomial) : (c >> 1); | ||
35 | } | ||
36 | *crc_table++ = c; | ||
37 | } | ||
38 | |||
39 | return crc_table - 256; | ||
40 | } | ||