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

📄 unicode.c

📁 大名鼎鼎的远程登录软件putty的Symbian版源码
💻 C
📖 第 1 页 / 共 3 页
字号:
    {"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){    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}, {

⌨️ 快捷键说明

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