#include "ksyms.h"
#include <stdio.h>

static char *latin1_syms[] = {
	"nul",
	"Control_a",
	"Control_b",
	"Control_c",
	"Control_d",
	"Control_e",
	"Control_f",
	"Control_g",
	"BackSpace",
	"Tab",
	"Linefeed",
	"Control_k",
	"Control_l",
	"Control_m",
	"Control_n",
	"Control_o",
	"Control_p",
	"Control_q",
	"Control_r",
	"Control_s",
	"Control_t",
	"Control_u",
	"Control_v",
	"Control_w",
	"Control_x",
	"Control_y",
	"Control_z",
	"Escape",
	"Control_backslash",
	"Control_bracketright",
	"Control_asciicircum",
	"Control_underscore",
	"space",
	"exclam",
	"quotedbl",
	"numbersign",
	"dollar",
	"percent",
	"ampersand",
	"apostrophe",
	"parenleft",
	"parenright",
	"asterisk",
	"plus",
	"comma",
	"minus",
	"period",
	"slash",
	"zero",
	"one",
	"two",
	"three",
	"four",
	"five",
	"six",
	"seven",
	"eight",
	"nine",
	"colon",
	"semicolon",
	"less",
	"equal",
	"greater",
	"question",
	"at",
	"A",
	"B",
	"C",
	"D",
	"E",
	"F",
	"G",
	"H",
	"I",
	"J",
	"K",
	"L",
	"M",
	"N",
	"O",
	"P",
	"Q",
	"R",
	"S",
	"T",
	"U",
	"V",
	"W",
	"X",
	"Y",
	"Z",
	"bracketleft",
	"backslash",
	"bracketright",
	"asciicircum",
	"underscore",
	"grave",
	"a",
	"b",
	"c",
	"d",
	"e",
	"f",
	"g",
	"h",
	"i",
	"j",
	"k",
	"l",
	"m",
	"n",
	"o",
	"p",
	"q",
	"r",
	"s",
	"t",
	"u",
	"v",
	"w",
	"x",
	"y",
	"z",
	"braceleft",
	"bar",
	"braceright",
	"asciitilde",
	"Delete",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"",
	"nobreakspace",
	"exclamdown",
	"cent",
	"sterling",
	"currency",
	"yen",
	"brokenbar",
	"section",
	"diaeresis",
	"copyright",
	"ordfeminine",
	"guillemotleft",
	"notsign",
	"hyphen",
	"registered",
	"macron",
	"degree",
	"plusminus",
	"twosuperior",
	"threesuperior",
	"acute",
	"mu",
	"paragraph",
	"periodcentered",
	"cedilla",
	"onesuperior",
	"masculine",
	"guillemotright",
	"onequarter",
	"onehalf",
	"threequarters",
	"questiondown",
	"Agrave",
	"Aacute",
	"Acircumflex",
	"Atilde",
	"Adiaeresis",
	"Aring",
	"AE",
	"Ccedilla",
	"Egrave",
	"Eacute",
	"Ecircumflex",
	"Ediaeresis",
	"Igrave",
	"Iacute",
	"Icircumflex",
	"Idiaeresis",
	"ETH",
	"Ntilde",
	"Ograve",
	"Oacute",
	"Ocircumflex",
	"Otilde",
	"Odiaeresis",
	"multiply",
	"Ooblique",
	"Ugrave",
	"Uacute",
	"Ucircumflex",
	"Udiaeresis",
	"Yacute",
	"THORN",
	"ssharp",
	"agrave",
	"aacute",
	"acircumflex",
	"atilde",
	"adiaeresis",
	"aring",
	"ae",
	"ccedilla",
	"egrave",
	"eacute",
	"ecircumflex",
	"ediaeresis",
	"igrave",
	"iacute",
	"icircumflex",
	"idiaeresis",
	"eth",
	"ntilde",
	"ograve",
	"oacute",
	"ocircumflex",
	"otilde",
	"odiaeresis",
	"division",
	"oslash",
	"ugrave",
	"uacute",
	"ucircumflex",
	"udiaeresis",
	"yacute",
	"thorn",
	"ydiaeresis"
};

