diff options
| author | Rob Landley <rob@landley.net> | 2006-04-10 17:07:15 +0000 |
|---|---|---|
| committer | Rob Landley <rob@landley.net> | 2006-04-10 17:07:15 +0000 |
| commit | c57ec37959390ff2e43faa5e4dd5281b2923ced3 (patch) | |
| tree | 8325e7bd6a9a270e931b383d33b5901751dd2a5e /libbb | |
| parent | 998f4493756423877217239d2cc42eb8b83d50b3 (diff) | |
| download | busybox-w32-c57ec37959390ff2e43faa5e4dd5281b2923ced3.tar.gz busybox-w32-c57ec37959390ff2e43faa5e4dd5281b2923ced3.tar.bz2 busybox-w32-c57ec37959390ff2e43faa5e4dd5281b2923ced3.zip | |
Patch from Rob Sullivan to consolidate crc32 table generation.
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 | } | ||
