diff options
Diffstat (limited to 'libbb/crc32.c')
-rw-r--r-- | libbb/crc32.c | 40 |
1 files changed, 40 insertions, 0 deletions
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 | } | ||