char *latin2_syms[] = {
    "", "Aogonek", "breve", "Lstroke", "", "Lcaron", "Sacute", "",
    "", "Scaron", "Scedilla", "Tcaron", "Zacute", "", "Zcaron", "Zabovedot",
    "", "aogonek", "ogonek", "lstroke", "", "lcaron", "sacute", "caron",
    "", "scaron", "scedilla", "tcaron", "zacute", "doubleacute", "zcaron", "zabovedot",
    "Racute", "", "", "Abreve", "", "Lacute", "Cacute", "",
    "Ccaron", "", "Eogonek", "", "Ecaron", "", "", "Dcaron",
    "Dstroke", "Nacute", "Ncaron", "", "", "Odoubleacute", "", "",
    "Rcaron", "Uring", "", "Udoubleacute", "", "", "Tcedilla", "",
    "racute", "", "", "abreve", "", "lacute", "cacute", "",
    "ccaron", "", "eogonek", "", "ecaron", "", "", "dcaron",
    "dstroke", "nacute", "ncaron", "", "", "odoubleacute", "", "",
    "rcaron", "uring", "", "udoubleacute", "", "", "tcedilla", "abovedot"
};

char *mazovia_syms[] = { /* as specified by Wlodek Bzyl <matwb@univ.gda.pl> */
    "", "", "", "", "", "", "aogonek", "", /* 8x */
    "", "", "", "", "", "cacute", "", "Aogonek",
    "Eogonek", "eogonek", "lstroke", "", "", "Cacute", "", "", /* 9x */
    "Sacute", "", "", "", "Lstroke", "", "sacute", "",
    "Zacute", "Zabovedot", "oacute", "Oacute",
    "nacute", "Nacute", "zacute", "zabovedot", /* ax */
    "", "", "", "", "", "", "guillemotleft", "guillemotright",
    "", "", "", "", "", "", "", "", /* bx */
    "", "", "", "", "", "", "", "",
    "", "", "", "", "", "", "", "", /* cx */
    "", "", "", "", "", "", "", "",
    "", "", "", "", "", "", "", "", /* dx */
    "", "", "", "", "", "", "", "",
    "", "", "", "", "", "", "", "", /* ex */
    "", "", "", "", "", "", "", "",
    "", "", "", "", "", "", "", "", /* fx */
    "", "", "", "", "", "", "", "quotedblbase"
};

char *latin3_syms[] = {
    "", "Hstroke", "", "", "", "", "Hcircumflex", "",
    "", "Iabovedot", "", "Gbreve", "Jcircumflex", "", "", "",
    "", "hstroke", "", "", "", "", "hcircumflex", "",
    "", "idotless", "", "gbreve", "jcircumflex", "", "", "",
    "", "", "", "", "", "Cabovedot", "Ccircumflex", "",
    "", "", "", "", "", "", "", "",
    "", "", "", "", "", "Gabovedot", "", "",
    "Gcircumflex", "", "", "", "", "Ubreve", "Scircumflex", "",
    "", "", "", "", "", "cabovedot", "ccircumflex", "",
    "", "", "", "", "", "", "", "",
    "", "", "", "", "", "gabovedot", "", "",
    "gcircumflex", "", "", "", "", "ubreve", "scircumflex", ""
};

char *latin4_syms[] = {
    "", "", "kra", "Rcedilla", "", "Itilde", "Lcedilla", "",
    "", "", "Emacron", "Gcedilla", "Tslash", "", "", "",
    "", "", "", "rcedilla", "", "itilde", "lcedilla", "",
    "", "", "emacron", "gcedilla", "tslash", "ENG", "", "eng",
    "Amacron", "", "", "", "", "", "", "Iogonek",
    "", "", "", "", "Eabovedot", "", "", "Imacron",
    "", "Ncedilla", "Omacron", "Kcedilla", "", "", "", "",
    "", "Uogonek", "", "", "", "Utilde", "Umacron", "",
    "amacron", "", "", "", "", "", "", "iogonek",
    "", "", "", "", "eabovedot", "", "", "imacron",
    "", "ncedilla", "omacron", "kcedilla", "", "", "", "",
    "", "uogonek", "", "", "", "utilde", "umacron", ""
};

