⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unicode.c

📁 远程登陆工具软件源码 用于远程登陆unix
💻 C
📖 第 1 页 / 共 3 页
字号:

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) (ATTR_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) (ATTR_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, ATTR_OEMCP);

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

    if (cfg->vtmode == VT_OEMANSI || cfg->vtmode == VT_XWINDOWS) {
	link_font(ucsdata->unitab_line, ucsdata->unitab_oemcp, ATTR_OEMCP);
	link_font(ucsdata->unitab_xterm, ucsdata->unitab_oemcp, ATTR_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['\\'] = ATTR_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) (ATTR_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) (ATTR_ACP + poorman_vt100[i - 96]);
	for(i=128;i<256;i++) 
	    if (!DIRECT_FONT(ucsdata->unitab_scoacs[i]))
		ucsdata->unitab_scoacs[i] = 
		    (WCHAR) (ATTR_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)
{
    static const wchar_t cyrtab[] = {
            0,      1,       2,      3,      4,      5,      6,      7,
            8,      9,      10,     11,     12,     13,     14,     15,
            16,     17,     18,     19,     20,     21,     22,     23,
            24,     25,     26,     27,     28,     29,     30,     31,
            32,     33, 0x042d,     35,     36,     37,     38, 0x044d,
            40,     41,     42, 0x0406, 0x0431, 0x0454, 0x044e, 0x002e,
            48,     49,     50,     51,     52,     53,     54,     55,
            56,     57, 0x0416, 0x0436, 0x0411, 0x0456, 0x042e, 0x002c,
            64, 0x0424, 0x0418, 0x0421, 0x0412, 0x0423, 0x0410, 0x041f,
        0x0420, 0x0428, 0x041e, 0x041b, 0x0414, 0x042c, 0x0422, 0x0429,
        0x0417, 0x0419, 0x041a, 0x042b, 0x0415, 0x0413, 0x041c, 0x0426,
        0x0427, 0x041d, 0x042f, 0x0445, 0x0457, 0x044a,     94, 0x0404,
            96, 0x0444, 0x0438, 0x0441, 0x0432, 0x0443, 0x0430, 0x043f,
        0x0440, 0x0448, 0x043e, 0x043b, 0x0434, 0x044c, 0x0442, 0x0449,
        0x0437, 0x0439, 0x043a, 0x044b, 0x0435, 0x0433, 0x043c, 0x0446,
        0x0447, 0x043d, 0x044f, 0x0425, 0x0407, 0x042a,    126,    127
       };
    return cyrtab[ch&0x7F];
}

int check_compose_internal(int first, int second, int recurse)
{

    static const struct {
	char first, second;
	wchar_t composed;
    } composetbl[] = {
	{
	0x2b, 0x2b, 0x0023}, {
	0x41, 0x41, 0x0040}, {
	0x28, 0x28, 0x005b}, {
	0x2f, 0x2f, 0x005c}, {
	0x29, 0x29, 0x005d}, {
	0x28, 0x2d, 0x007b}, {
	0x2d, 0x29, 0x007d}, {
	0x2f, 0x5e, 0x007c}, {
	0x21, 0x21, 0x00a1}, {
	0x43, 0x2f, 0x00a2}, {
	0x43, 0x7c, 0x00a2}, {
	0x4c, 0x2d, 0x00a3}, {
	0x4c, 0x3d, 0x20a4}, {
	0x58, 0x4f, 0x00a4}, {
	0x58, 0x30, 0x00a4}, {
	0x59, 0x2d, 0x00a5}, {
	0x59, 0x3d, 0x00a5}, {
	0x7c, 0x7c, 0x00a6}, {
	0x53, 0x4f, 0x00a7}, {
	0x53, 0x21, 0x00a7}, {
	0x53, 0x30, 0x00a7}, {
	0x22, 0x22, 0x00a8}, {
	0x43, 0x4f, 0x00a9}, {
	0x43, 0x30, 0x00a9}, {
	0x41, 0x5f, 0x00aa}, {
	0x3c, 0x3c, 0x00ab}, {
	0x2c, 0x2d, 0x00ac}, {
	0x2d, 0x2d, 0x00ad}, {
	0x52, 0x4f, 0x00ae}, {
	0x2d, 0x5e, 0x00af}, {
	0x30, 0x5e, 0x00b0}, {
	0x2b, 0x2d, 0x00b1}, {
	0x32, 0x5e, 0x00b2}, {
	0x33, 0x5e, 0x00b3}, {
	0x27, 0x27, 0x00b4}, {
	0x2f, 0x55, 0x00b5}, {
	0x50, 0x21, 0x00b6}, {
	0x2e, 0x5e, 0x00b7}, {
	0x2c, 0x2c, 0x00b8}, {
	0x31, 0x5e, 0x00b9}, {
	0x4f, 0x5f, 0x00ba}, {
	0x3e, 0x3e, 0x00bb}, {
	0x31, 0x34, 0x00bc}, {
	0x31, 0x32, 0x00bd}, {
	0x33, 0x34, 0x00be}, {
	0x3f, 0x3f, 0x00bf}, {
	0x60, 0x41, 0x00c0}, {
	0x27, 0x41, 0x00c1}, {
	0x5e, 0x41, 0x00c2}, {
	0x7e, 0x41, 0x00c3}, {
	0x22, 0x41, 0x00c4}, {
	0x2a, 0x41, 0x00c5}, {
	0x41, 0x45, 0x00c6}, {
	0x2c, 0x43, 0x00c7}, {
	0x60, 0x45, 0x00c8}, {
	0x27, 0x45, 0x00c9}, {
	0x5e, 0x45, 0x00ca}, {
	0x22, 0x45, 0x00cb}, {
	0x60, 0x49, 0x00cc}, {
	0x27, 0x49, 0x00cd}, {
	0x5e, 0x49, 0x00ce}, {
	0x22, 0x49, 0x00cf}, {
	0x2d, 0x44, 0x00d0}, {
	0x7e, 0x4e, 0x00d1}, {
	0x60, 0x4f, 0x00d2}, {
	0x27, 0x4f, 0x00d3}, {
	0x5e, 0x4f, 0x00d4}, {
	0x7e, 0x4f, 0x00d5}, {
	0x22, 0x4f, 0x00d6}, {
	0x58, 0x58, 0x00d7}, {
	0x2f, 0x4f, 0x00d8}, {
	0x60, 0x55, 0x00d9}, {
	0x27, 0x55, 0x00da}, {
	0x5e, 0x55, 0x00db}, {
	0x22, 0x55, 0x00dc}, {
	0x27, 0x59, 0x00dd}, {
	0x48, 0x54, 0x00de}, {
	0x73, 0x73, 0x00df}, {
	0x60, 0x61, 0x00e0}, {
	0x27, 0x61, 0x00e1}, {
	0x5e, 0x61, 0x00e2}, {
	0x7e, 0x61, 0x00e3}, {
	0x22, 0x61, 0x00e4}, {
	0x2a, 0x61, 0x00e5}, {
	0x61, 0x65, 0x00e6}, {
	0x2c, 0x63, 0x00e7}, {
	0x60, 0x65, 0x00e8}, {
	0x27, 0x65, 0x00e9}, {
	0x5e, 0x65, 0x00ea}, {
	0x22, 0x65, 0x00eb}, {
	0x60, 0x69, 0x00ec}, {
	0x27, 0x69, 0x00ed}, {
	0x5e, 0x69, 0x00ee}, {
	0x22, 0x69, 0x00ef}, {
	0x2d, 0x64, 0x00f0}, {
	0x7e, 0x6e, 0x00f1}, {
	0x60, 0x6f, 0x00f2}, {
	0x27, 0x6f, 0x00f3}, {
	0x5e, 0x6f, 0x00f4}, {
	0x7e, 0x6f, 0x00f5}, {
	0x22, 0x6f, 0x00f6}, {
	0x3a, 0x2d, 0x00f7}, {
	0x6f, 0x2f, 0x00f8}, {
	0x60, 0x75, 0x00f9}, {
	0x27, 0x75, 0x00fa}, {
	0x5e, 0x75, 0x00fb}, {
	0x22, 0x75, 0x00fc}, {
	0x27, 0x79, 0x00fd}, {
	0x68, 0x74, 0x00fe}, {
	0x22, 0x79, 0x00ff},
	    /* Unicode extras. */
	{
	0x6f, 0x65, 0x0153}, {
	0x4f, 0x45, 0x0152},
	    /* Compose pairs from UCS */
	{
	0x41, 0x2D, 0x0100}, {
	0x61, 0x2D, 0x0101}, {
	0x43, 0x27, 0x0106}, {
	0x63, 0x27, 0x0107}, {
	0x43, 0x5E, 0x0108}, {
	0x63, 0x5E, 0x0109}, {
	0x45, 0x2D, 0x0112}, {
	0x65, 0x2D, 0x0113}, {
	0x47, 0x5E, 0x011C}, {
	0x67, 0x5E, 0x011D}, {
	0x47, 0x2C, 0x0122}, {
	0x67, 0x2C, 0x0123}, {
	0x48, 0x5E, 0x0124}, {
	0x68, 0x5E, 0x0125}, {
	0x49, 0x7E, 0x0128}, {
	0x69, 0x7E, 0x0129}, {
	0x49, 0x2D, 0x012A}, {
	0x69, 0x2D, 0x012B}, {
	0x4A, 0x5E, 0x0134}, {
	0x6A, 0x5E, 0x0135}, {
	0x4B, 0x2C, 0x0136}, {
	0x6B, 0x2C, 0x0137}, {
	0x4C, 0x27, 0x0139}, {
	0x6C, 0x27, 0x013A}, {
	0x4C, 0x2C, 0x013B}, {
	0x6C, 0x2C, 0x013C}, {
	0x4E, 0x27, 0x0143}, {
	0x6E, 0x27, 0x0144}, {
	0x4E, 0x2C, 0x0145}, {
	0x6E, 0x2C, 0x0146}, {
	0x4F, 0x2D, 0x014C}, {
	0x6F, 0x2D, 0x014D}, {
	0x52, 0x27, 0x0154}, {
	0x72, 0x27, 0x0155}, {
	0x52, 0x2C, 0x0156}, {
	0x72, 0x2C, 0x0157}, {
	0x53, 0x27, 0x015A}, {
	0x73, 0x27, 0x015B}, {
	0x53, 0x5E, 0x015C}, {
	0x73, 0x5E, 0x015D}, {
	0x53, 0x2C, 0x015E}, {
	0x73, 0x2C, 0x015F}, {
	0x54, 0x2C, 0x0162}, {
	0x74, 0x2C, 0x0163}, {
	0x55, 0x7E, 0x0168}, {
	0x75, 0x7E, 0x0169}, {
	0x55, 0x2D, 0x016A}, {
	0x75, 0x2D, 0x016B}, {
	0x55, 0x2A, 0x016E}, {
	0x75, 0x2A, 0x016F}, {
	0x57, 0x5E, 0x0174}, {
	0x77, 0x5E, 0x0175}, {
	0x59, 0x5E, 0x0176}, {
	0x79, 0x5E, 0x0177}, {
	0x59, 0x22, 0x0178}, {
	0x5A, 0x27, 0x0179}, {
	0x7A, 0x27, 0x017A}, {
	0x47, 0x27, 0x01F4}, {
	0x67, 0x27, 0x01F5}, {
	0x4E, 0x60, 0x01F8}, {
	0x6E, 0x60, 0x01F9}, {
	0x45, 0x2C, 0x0228}, {
	0x65, 0x2C, 0x0229}, {
	0x59, 0x2D, 0x0232}, {
	0x79, 0x2D, 0x0233}, {
	0x44, 0x2C, 0x1E10}, {
	0x64, 0x2C, 0x1E11}, {
	0x47, 0x2D, 0x1E20}, {
	0x67, 0x2D, 0x1E21}, {
	0x48, 0x22, 0x1E26}, {
	0x68, 0x22, 0x1E27}, {
	0x48, 0x2C, 0x1E28}, {

⌨️ 快捷键说明

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