#include <u.h>
#include <libc.h>
#include <draw.h>

/*
 * The code makes two assumptions: strlen(ld) is 1 or 2; latintab[i].ld can be a
 * prefix of latintab[j].ld only when j<i.
 */
static struct cvlist
{
	char	*ld;		/* must be seen before using this conversion */
	char	*si;		/* options for last input characters */
	Rune	so[50];		/* the corresponding Rune for each si entry */
} latintab[] = {
	" ", " i",	{ 0x2423, 0x0131 },
	"w", "kqrbnp", { 0x2654, 0x2655, 0x2656, 0x2657, 0x2658, 0x2659, },
	"x", "O", { 0x2297, },
	"f", "a", { 0x2200, },
	"=", "V:=O<>", { 0x21D2, 0x2255, 0x2261, 0x229C, 0x22DC, 0x22DD, },
	"V", "=", { 0x21D0, },
	"7", "8", { 0x215E, },
	"5", "68", { 0x215A, 0x215D, },
	"4", "5", { 0x2158, },
	"R", "R", { 0x211D, },
	"Q", "Q", { 0x211A, },
	"P", "P", { 0x2119, },
	"C", "CAU", { 0x2102, 0x22C2, 0x22C3, },
	"e", "nmsl", { 0x2013, 0x2014, 0x2205, 0x22EF, },
	"b", "u0123456789+-=()kqrbnp", { 0x2022, 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087, 0x2088, 0x2089, 0x208A, 0x208B, 0x208C, 0x208D, 0x208E, 0x265A, 0x265B, 0x265C, 0x265D, 0x265E, 0x265F, },
	"@e", "h", { 0x44D, },
	"@\'", "\'", { 0x44A, },
	"@s", "hc", { 0x448, 0x449, },
	"@c", "h", { 0x447, },
	"@t", "s", { 0x446, },
	"@k", "h", { 0x445, },
	"@z", "h", { 0x436, },
	"@y", "euao", { 0x435, 0x44E, 0x44F, 0x451, },
	"@E", "Hh", { 0x42D, 0x42D, },
	"@S", "HhCc", { 0x428, 0x428, 0x429, 0x429, },
	"@C", "Hh", { 0x427, 0x427, },
	"@T", "Ss", { 0x426, 0x426, },
	"@K", "Hh", { 0x425, 0x425, },
	"@Z", "Hh", { 0x416, 0x416, },
	"@@", "EZKSTYezksty\'", { 0x415, 0x417, 0x41A, 0x421, 0x422, 0x42B, 0x435, 0x437, 0x43A, 0x441, 0x442, 0x44B, 0x44C, },
	"@Y", "OoEeUuAa", { 0x401, 0x401, 0x415, 0x415, 0x42E, 0x42E, 0x42F, 0x42F, },
	"@", "ABVGDIJLMNOPRUFXabvgdijlmnoprufx", { 0x410, 0x411, 0x412, 0x413, 0x414, 0x418, 0x419, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, 0x420, 0x423, 0x424, 0x425, 0x430, 0x431, 0x432, 0x433, 0x434, 0x438, 0x439, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, 0x440, 0x443, 0x444, 0x445, },
	"*", "ABGDEZYHIKLMNCOPRSTUFXQWabgdezyhiklmncoprstufxqw*", { 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, 0x3A0, 0x3A1, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, 0x3A8, 0x3A9, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, 0x3C0, 0x3C1, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, 0x3C8, 0x3C9, 0x2217, },
	"G", "-", { 0x1E4, },
	"N", "JjN", { 0x1CA, 0x1CB, 0x2115, },
	"2", "-35", { 0x1BB, 0x2154, 0x2156, },
	"z", "-", { 0x1B6, },
	"Z", "-Z", { 0x1B5, 0x2124, },
	"Y", "R", { 0x1A6, },
	"h", "v-", { 0x195, 0x210F, },
	"$*", "hfk", { 0x3D1, 0x3D5, 0x3F0, },
	"$", "fVavgHILlpRBeEFMo", { 0x192, 0x1B2, 0x251, 0x28B, 0x210A, 0x210B, 0x2110, 0x2112, 0x2113, 0x2118, 0x211B, 0x212C, 0x212F, 0x2130, 0x2131, 0x2133, 0x2134, },
	"t", "-smefu", { 0x167, 0x3C2, 0x2122, 0x2203, 0x2234, 0x22A2, },
	"T", "-u", { 0x166, 0x22A8, },
	"L", "-Jj&|", { 0x141, 0x1C7, 0x1C8, 0x22C0, 0x22C1, },
	"i", "j-fsbp", { 0x133, 0x268, 0x221E, 0x222B, 0x2286, 0x2287, },
	"I", "J-", { 0x132, 0x197, },
	"H", "-H", { 0x126, 0x210D, },
	"v\"", "Uu", { 0x1D9, 0x1DA, },
	"v", "CcDdEeLlNnRrSsTtZzAaIiOoUuGgKkj", { 0x10C, 0x10D, 0x10E, 0x10F, 0x11A, 0x11B, 0x13D, 0x13E, 0x147, 0x148, 0x158, 0x159, 0x160, 0x161, 0x164, 0x165, 0x17D, 0x17E, 0x1CD, 0x1CE, 0x1CF, 0x1D0, 0x1D1, 0x1D2, 0x1D3, 0x1D4, 0x1E6, 0x1E7, 0x1E8, 0x1E9, 0x1F0, },
	"u", "AEeGgIiOoUu-a", { 0x102, 0x114, 0x115, 0x11E, 0x11F, 0x12C, 0x12D, 0x14E, 0x14F, 0x16C, 0x16D, 0x289, 0x2191, },
	":", "-=)(", { 0xF7, 0x2254, 0x263A, 0x2639 },
	";", ")", { 0x263B, },
	"a", "ebn", { 0xE6, 0x2194, 0x2220, },
	"/", "Oo", { 0xD8, 0xF8, },
	"Dv", "Zz", { 0x1C4, 0x1C5, },
	"D", "-e", { 0xD0, 0x2206, },
	"A", "E", { 0xC6, },
	"o", "AaeUuiO", { 0xC5, 0xE5, 0x153, 0x16E, 0x16F, 0x1A3, 0x229A, },
	"~!", "=", { 0x2246, },
	"~", "ANOanoIiUu-=~", { 0xC3, 0xD1, 0xD5, 0xE3, 0xF1, 0xF5, 0x128, 0x129, 0x168, 0x169, 0x2243, 0x2245, 0x2248, },
	"^", "AEIOUaeiouCcGgHhJjSsWwYy", { 0xC2, 0xCA, 0xCE, 0xD4, 0xDB, 0xE2, 0xEA, 0xEE, 0xF4, 0xFB, 0x108, 0x109, 0x11C, 0x11D, 0x124, 0x125, 0x134, 0x135, 0x15C, 0x15D, 0x174, 0x175, 0x176, 0x177, },
	"`\"", "Uu", { 0x1DB, 0x1DC, },
	"`", "AEIOUaeiou", { 0xC0, 0xC8, 0xCC, 0xD2, 0xD9, 0xE0, 0xE8, 0xEC, 0xF2, 0xF9, },
	"?", "?!", { 0xBF, 0x203D, },
	"3", "458", { 0xBE, 0x2157, 0x215C, },
	"1", "423568", { 0xBC, 0xBD, 0x2153, 0x2155, 0x2159, 0x215B, },
	">!", "=~", { 0x2269, 0x22E7, },
	">", ">=~<", { 0xBB, 0x2265, 0x2273, 0x2277, },
	",", ",CcAaEeGgIiKkLlNnRrSsTtUuOo", { 0xB8, 0xC7, 0xE7, 0x104, 0x105, 0x118, 0x119, 0x122, 0x123, 0x12E, 0x12F, 0x136, 0x137, 0x13B, 0x13C, 0x145, 0x146, 0x156, 0x157, 0x15E, 0x15F, 0x162, 0x163, 0x172, 0x173, 0x1EA, 0x1EB, },
	".", ".CcEeGgILlZzO", { 0xB7, 0x10A, 0x10B, 0x116, 0x117, 0x120, 0x121, 0x130, 0x13F, 0x140, 0x17B, 0x17C, 0x2299, },
	"p", "gOdrt", { 0xB6, 0x2117, 0x2202, 0x220F, 0x221D, },
	"m", "iuo", { 0xB5, 0xD7, 0x2208, },
	"\'\"", "Uu", { 0x1D7, 0x1D8, },
	"\'", "\'AEIOUYaeiouyCcgLlNnRrSsZz", { 0xB4, 0xC1, 0xC9, 0xCD, 0xD3, 0xDA, 0xDD, 0xE1, 0xE9, 0xED, 0xF3, 0xFA, 0xFD, 0x106, 0x107, 0x123, 0x139, 0x13A, 0x143, 0x144, 0x154, 0x155, 0x15A, 0x15B, 0x179, 0x17A, },
	"+", "-O", { 0xB1, 0x2295, },
	"dv", "z", { 0x1C6, },
	"d", "e-zgda", { 0xB0, 0xF0, 0x2A3, 0x2020, 0x2021, 0x2193, },
	"_,", "Oo", { 0x1EC, 0x1ED, },
	"_.", "Aa", { 0x1E0, 0x1E1, },
	"_\"", "UuAa", { 0x1D5, 0x1D6, 0x1DE, 0x1DF, },
	"_", "_AaEeIiOoUu", { 0xAF, 0x100, 0x101, 0x112, 0x113, 0x12A, 0x12B, 0x14C, 0x14D, 0x16A, 0x16B, },
	"r", "O\'\"", { 0xAE, 0x2019, 0x201D, },
	"-*", "l", { 0x19B, },
	"-", "-Dd:HLlTtbIZz2Ggiuh>+~O", { 0xAD, 0xD0, 0xF0, 0xF7, 0x126, 0x141, 0x142, 0x166, 0x167, 0x180, 0x197, 0x1B5, 0x1B6, 0x1BB, 0x1E4, 0x1E5, 0x268, 0x289, 0x210F, 0x2192, 0x2213, 0x2242, 0x2296, },
	"n", "oj", { 0xAC, 0x1CC, },
	"<!", "=~", { 0x2268, 0x22E6, },
	"<", "<-=~>", { 0xAB, 0x2190, 0x2264, 0x2272, 0x2276, },
	"s", "aos0123456789+-=()nturbp", { 0xAA, 0xBA, 0xDF, 0x2070, 0x2071, 0x2072, 0x2073, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079, 0x207A, 0x207B, 0x207C, 0x207D, 0x207E, 0x207F, 0x220D, 0x2211, 0x221A, 0x2282, 0x2283, },
	"O", "crEIp+-x/.o*=", { 0xA9, 0xAE, 0x152, 0x1A2, 0x2117, 0x2295, 0x2296, 0x2297, 0x2298, 0x2299, 0x229A, 0x229B, 0x229C, },
	"\"*", "IUiu", { 0x3AA, 0x3AB, 0x3CA, 0x3CB, },
	"\"", "\"AEIOUaeiouyY", { 0xA8, 0xC4, 0xCB, 0xCF, 0xD6, 0xDC, 0xE4, 0xEB, 0xEF, 0xF6, 0xFC, 0xFF, 0x178, },
	"S", "S231", { 0xA7, 0xB2, 0xB3, 0xB9 },
	"|", "|Pp", { 0xA6, 0xDE, 0xFE, },
	"y", "$", { 0xA5, },
	"g", "$-r", { 0xA4, 0x1E5, 0x2207, },
	"l", "$-j\'\"&|z", { 0xA3, 0x142, 0x1C9, 0x2018, 0x201C, 0x2227, 0x2228, 0x22C4, },
	"c", "$Oaug", { 0xA2, 0xA9, 0x2229, 0x222A, 0x2245, },
	"!~", "-=~", { 0x2244, 0x2247, 0x2249, },
	"!", "!?m=<>bp", { 0xA1, 0x203D, 0x2209, 0x2260, 0x226E, 0x226F, 0x2284, 0x2285, },
	0, 0, { 0, }
};