char *iso_8859_5_syms[] = { /* 160-255 */
    "no-break_space",					/* 0240 */
    "cyrillic_capital_letter_io",
    "serbocroatian_cyrillic_capital_letter_dje",
    "macedonian_cyrillic_capital_letter_gje",
    "ukrainian_cyrillic_capital_letter_ie",
    "macedonian_cyrillic_capital_letter_dze",
    "cyrillic_capital_letter_i",
    "ukrainian_cyrillic_capital_letter_yi",
    "cyrillic_capital_letter_je", 			/* 0250 */
    "cyrillic_capital_letter_lje",
    "cyrillic_capital_letter_nje",
    "serbocroatian_cyrillic_capital_letter_chje",
    "macedonian_cyrillic_capital_letter_kje",
    "soft_hyphen",
    "bielorussian_cyrillic_capital_letter_short_u",
    "cyrillic_capital_letter_dze",
    "cyrillic_capital_letter_a", 			/* 0260 */
    "cyrillic_capital_letter_be",
    "cyrillic_capital_letter_ve",
    "cyrillic_capital_letter_ghe",
    "cyrillic_capital_letter_de",
    "cyrillic_capital_letter_ie",
    "cyrillic_capital_letter_zhe",
    "cyrillic_capital_letter_ze",
    "cyrillic_capital_letter_i", 			/* 0270 */
    "cyrillic_capital_letter_short_i",
    "cyrillic_capital_letter_ka",
    "cyrillic_capital_letter_el",
    "cyrillic_capital_letter_em",
    "cyrillic_capital_letter_en",
    "cyrillic_capital_letter_o",
    "cyrillic_capital_letter_pe",
    "cyrillic_capital_letter_er", 			/* 0300 */
    "cyrillic_capital_letter_es",
    "cyrillic_capital_letter_te",
    "cyrillic_capital_letter_u",
    "cyrillic_capital_letter_ef",
    "cyrillic_capital_letter_ha",
    "cyrillic_capital_letter_tse",
    "cyrillic_capital_letter_che",
    "cyrillic_capital_letter_sha", 			/* 0310 */
    "cyrillic_capital_letter_shcha",
    "cyrillic_capital_hard_sign",
    "cyrillic_capital_letter_yeru",
    "cyrillic_capital_soft_sign",
    "cyrillic_capital_letter_e",
    "cyrillic_capital_letter_yu",
    "cyrillic_capital_letter_ya",
    "cyrillic_small_letter_a",				/* 0320 */
    "cyrillic_small_letter_be",
    "cyrillic_small_letter_ve",
    "cyrillic_small_letter_ghe",
    "cyrillic_small_letter_de",
    "cyrillic_small_letter_ie",
    "cyrillic_small_letter_zhe",
    "cyrillic_small_letter_ze",
    "cyrillic_small_letter_i",				/* 0330 */
    "cyrillic_small_letter_short_i",
    "cyrillic_small_letter_ka",
    "cyrillic_small_letter_el",
    "cyrillic_small_letter_em",
    "cyrillic_small_letter_en",
    "cyrillic_small_letter_o",
    "cyrillic_small_letter_pe",
    "cyrillic_small_letter_er",				/* 0340 */
    "cyrillic_small_letter_es",
    "cyrillic_small_letter_te",
    "cyrillic_small_letter_u",
    "cyrillic_small_letter_ef",
    "cyrillic_small_letter_ha",
    "cyrillic_small_letter_tse",
    "cyrillic_small_letter_che",
    "cyrillic_small_letter_sha", 			/* 0350 */
    "cyrillic_small_letter_shcha",
    "cyrillic_small_hard_sign",
    "cyrillic_small_letter_yeru",
    "cyrillic_small_soft_sign",
    "cyrillic_small_letter_e",
    "cyrillic_small_letter_yu",
    "cyrillic_small_letter_ya",
    "number_acronym",					/* 0360 */
    "cyrillic_small_letter_io",
    "serbocroatian_cyrillic_small_letter_dje",
    "macedonian_cyrillic_small_letter_gje",
    "ukrainian_cyrillic_small_letter_ie",
    "macedonian_cyrillic_small_letter_dze",
    "cyrillic_small_letter_i",
    "ukrainian_cyrillic_small_letter_yi",
    "cyrillic_small_letter_je",				/* 0370 */
    "cyrillic_small_letter_lje",
    "cyrillic_small_letter_nje",
    "serbocroatian_cyrillic_small_letter_chje",
    "macedonian_cyrillic_small_letter_kje",
    "paragraph_sign",
    "bielorussian_cyrillic_small_letter_short_u", 	/* printing error in ECMA-113 */
    "cyrillic_small_letter_dze"
};

