brintos

brintos / linux-shallow public Read only

0
0
Text · 1.1 KiB · 6a7906a Raw
59 lines · c
1// SPDX-License-Identifier: 0BSD2 3/*4 * CRC32 using the polynomial from IEEE-802.35 *6 * Authors: Lasse Collin <lasse.collin@tukaani.org>7 *          Igor Pavlov <https://7-zip.org/>8 */9 10/*11 * This is not the fastest implementation, but it is pretty compact.12 * The fastest versions of xz_crc32() on modern CPUs without hardware13 * accelerated CRC instruction are 3-5 times as fast as this version,14 * but they are bigger and use more memory for the lookup table.15 */16 17#include "xz_private.h"18 19/*20 * STATIC_RW_DATA is used in the pre-boot environment on some architectures.21 * See <linux/decompress/mm.h> for details.22 */23#ifndef STATIC_RW_DATA24#	define STATIC_RW_DATA static25#endif26 27STATIC_RW_DATA uint32_t xz_crc32_table[256];28 29void xz_crc32_init(void)30{31	const uint32_t poly = 0xEDB88320;32 33	uint32_t i;34	uint32_t j;35	uint32_t r;36 37	for (i = 0; i < 256; ++i) {38		r = i;39		for (j = 0; j < 8; ++j)40			r = (r >> 1) ^ (poly & ~((r & 1) - 1));41 42		xz_crc32_table[i] = r;43	}44 45	return;46}47 48uint32_t xz_crc32(const uint8_t *buf, size_t size, uint32_t crc)49{50	crc = ~crc;51 52	while (size != 0) {53		crc = xz_crc32_table[*buf++ ^ (crc & 0xFF)] ^ (crc >> 8);54		--size;55	}56 57	return ~crc;58}59