Blame scripts/LOMHash.c

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