char *iso_8859_7_syms[] = { /* 160-255 */
    "", "leftquote", "rightquote", "", "", "", "", "",
    "", "", "", "", "", "", "", "",
    "", "", "", "", "accent", "diaeresisaccent", "Alphaaccent", "",
    "Epsilonaccent", "Etaaccent", "Iotaaccent", "rightanglequote", "Omicronaccent", "onehalf", "Upsilonaccent", "Omegaaccent",
    "iotadiaeresisaccent", "Alpha", "Beta", "Gamma", "Delta", "Epsilon", "Zeta", "Eta",
    "Theta", "Iota", "Kappa", "Lamda" /*sic*/, "Mu", "Nu", "Ksi", "Omicron",
    "Pi", "Rho", "", "Sigma", "Tau", "Upsilon", "Phi", "Khi",
    "Psi", "Omega", "Iotadiaeresis", "Upsilondiaeresis", "alphaaccent", "epsilonaccent", "etaaccent", "iotaaccent",
    "upsilondiaeresisaccent", "alpha", "beta", "gamma", "delta", "epsilon", "zeta", "eta",
    "theta", "iota", "kappa", "lamda" /*sic*/, "mu", "nu", "ksi", "omicron",
    "pi", "rho", "terminalsigma", "sigma", "tau", "upsilon", "phi", "khi",
    "psi", "omega", "iotadiaeresis", "upsilondiaeresis", "omicronaccent", "upsilonaccent", "omegaaccent", ""
};

char *iso_8859_8_syms[] = {
    "", "", "", "", "", "", "", "",
    "", "", "multiplication", "", "", "", "", "overscore",
    "", "", "", "", "", "", "", "",
    "", "", "division", "", "", "", "", "",
    "", "", "", "", "", "", "", "",
    "", "", "", "", "", "", "", "",
    "", "", "", "", "", "", "", "",
    "", "", "", "", "", "", "", "doubleunderscore",
    "alef", "bet", "gimel", "dalet", "he", "vav", "zayin", "het",
    "tet", "yod", "finalkaf", "kaf", "lamed", "finalmem", "mem", "finalnun",
    "nun", "samekh", "ayin", "finalpe", "pe", "finaltsadi", "tsadi", "qof",
    "resh", "shin", "tav", "", "", "", "", ""
};

static char *fn_syms[] = {
	"F1",
	"F2",
	"F3",
	"F4",
	"F5",
	"F6",
	"F7",
	"F8",
	"F9",
	"F10",
	"F11",
	"F12",
	"F13",
	"F14",
	"F15",
	"F16",
	"F17",
	"F18",
	"F19",
	"F20",
	"Find",			/* also called: "Home" */
	"Insert",
	"Remove",
	"Select",		/* also called: "End" */
	"Prior",		/* also called: "PageUp" */
	"Next",			/* also called: "PageDown" */
	"Macro",
	"Help",
	"Do",
	"Pause",
	"F21",
	"F22",
	"F23",
	"F24",
	"F25",
	"F26",
	"F27",
	"F28",
	"F29",
	"F30",
	"F31",
	"F32",
	"F33",
	"F34",
	"F35",
	"F36",
	"F37",
	"F38",
	"F39",
	"F40",
	"F41",
	"F42",
	"F43",
	"F44",
	"F45",
	"F46",
	"F47",
	"F48",
	"F49",
	"F50",
	"F51",
	"F52",
	"F53",
	"F54",
	"F55",
	"F56",
	"F57",
	"F58",
	"F59",
	"F60",
	"F61",
	"F62",
	"F63",
	"F64",
	"F65",
	"F66",
	"F67",
	"F68",
	"F69",
	"F70",
	"F71",
	"F72",
	"F73",
	"F74",
	"F75",
	"F76",
	"F77",
	"F78",
	"F79",
	"F80",
	"F81",
	"F82",
	"F83",
	"F84",
	"F85",
	"F86",
	"F87",
	"F88",
	"F89",
	"F90",
	"F91",
	"F92",
	"F93",
	"F94",
	"F95",
	"F96",
	"F97",
	"F98",
	"F99",
	"F100",
	"F101",
	"F102",
	"F103",
	"F104",
	"F105",
	"F106",
	"F107",
	"F108",
	"F109",
	"F110",
	"F111",
	"F112",
	"F113",
	"F114",
	"F115",
	"F116",
	"F117",
	"F118",
	"F119",
	"F120",
	"F121",
	"F122",
	"F123",
	"F124",
	"F125",
	"F126",
	"F127",
	"F128",
	"F129",
	"F130",
	"F131",
	"F132",
	"F133",
	"F134",
	"F135",
	"F136",
	"F137",
	"F138",
	"F139",
	"F140",
	"F141",
	"F142",
	"F143",
	"F144",
	"F145",
	"F146",
	"F147",
	"F148",
	"F149",
	"F150",
	"F151",
	"F152",
	"F153",
	"F154",
	"F155",
	"F156",
	"F157",
	"F158",
	"F159",
	"F160",
	"F161",
	"F162",
	"F163",
	"F164",
	"F165",
	"F166",
	"F167",
	"F168",
	"F169",
	"F170",
	"F171",
	"F172",
	"F173",
	"F174",
	"F175",
	"F176",
	"F177",
	"F178",
	"F179",
	"F180",
	"F181",
	"F182",
	"F183",
	"F184",
	"F185",
	"F186",
	"F187",
	"F188",
	"F189",
	"F190",
	"F191",
	"F192",
	"F193",
	"F194",
	"F195",
	"F196",
	"F197",
	"F198",
	"F199",
	"F200",
	"F201",
	"F202",
	"F203",
	"F204",
	"F205",
	"F206",
	"F207",
	"F208",
	"F209",
	"F210",
	"F211",
	"F212",
	"F213",
	"F214",
	"F215",
	"F216",
	"F217",
	"F218",
	"F219",
	"F220",
	"F221",
	"F222",
	"F223",
	"F224",
	"F225",
	"F226",
	"F227",
	"F228",
	"F229",
	"F230",
	"F231",
	"F232",
	"F233",
	"F234",
	"F235",
	"F236",
	"F237",
	"F238",
	"F239",
	"F240",
	"F241",
	"F242",
	"F243",
	"F244",
	"F245",
	"F246"		/* there are 10 keys named Insert etc., total 256 */
};

