Blame view

lib/xz/xz_crc32.c 1.24 KB
24fa0402a   Lasse Collin   decompressors: ad...
1
2
3
4
  /*
   * CRC32 using the polynomial from IEEE-802.3
   *
   * Authors: Lasse Collin <lasse.collin@tukaani.org>
d89775fc9   Alexander A. Klimov   lib/: replace HTT...
5
   *          Igor Pavlov <https://7-zip.org/>
24fa0402a   Lasse Collin   decompressors: ad...
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
   *
   * This file has been put into the public domain.
   * You can do whatever you want with this file.
   */
  
  /*
   * This is not the fastest implementation, but it is pretty compact.
   * The fastest versions of xz_crc32() on modern CPUs without hardware
   * accelerated CRC instruction are 3-5 times as fast as this version,
   * but they are bigger and use more memory for the lookup table.
   */
  
  #include "xz_private.h"
  
  /*
   * STATIC_RW_DATA is used in the pre-boot environment on some architectures.
   * See <linux/decompress/mm.h> for details.
   */
  #ifndef STATIC_RW_DATA
  #	define STATIC_RW_DATA static
  #endif
  
  STATIC_RW_DATA uint32_t xz_crc32_table[256];
  
  XZ_EXTERN void xz_crc32_init(void)
  {
faa16bc40   Krzysztof Kozlowski   lib: Use existing...
32
  	const uint32_t poly = CRC32_POLY_LE;
24fa0402a   Lasse Collin   decompressors: ad...
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
  
  	uint32_t i;
  	uint32_t j;
  	uint32_t r;
  
  	for (i = 0; i < 256; ++i) {
  		r = i;
  		for (j = 0; j < 8; ++j)
  			r = (r >> 1) ^ (poly & ~((r & 1) - 1));
  
  		xz_crc32_table[i] = r;
  	}
  
  	return;
  }
  
  XZ_EXTERN uint32_t xz_crc32(const uint8_t *buf, size_t size, uint32_t crc)
  {
  	crc = ~crc;
  
  	while (size != 0) {
  		crc = xz_crc32_table[*buf++ ^ (crc & 0xFF)] ^ (crc >> 8);
  		--size;
  	}
  
  	return ~crc;
  }