Blame scripts/LOMHash.c

Packit 1fb8d4
#include<stdio.h>
Packit 1fb8d4
typedef unsigned short UINT16;
Packit 1fb8d4
typedef unsigned char BYTE;
Packit 1fb8d4
static UINT16 HuffCodeLOM[] =
Packit 1fb8d4
{
Packit 1fb8d4
	0x0001, 0x0000, 0x0002, 0x0009, 0x0006, 0x0005, 0x000d, 0x000b, 0x0003, 0x001b, 0x0007, 0x0017, 0x0037,
Packit 1fb8d4
	0x000f, 0x004f, 0x006f, 0x002f, 0x00ef, 0x001f, 0x005f, 0x015f, 0x009f, 0x00df, 0x01df, 0x003f, 0x013f, 0x00bf,
Packit 1fb8d4
	0x01bf, 0x007f, 0x017f, 0x00ff, 0x01ff
Packit 1fb8d4
};
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 1fb8d4
	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 1fb8d4
		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 1fb8d4
			printf("0x%"PRIx16" };\n", HashTable[i]);
Packit 1fb8d4
		else
Packit 1fb8d4
			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 1fb8d4
			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
}