static char *spec_syms[] = {
	"VoidSymbol",
	"Return",
	"Show_Registers",
	"Show_Memory",
	"Show_State",
	"Break",
	"Last_Console",
	"Caps_Lock",
	"Num_Lock",
	"Scroll_Lock",
	"Scroll_Forward",
	"Scroll_Backward",
	"Boot",
	"Caps_On",
	"Compose",
	"SAK",
	"Decr_Console",
	"Incr_Console",
	"Spawn_Console",
	"Bare_Num_Lock"
};

static char *pad_syms[] = {
	"KP_0",
	"KP_1",
	"KP_2",
	"KP_3",
	"KP_4",
	"KP_5",
	"KP_6",
	"KP_7",
	"KP_8",
	"KP_9",
	"KP_Add",
	"KP_Subtract",
	"KP_Multiply",
	"KP_Divide",
	"KP_Enter",
	"KP_Comma",
	"KP_Period",
	"KP_MinPlus"
};

static char *dead_syms[] = {
	"dead_grave",
	"dead_acute",
	"dead_circumflex",
	"dead_tilde",
	"dead_diaeresis",
	"dead_cedilla"
};

static char *cons_syms[] = {
	"Console_1",
	"Console_2",
	"Console_3",
	"Console_4",
	"Console_5",
	"Console_6",
	"Console_7",
	"Console_8",
	"Console_9",
	"Console_10",
	"Console_11",
	"Console_12",
	"Console_13",
	"Console_14",
	"Console_15",
	"Console_16",
	"Console_17",
	"Console_18",
	"Console_19",
	"Console_20",
	"Console_21",
	"Console_22",
	"Console_23",
	"Console_24",
	"Console_25",
	"Console_26",
	"Console_27",
	"Console_28",
	"Console_29",
	"Console_30",
	"Console_31",
	"Console_32",
	"Console_33",
	"Console_34",
	"Console_35",
	"Console_36",
	"Console_37",
	"Console_38",
	"Console_39",
	"Console_40",
	"Console_41",
	"Console_42",
	"Console_43",
	"Console_44",
	"Console_45",
	"Console_46",
	"Console_47",
	"Console_48",
	"Console_49",
	"Console_50",
	"Console_51",
	"Console_52",
	"Console_53",
	"Console_54",
	"Console_55",
	"Console_56",
	"Console_57",
	"Console_58",
	"Console_59",
	"Console_60",
	"Console_61",
	"Console_62",
	"Console_63"
};

