#include "crc32.h"

/* Polynomial: 0xEDB88320 */

/* python3:
 * In [26]: apply = lambda st: ((st>>1) ^ 0xEDB88320) if (st & 1) else (st>>1)
 * In [27]: print(',\n'.join([ '0x{:08x}'.format(apply(apply(apply(apply(x))))) for x in range(16) ]))
 */
static uint32_t crc32_table[16] = {
	0x00000000,
	0x1db71064,
	0x3b6e20c8,
	0x26d930ac,
	0x76dc4190,
	0x6b6b51f4,
	0x4db26158,
	0x5005713c,
	0xedb88320,
	0xf00f9344,
	0xd6d6a3e8,
	0xcb61b38c,
	0x9b64c2b0,
	0x86d3d2d4,
	0xa00ae278,
	0xbdbdf21c
};

uint32_t crc32_update(uint32_t state, uint8_t c)
{
	state ^= c;
	state = (state>>4) ^ crc32_table[state&0xf];
	state = (state>>4) ^ crc32_table[state&0xf];
	return state;
}