#include "c.h"
#include "mb/pg_wchar.h"

#include "iso8859_2_to_utf8.map"
#include "iso8859_5_to_utf8.map"
#include "win1250_to_utf8.map"
#include "win1251_to_utf8.map"
#include "win866_to_utf8.map"
#include "koi8r_to_utf8.map"


typedef struct
{
	const char *enname1;
	const pg_local_to_utf *map1;	/* to UTF8 map name */
	int			size1;			/* size of map1 */
	const char *enname2;
	const pg_local_to_utf *map2;	/* to UTF8 map name */
	int			size2;			/* size of map2 */
	const char *tabname;
} pg_conv_map;

static const pg_conv_map maps[] = {
	{
		"WIN1250", LUmapWIN1250, lengthof(LUmapWIN1250),
		"ISO-8859-2", LUmapISO8859_2, lengthof(LUmapISO8859_2),
		"win1250_2_iso88592"
	},
	{
		"ISO-8859-2", LUmapISO8859_2, lengthof(LUmapISO8859_2),
		"WIN1250", LUmapWIN1250, lengthof(LUmapWIN1250),
		"iso88592_2_win1250"
	},

	{
		"ISO-8859-5", LUmapISO8859_5, lengthof(LUmapISO8859_5),
		"KOI8-R", LUmapKOI8R, lengthof(LUmapKOI8R),
		"iso2koi"
	},
	{
		"KOI8-R", LUmapKOI8R, lengthof(LUmapKOI8R),
		"ISO-8859-5", LUmapISO8859_5, lengthof(LUmapISO8859_5),
		"koi2iso"
	},
	{
		"WIN1251", LUmapWIN1251, lengthof(LUmapWIN1251),
		"KOI8-R", LUmapKOI8R, lengthof(LUmapKOI8R),
		"win12512koi"
	},
	{
		"KOI8-R", LUmapKOI8R, lengthof(LUmapKOI8R),
		"WIN1251", LUmapWIN1251, lengthof(LUmapWIN1251),
		"koi2win1251"
	},
	{
		"WIN866", LUmapWIN866, lengthof(LUmapWIN866),
		"KOI8-R", LUmapKOI8R, lengthof(LUmapKOI8R),
		"win8662koi"
	},
	{
		"KOI8-R", LUmapKOI8R, lengthof(LUmapKOI8R),
		"WIN866", LUmapWIN866, lengthof(LUmapWIN866),
		"koi2win866"
	},
	{
		"WIN866", LUmapWIN866, lengthof(LUmapWIN866),
		"WIN1251", LUmapWIN1251, lengthof(LUmapWIN1251),
		"win8662win1251"
	},
	{
		"WIN1251", LUmapWIN1251, lengthof(LUmapWIN1251),
		"WIN866", LUmapWIN866, lengthof(LUmapWIN866),
		"win12512win866"
	},
	{
		"ISO-8859-5", LUmapISO8859_5, lengthof(LUmapISO8859_5),
		"WIN1251", LUmapWIN1251, lengthof(LUmapWIN1251),
		"iso2win1251"
	},
	{
		"WIN1251", LUmapWIN1251, lengthof(LUmapWIN1251),
		"ISO-8859-5", LUmapISO8859_5, lengthof(LUmapISO8859_5),
		"win12512iso"
	},
	{
		"ISO-8859-5", LUmapISO8859_5, lengthof(LUmapISO8859_5),
		"WIN866", LUmapWIN866, lengthof(LUmapWIN866),
		"iso2win866"
	},
	{
		"WIN866", LUmapWIN866, lengthof(LUmapWIN866),
		"ISO-8859-5", LUmapISO8859_5, lengthof(LUmapISO8859_5),
		"win8662iso"
	},

};

static void
domap(const pg_conv_map *info)
{
	uint32 c;

	printf("/* %s to %s */\n", info->enname1, info->enname2);
	printf("static const unsigned char %s[] = {\n", info->tabname);

	for (c = 0x80; c <= 0xff; c++)
	{
		uint32 u = 0;
		uint32 c2 = 0;
		int i;

		for (i = 0; i < info->size1; i++)
		{
			if (info->map1[i].code == c)
			{
				u = info->map1[i].utf;
				break;
			}
		}
		if (u != 0)
		{
			for (i = 0; i < info->size2; i++)
			{
				if (info->map2[i].utf == u)
				{
					c2 = info->map2[i].code;
					break;
				}
			}
		}
#if 0
		if (c2)
			printf("0x%02x maps to 0x%02x via U+%04X\n", c, c2, u);
		else
			printf("0x%02x has no equivalent\n", c);
#endif
		if (c % 8 == 0)
			printf("\t");
		printf("0x%02X", c2);
		if (c == 0xff)
			printf("\n");
		else if (c % 8 == 7)
			printf(",\n");
		else
			printf(", ");
	}
	printf("};\n\n");
}

int
main(int argc, char **argv)
{
	int i;

	for (i = 0; i < lengthof(maps); i++)
		domap(maps + i);

	return 0;
}