static char *cur_syms[] = {
	"Down",
	"Left",
	"Right",
	"Up"
};

static char *shift_syms[] = {
	"Shift",
	"AltGr",
	"Control",
	"Alt",
	"ShiftL",
	"ShiftR",
	"CtrlL",
	"CtrlR",
	"CapsShift"
};

static char *meta_syms[] = {
	"Meta_nul",
	"Meta_Control_a",
	"Meta_Control_b",
	"Meta_Control_c",
	"Meta_Control_d",
	"Meta_Control_e",
	"Meta_Control_f",
	"Meta_Control_g",
	"Meta_BackSpace",
	"Meta_Tab",
	"Meta_Linefeed",
	"Meta_Control_k",
	"Meta_Control_l",
	"Meta_Control_m",
	"Meta_Control_n",
	"Meta_Control_o",
	"Meta_Control_p",
	"Meta_Control_q",
	"Meta_Control_r",
	"Meta_Control_s",
	"Meta_Control_t",
	"Meta_Control_u",
	"Meta_Control_v",
	"Meta_Control_w",
	"Meta_Control_x",
	"Meta_Control_y",
	"Meta_Control_z",
	"Meta_Escape",
	"Meta_Control_backslash",
	"Meta_Control_bracketright",
	"Meta_Control_asciicircum",
	"Meta_Control_underscore",
	"Meta_space",
	"Meta_exclam",
	"Meta_quotedbl",
	"Meta_numbersign",
	"Meta_dollar",
	"Meta_percent",
	"Meta_ampersand",
	"Meta_apostrophe",
	"Meta_parenleft",
	"Meta_parenright",
	"Meta_asterisk",
	"Meta_plus",
	"Meta_comma",
	"Meta_minus",
	"Meta_period",
	"Meta_slash",
	"Meta_zero",
	"Meta_one",
	"Meta_two",
	"Meta_three",
	"Meta_four",
	"Meta_five",
	"Meta_six",
	"Meta_seven",
	"Meta_eight",
	"Meta_nine",
	"Meta_colon",
	"Meta_semicolon",
	"Meta_less",
	"Meta_equal",
	"Meta_greater",
	"Meta_question",
	"Meta_at",
	"Meta_A",
	"Meta_B",
	"Meta_C",
	"Meta_D",
	"Meta_E",
	"Meta_F",
	"Meta_G",
	"Meta_H",
	"Meta_I",
	"Meta_J",
	"Meta_K",
	"Meta_L",
	"Meta_M",
	"Meta_N",
	"Meta_O",
	"Meta_P",
	"Meta_Q",
	"Meta_R",
	"Meta_S",
	"Meta_T",
	"Meta_U",
	"Meta_V",
	"Meta_W",
	"Meta_X",
	"Meta_Y",
	"Meta_Z",
	"Meta_bracketleft",
	"Meta_backslash",
	"Meta_bracketright",
	"Meta_asciicircum",
	"Meta_underscore",
	"Meta_grave",
	"Meta_a",
	"Meta_b",
	"Meta_c",
	"Meta_d",
	"Meta_e",
	"Meta_f",
	"Meta_g",
	"Meta_h",
	"Meta_i",
	"Meta_j",
	"Meta_k",
	"Meta_l",
	"Meta_m",
	"Meta_n",
	"Meta_o",
	"Meta_p",
	"Meta_q",
	"Meta_r",
	"Meta_s",
	"Meta_t",
	"Meta_u",
	"Meta_v",
	"Meta_w",
	"Meta_x",
	"Meta_y",
	"Meta_z",
	"Meta_braceleft",
	"Meta_bar",
	"Meta_braceright",
	"Meta_asciitilde",
	"Meta_Delete"
};

static char *ascii_syms[] = {
	"Ascii_0",
	"Ascii_1",
	"Ascii_2",
	"Ascii_3",
	"Ascii_4",
	"Ascii_5",
	"Ascii_6",
	"Ascii_7",
	"Ascii_8",
	"Ascii_9",
	"Hex_0",
	"Hex_1",
	"Hex_2",
	"Hex_3",
	"Hex_4",
	"Hex_5",
	"Hex_6",
	"Hex_7",
	"Hex_8",
	"Hex_9",
	"Hex_A",
	"Hex_B",
	"Hex_C",
	"Hex_D",
	"Hex_E",
	"Hex_F"
};

