winucs.c

来自「putty」· C语言 代码 · 共 1,252 行 · 第 1/4 页

C
1,252
字号
    0x0018, 0x1EF8, 0x001a, 0x001b, 0x001c, 0x001d, 0x1EF4, 0x001f,
    0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
    0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
    0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
    0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
    0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
    0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
    0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
    0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
    0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
    0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
    0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007f,
    0x1EA0, 0x1EAE, 0x1EB0, 0x1EB6, 0x1EA4, 0x1EA6, 0x1EA8, 0x1EAC,
    0x1EBC, 0x1EB8, 0x1EBE, 0x1EC0, 0x1EC2, 0x1EC4, 0x1EC6, 0x1ED0,
    0x1ED2, 0x1ED4, 0x1ED6, 0x1ED8, 0x1EE2, 0x1EDA, 0x1EDC, 0x1EDE,
    0x1ECA, 0x1ECE, 0x1ECC, 0x1EC8, 0x1EE6, 0x0168, 0x1EE4, 0x1EF2,
    0x00D5, 0x1EAF, 0x1EB1, 0x1EB7, 0x1EA5, 0x1EA7, 0x1EA8, 0x1EAD,
    0x1EBD, 0x1EB9, 0x1EBF, 0x1EC1, 0x1EC3, 0x1EC5, 0x1EC7, 0x1ED1,
    0x1ED3, 0x1ED5, 0x1ED7, 0x1EE0, 0x01A0, 0x1ED9, 0x1EDD, 0x1EDF,
    0x1ECB, 0x1EF0, 0x1EE8, 0x1EEA, 0x1EEC, 0x01A1, 0x1EDB, 0x01AF,
    0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x1EA2, 0x0102, 0x1EB3, 0x1EB5,
    0x00C8, 0x00C9, 0x00CA, 0x1EBA, 0x00CC, 0x00CD, 0x0128, 0x1EF3,
    0x0110, 0x1EE9, 0x00D2, 0x00D3, 0x00D4, 0x1EA1, 0x1EF7, 0x1EEB,
    0x1EED, 0x00D9, 0x00DA, 0x1EF9, 0x1EF5, 0x00DD, 0x1EE1, 0x01B0,
    0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x1EA3, 0x0103, 0x1EEF, 0x1EAB,
    0x00E8, 0x00E9, 0x00EA, 0x1EBB, 0x00EC, 0x00ED, 0x0129, 0x1EC9,
    0x0111, 0x1EF1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x1ECF, 0x1ECD,
    0x1EE5, 0x00F9, 0x00FA, 0x0169, 0x1EE7, 0x00FD, 0x1EE3, 0x1EEE
};

static const wchar_t dec_mcs[] = {
    0x00A0, 0x00A1, 0x00A2, 0x00A3, 0xFFFD, 0x00A5, 0xFFFD, 0x00A7,
    0x00A4, 0x00A9, 0x00AA, 0x00AB, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
    0x00B0, 0x00B1, 0x00B2, 0x00B3, 0xFFFD, 0x00B5, 0x00B6, 0x00B7,
    0xFFFD, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0xFFFD, 0x00BF,
    0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
    0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
    0xFFFD, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0152,
    0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0178, 0xFFFD, 0x00DF,
    0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
    0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
    0xFFFD, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0153,
    0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FF, 0xFFFD, 0xFFFD
};

/* Mazovia (Polish) aka CP620
 * from "Mazowia to Unicode table", 04/24/96, Mikolaj Jedrzejak */
static const wchar_t mazovia[] = {
    /* Code point 0x9B is "zloty" symbol (zŽ), which is not
     *   widely used and for which there is no Unicode equivalent.
     * One reference shows 0xA8 as U+00A7 SECTION SIGN, but we're
     *   told that's incorrect. */
    0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x0105, 0x00E7,
    0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0107, 0x00C4, 0x0104,
    0x0118, 0x0119, 0x0142, 0x00F4, 0x00F6, 0x0106, 0x00FB, 0x00F9,
    0x015a, 0x00D6, 0x00DC, 0xFFFD, 0x0141, 0x00A5, 0x015b, 0x0192,
    0x0179, 0x017b, 0x00F3, 0x00d3, 0x0144, 0x0143, 0x017a, 0x017c,
    0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,
    0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,
    0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,
    0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F,
    0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,
    0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B,
    0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,
    0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4,
    0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229,
    0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248,
    0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0
};

