Blame scripts/LOMHash.c

Packit Service 5a9772
#include <stdio.h>
Packit 1fb8d4
typedef unsigned short UINT16;
Packit 1fb8d4
typedef unsigned char BYTE;
Packit Service 5a9772
static UINT16 HuffCodeLOM[] = { 0x0001, 0x0000, 0x0002, 0x0009, 0x0006, 0x0005, 0x000d, 0x000b,
Packit Service 5a9772
	                            0x0003, 0x001b, 0x0007, 0x0017, 0x0037, 0x000f, 0x004f, 0x006f,
Packit Service 5a9772
	                            0x002f, 0x00ef, 0x001f, 0x005f, 0x015f, 0x009f, 0x00df, 0x01df,
Packit Service 5a9772
	                            0x003f, 0x013f, 0x00bf, 0x01bf, 0x007f, 0x017f, 0x00ff, 0x01ff };
Packit 1fb8d4
Packit 1fb8d4
UINT16 HashTable[32] = { [0 ... 31] = 0xffff };
Packit 1fb8d4
Packit 1fb8d4
BYTE tab[4] = { 0, 4, 10, 19 };
Packit 1fb8d4
Packit 1fb8d4
UINT16 hash(UINT16 key)
Packit 1fb8d4
{
Packit Service 5a9772
	return ((key & 0x1f) ^ (key >> 5) ^ (key >> 9));
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BYTE minihash(UINT16 key)
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE h;
Packit 1fb8d4
	h = (key >> 4) & 0xf;
Packit 1fb8d4
	return ((h ^ (h >> 2) ^ (h >> 3)) & 0x3);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
void buildhashtable(void)
Packit 1fb8d4
{
Packit 1fb8d4
	int i, j;
Packit 1fb8d4
	UINT16 h;
Packit 1fb8d4
Packit 1fb8d4
	for (i = 0; i < 32; i++)
Packit 1fb8d4
	{
Packit 1fb8d4
		h = hash(HuffCodeLOM[i]);
Packit 1fb8d4
Packit 1fb8d4
		if (HashTable[h] != 0xffff)
Packit 1fb8d4
		{
Packit 1fb8d4
			HashTable[h] ^= (HuffCodeLOM[i] & 0xfe0) ^ 0xfe0;
Packit 1fb8d4
			HashTable[tab[minihash(HuffCodeLOM[i])]] = i;
Packit 1fb8d4
		}
Packit 1fb8d4
		else
Packit 1fb8d4
		{
Packit 1fb8d4
			HashTable[h] = i;
Packit 1fb8d4
			HashTable[h] ^= 0xfe0;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit Service 5a9772
		printf("at %d %" PRIu16 "=0x%" PRIx16 "\n", i, h, HashTable[h]);
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BYTE getvalue(UINT16 huff)
Packit 1fb8d4
{
Packit 1fb8d4
	UINT16 h = HashTable[hash(huff)];
Packit 1fb8d4
Packit 1fb8d4
	if ((h ^ huff) >> 5)
Packit 1fb8d4
	{
Packit 1fb8d4
		return h & 0x1f;
Packit 1fb8d4
	}
Packit 1fb8d4
	else
Packit 1fb8d4
		return HashTable[tab[minihash(huff)]];
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
main()
Packit 1fb8d4
{
Packit 1fb8d4
	int i;
Packit 1fb8d4
	buildhashtable();
Packit 1fb8d4
	printf("static UINT16 HuffIndexLOM[32] = {\n");
Packit 1fb8d4
Packit 1fb8d4
	for (i = 0; i < 32; i++)
Packit 1fb8d4
	{
Packit 1fb8d4
		if (i == 31)
Packit Service 5a9772
			printf("0x%" PRIx16 " };\n", HashTable[i]);
Packit 1fb8d4
		else
Packit Service 5a9772
			printf("0x%" PRIx16 ", ", HashTable[i]);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	for (i = 0; i < 32; i++)
Packit 1fb8d4
		if (i != getvalue(HuffCodeLOM[i]))
Packit Service 5a9772
			printf("Fail :( at %d : 0x%04" PRIx16 " got %" PRIu8 "\n", i, HuffCodeLOM[i],
Packit 1fb8d4
			       getvalue(HuffCodeLOM[i]));
Packit 1fb8d4
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}