/*
 * Given 5 characters k[0]..k[4], find the rune or return -1 for failure.
 */
static long
unicode(Rune *k)
{
	long i, c;

	k++;	/* skip 'X' */
	c = 0;
	for(i=0; i<4; i++,k++){
		c <<= 4;
		if('0'<=*k && *k<='9')
			c += *k-'0';
		else if('a'<=*k && *k<='f')
			c += 10 + *k-'a';
		else if('A'<=*k && *k<='F')
			c += 10 + *k-'A';
		else
			return -1;
	}
	return c;
}

/*
 * Given n characters k[0]..k[n-1], find the corresponding rune or return -1 for
 * failure, or something < -1 if n is too small.  In the latter case, the result
 * is minus the required n.
 */
int
_latin1(Rune *k, int n)
{
	struct cvlist *l;
	int c;
	char* p;

	if(k[0] == 'X'){
		if(n>=5)
			return unicode(k);
		else
			return -5;
	}
	
	for(l=latintab; l->ld!=0; l++)
		if(k[0] == l->ld[0]){
			if(n == 1)
				return -2;
			if(l->ld[1] == 0)
				c = k[1];
			else if(l->ld[1] != k[1])
				continue;
			else if(n == 2)
				return -3;
			else
				c = k[2];
			for(p=l->si; *p!=0; p++)
				if(*p == c)
					return l->so[p - l->si];
			return -1;
		}
	return -1;
}