struct cp_list_item {
    char *name;
    int codepage;
    int cp_size;
    const wchar_t *cp_table;
};

static const struct cp_list_item cp_list[] = {
    {"ISO-8859-1:1998 (Latin-1, West Europe)", 0, 96, iso_8859_1},
    {"ISO-8859-2:1999 (Latin-2, East Europe)", 0, 96, iso_8859_2},
    {"ISO-8859-3:1999 (Latin-3, South Europe)", 0, 96, iso_8859_3},
    {"ISO-8859-4:1998 (Latin-4, North Europe)", 0, 96, iso_8859_4},
    {"ISO-8859-5:1999 (Latin/Cyrillic)", 0, 96, iso_8859_5},
    {"ISO-8859-6:1999 (Latin/Arabic)", 0, 96, iso_8859_6},
    {"ISO-8859-7:1987 (Latin/Greek)", 0, 96, iso_8859_7},
    {"ISO-8859-8:1999 (Latin/Hebrew)", 0, 96, iso_8859_8},
    {"ISO-8859-9:1999 (Latin-5, Turkish)", 0, 96, iso_8859_9},
    {"ISO-8859-10:1998 (Latin-6, Nordic)", 0, 96, iso_8859_10},
    {"ISO-8859-11:2001 (Latin/Thai)", 0, 96, iso_8859_11},
    {"ISO-8859-13:1998 (Latin-7, Baltic)", 0, 96, iso_8859_13},
    {"ISO-8859-14:1998 (Latin-8, Celtic)", 0, 96, iso_8859_14},
    {"ISO-8859-15:1999 (Latin-9, \"euro\")", 0, 96, iso_8859_15},
    {"ISO-8859-16:2001 (Latin-10, Balkan)", 0, 96, iso_8859_16},

    {"UTF-8", CP_UTF8},

    {"KOI8-U", 0, 128, koi8_u},
    {"KOI8-R", 20866},
    {"HP-ROMAN8", 0, 96, roman8},
    {"VSCII", 0, 256, vscii},
    {"DEC-MCS", 0, 96, dec_mcs},

    {"Win1250 (Central European)", 1250},
    {"Win1251 (Cyrillic)", 1251},
    {"Win1252 (Western)", 1252},
    {"Win1253 (Greek)", 1253},
    {"Win1254 (Turkish)", 1254},
    {"Win1255 (Hebrew)", 1255},
    {"Win1256 (Arabic)", 1256},
    {"Win1257 (Baltic)", 1257},
    {"Win1258 (Vietnamese)", 1258},

    {"CP437", 437},
    {"CP620 (Mazovia)", 0, 128, mazovia},
    {"CP819", 28591},
    {"CP878", 20866},

    {"Use font encoding", -1},

    {0, 0}
};

static void link_font(WCHAR * line_tbl, WCHAR * font_tbl, WCHAR attr);