static char *lock_syms[] = {
	"Shift_Lock",
	"AltGr_Lock",
	"Control_Lock",
	"Alt_Lock",
	"ShiftL_Lock",
	"ShiftR_Lock",
	"CtrlL_Lock",
	"CtrlR_Lock"
};

static char *sticky_syms[] = {
	"SShift",
	"SAltGr",
	"SControl",
	"SAlt",
	"SShiftL",
	"SShiftR",
	"SCtrlL",
	"SCtrlR"
};

#define E(x) { x, sizeof(x) / sizeof(char **) }

syms_entry syms[] = {
	E(latin1_syms),
	E(fn_syms),
	E(spec_syms),
	E(pad_syms),
	E(dead_syms),
	E(cons_syms),
	E(cur_syms),
	E(shift_syms),
	E(meta_syms),
	E(ascii_syms),
	E(lock_syms),
	{ 0, 0 },
	E(sticky_syms)
};

#undef E

struct syn
synonyms[] = {
	{ "Control_h",		"BackSpace" },
	{ "Control_i",		"Tab" },
	{ "Control_j",		"Linefeed" },
	{ "Meta_Control_h",	"Meta_BackSpace" },
	{ "Meta_Control_i",	"Meta_Tab" },
	{ "Meta_Control_j",	"Meta_Linefeed" },
	{ "Home",		"Find" },
/* Unfortunately Delete already denotes ASCII 0177 */
/*	{ "Delete",		"Remove" }, */
	{ "End",		"Select" },
	{ "PageUp",		"Prior" },
	{ "PageDown",		"Next" },
	{ "multiplication",	"multiply" },
	{ "pound",		"sterling" },
	{ "pilcrow",		"paragraph" },
	{ "Oslash",		"Ooblique" },
	{ "Shift_L",		"ShiftL" },
	{ "Shift_R",		"ShiftR" },
	{ "Control_L",		"CtrlL" },
	{ "Control_R",		"CtrlR" },
	{ "AltL",		"Alt" },
	{ "AltR",		"AltGr" },
	{ "Alt_L",		"Alt" },
	{ "Alt_R",		"AltGr" },
	{ "AltGr_L",		"Alt" },
	{ "AltGr_R",		"AltGr" },
	{ "AltLLock",		"Alt_Lock" },
	{ "AltRLock",		"AltGr_Lock" },
	{ "SCtrl",		"SControl" },
	{ "KeyboardSignal",	"Spawn_Console" },
/* the names of the Greek letters are spelled differently
   in the iso-8859-7 and the Unicode standards */
	{ "lambda",             "lamda" },
	{ "Lambda",             "Lamda" },
	{ "xi",                 "ksi" },
	{ "Xi",                 "Ksi" },
	{ "chi",                "khi" },
	{ "Chi",                "Khi" },
/* diacriticals */
	{ "tilde",		"asciitilde" },
	{ "circumflex",		"asciicircum" },
};

const int syms_size = sizeof(syms) / sizeof(syms_entry);
const int syn_size = sizeof(synonyms) / sizeof(synonyms[0]);

struct cs {
    char *charset;
    char **charnames;
    int start;
} charsets[] = {
    { "iso-8859-1", 0, 0 },
    { "mazovia", mazovia_syms, 128 },
    { "iso-8859-2", latin2_syms, 160 },
    { "iso-8859-3", latin3_syms, 160 },
    { "iso-8859-4", latin4_syms, 160 },
    { "iso-8859-5", iso_8859_5_syms, 160 },
    { "iso-8859-7", iso_8859_7_syms, 160 },
    { "iso-8859-8", iso_8859_8_syms, 160 }
};

void
set_charset(char *charset) {
	char **p;
	int i;

	for (i = 0; i < sizeof(charsets)/sizeof(charsets[0]); i++) {
	    if (!strcmp(charsets[i].charset, charset)) {
		p = charsets[i].charnames;
		if (p)
		  for (i = charsets[i].start; i < 256; i++,p++) {
		    if(*p && **p)
		      syms[0].table[i] = *p;
		}
		return;
	    }
	}
	if (!strcmp(charset, "unicode"))
	  fprintf (stderr, "unknown charset %s - ignoring charset request\n",
		   charset);
}