void init_ucs(Config *cfg, struct unicode_data *ucsdata)
{
    int i, j;
    int used_dtf = 0;
    char tbuf[256];

    for (i = 0; i < 256; i++)
	tbuf[i] = i;

    /* Decide on the Line and Font codepages */
    ucsdata->line_codepage = decode_codepage(cfg->line_codepage);

    if (ucsdata->font_codepage <= 0) { 
	ucsdata->font_codepage=0; 
	ucsdata->dbcs_screenfont=0; 
    }

    if (cfg->vtmode == VT_OEMONLY) {
	ucsdata->font_codepage = 437;
	ucsdata->dbcs_screenfont = 0;
	if (ucsdata->line_codepage <= 0)
	    ucsdata->line_codepage = GetACP();
    } else if (ucsdata->line_codepage <= 0)
	ucsdata->line_codepage = ucsdata->font_codepage;

    /* Collect screen font ucs table */
    if (ucsdata->dbcs_screenfont || ucsdata->font_codepage == 0) {
	get_unitab(ucsdata->font_codepage, ucsdata->unitab_font, 2);
	for (i = 128; i < 256; i++)
	    ucsdata->unitab_font[i] = (WCHAR) (CSET_ACP + i);
    } else {
	get_unitab(ucsdata->font_codepage, ucsdata->unitab_font, 1);

	/* CP437 fonts are often broken ... */
	if (ucsdata->font_codepage == 437)
	    ucsdata->unitab_font[0] = ucsdata->unitab_font[255] = 0xFFFF;
    }
    if (cfg->vtmode == VT_XWINDOWS)
	memcpy(ucsdata->unitab_font + 1, unitab_xterm_std,
	       sizeof(unitab_xterm_std));

    /* Collect OEMCP ucs table */
    get_unitab(CP_OEMCP, ucsdata->unitab_oemcp, 1);

    /* Collect CP437 ucs table for SCO acs */
    if (cfg->vtmode == VT_OEMANSI || cfg->vtmode == VT_XWINDOWS)
	memcpy(ucsdata->unitab_scoacs, ucsdata->unitab_oemcp,
	       sizeof(ucsdata->unitab_scoacs));
    else
	get_unitab(437, ucsdata->unitab_scoacs, 1);

    /* Collect line set ucs table */
    if (ucsdata->line_codepage == ucsdata->font_codepage &&
	(ucsdata->dbcs_screenfont ||
	 cfg->vtmode == VT_POORMAN || ucsdata->font_codepage==0)) {

	/* For DBCS and POOR fonts force direct to font */
	used_dtf = 1;
	for (i = 0; i < 32; i++)
	    ucsdata->unitab_line[i] = (WCHAR) i;
	for (i = 32; i < 256; i++)
	    ucsdata->unitab_line[i] = (WCHAR) (CSET_ACP + i);
	ucsdata->unitab_line[127] = (WCHAR) 127;
    } else {
	get_unitab(ucsdata->line_codepage, ucsdata->unitab_line, 0);
    }

#if 0
    debug(
	  ("Line cp%d, Font cp%d%s\n", ucsdata->line_codepage,
	   ucsdata->font_codepage, ucsdata->dbcs_screenfont ? " DBCS" : ""));

    for (i = 0; i < 256; i += 16) {
	for (j = 0; j < 16; j++) {
	    debug(("%04x%s", ucsdata->unitab_line[i + j], j == 15 ? "" : ","));
	}
	debug(("\n"));
    }
#endif

    /* VT100 graphics - NB: Broken for non-ascii CP's */
    memcpy(ucsdata->unitab_xterm, ucsdata->unitab_line,
	   sizeof(ucsdata->unitab_xterm));
    memcpy(ucsdata->unitab_xterm + '`', unitab_xterm_std,
	   sizeof(unitab_xterm_std));
    ucsdata->unitab_xterm['_'] = ' ';

    /* Generate UCS ->line page table. */
    if (ucsdata->uni_tbl) {
	for (i = 0; i < 256; i++)
	    if (ucsdata->uni_tbl[i])
		sfree(ucsdata->uni_tbl[i]);
	sfree(ucsdata->uni_tbl);
	ucsdata->uni_tbl = 0;
    }
    if (!used_dtf) {
	for (i = 0; i < 256; i++) {
	    if (DIRECT_CHAR(ucsdata->unitab_line[i]))
		continue;
	    if (DIRECT_FONT(ucsdata->unitab_line[i]))
		continue;
	    if (!ucsdata->uni_tbl) {
		ucsdata->uni_tbl = snewn(256, char *);
		memset(ucsdata->uni_tbl, 0, 256 * sizeof(char *));
	    }
	    j = ((ucsdata->unitab_line[i] >> 8) & 0xFF);
	    if (!ucsdata->uni_tbl[j]) {
		ucsdata->uni_tbl[j] = snewn(256, char);
		memset(ucsdata->uni_tbl[j], 0, 256 * sizeof(char));
	    }
	    ucsdata->uni_tbl[j][ucsdata->unitab_line[i] & 0xFF] = i;
	}
    }

    /* Find the line control characters. */
    for (i = 0; i < 256; i++)
	if (ucsdata->unitab_line[i] < ' '
	    || (ucsdata->unitab_line[i] >= 0x7F && 
		ucsdata->unitab_line[i] < 0xA0))
	    ucsdata->unitab_ctrl[i] = i;
	else
	    ucsdata->unitab_ctrl[i] = 0xFF;

    /* Generate line->screen direct conversion links. */
    if (cfg->vtmode == VT_OEMANSI || cfg->vtmode == VT_XWINDOWS)
	link_font(ucsdata->unitab_scoacs, ucsdata->unitab_oemcp, CSET_OEMCP);

    link_font(ucsdata->unitab_line, ucsdata->unitab_font, CSET_ACP);
    link_font(ucsdata->unitab_scoacs, ucsdata->unitab_font, CSET_ACP);
    link_font(ucsdata->unitab_xterm, ucsdata->unitab_font, CSET_ACP);

    if (cfg->vtmode == VT_OEMANSI || cfg->vtmode == VT_XWINDOWS) {
	link_font(ucsdata->unitab_line, ucsdata->unitab_oemcp, CSET_OEMCP);
	link_font(ucsdata->unitab_xterm, ucsdata->unitab_oemcp, CSET_OEMCP);
    }

    if (ucsdata->dbcs_screenfont &&
	ucsdata->font_codepage != ucsdata->line_codepage) {
	/* F***ing Microsoft fonts, Japanese and Korean codepage fonts
	 * have a currency symbol at 0x5C but their unicode value is 
	 * still given as U+005C not the correct U+00A5. */
	ucsdata->unitab_line['\\'] = CSET_OEMCP + '\\';
    }

    /* Last chance, if !unicode then try poorman links. */
    if (cfg->vtmode != VT_UNICODE) {
	static const char poorman_scoacs[] = 
	    "CueaaaaceeeiiiAAE**ooouuyOUc$YPsaiounNao?++**!<>###||||++||++++++--|-+||++--|-+----++++++++##||#aBTPEsyt******EN=+><++-=... n2* ";
	static const char poorman_latin1[] =
	    " !cL.Y|S\"Ca<--R~o+23'u|.,1o>///?AAAAAAACEEEEIIIIDNOOOOOxOUUUUYPBaaaaaaaceeeeiiiionooooo/ouuuuypy";
	static const char poorman_vt100[] = "*#****o~**+++++-----++++|****L.";

	for (i = 160; i < 256; i++)
	    if (!DIRECT_FONT(ucsdata->unitab_line[i]) &&
		ucsdata->unitab_line[i] >= 160 &&
		ucsdata->unitab_line[i] < 256) {
		ucsdata->unitab_line[i] =
		    (WCHAR) (CSET_ACP +
			     poorman_latin1[ucsdata->unitab_line[i] - 160]);
	    }
	for (i = 96; i < 127; i++)
	    if (!DIRECT_FONT(ucsdata->unitab_xterm[i]))
		ucsdata->unitab_xterm[i] =
	    (WCHAR) (CSET_ACP + poorman_vt100[i - 96]);
	for(i=128;i<256;i++) 
	    if (!DIRECT_FONT(ucsdata->unitab_scoacs[i]))
		ucsdata->unitab_scoacs[i] = 
		    (WCHAR) (CSET_ACP + poorman_scoacs[i - 128]);
    }
}

static void link_font(WCHAR * line_tbl, WCHAR * font_tbl, WCHAR attr)
{
    int font_index, line_index, i;
    for (line_index = 0; line_index < 256; line_index++) {
	if (DIRECT_FONT(line_tbl[line_index]))
	    continue;
	for(i = 0; i < 256; i++) {
	    font_index = ((32 + i) & 0xFF);
	    if (line_tbl[line_index] == font_tbl[font_index]) {
		line_tbl[line_index] = (WCHAR) (attr + font_index);
		break;
	    }
	}
    }
}

wchar_t xlat_uskbd2cyrllic(int ch)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?