#include <xterm.h>
#include <data.h>
#include <fontutils.h>
#include <X11/keysym.h>
unsigned xtermCharSetIn(unsigned code, int charset)
{
if (code >= 128 && code < 256) {
switch (charset) {
case 'A':
if (code == XK_sterling)
code = 0x23;
code &= 0x7f;
break;
#if OPT_XMC_GLITCH
case '?':
#endif
case '1':
case '2':
case 'B':
break;
case '0':
break;
case '4':
switch (code) {
case XK_sterling: code = 0x23; break;
case XK_threequarters: code = 0x40; break;
case XK_ydiaeresis: code = 0x5b; break;
case XK_onehalf: code = 0x5c; break;
case XK_diaeresis: code = 0x7b; break;
case XK_onequarter: code = 0x7d; break;
case XK_acute: code = 0x7e; break;
}
break;
case 'C':
case '5':
switch (code) {
case XK_Adiaeresis: code = 0x5b; break;
case XK_Odiaeresis: code = 0x5c; break;
case XK_Aring: code = 0x5d; break;
case XK_Udiaeresis: code = 0x5e; break;
case XK_eacute: code = 0x60; break;
case XK_adiaeresis: code = 0x7b; break;
case XK_odiaeresis: code = 0x7c; break;
case XK_aring: code = 0x7d; break;
case XK_udiaeresis: code = 0x7e; break;
}
break;
case 'R':
switch (code) {
case XK_sterling: code = 0x23; break;
case XK_agrave: code = 0x40; break;
case XK_degree: code = 0x5b; break;
case XK_ccedilla: code = 0x5c; break;
case XK_section: code = 0x5d; break;
case XK_eacute: code = 0x7b; break;
case XK_ugrave: code = 0x7c; break;
case XK_egrave: code = 0x7d; break;
case XK_diaeresis: code = 0x7e; break;
}
break;
case 'Q':
switch (code) {
case XK_agrave: code = 0x40; break;
case XK_acircumflex: code = 0x5b; break;
case XK_ccedilla: code = 0x5c; break;
case XK_ecircumflex: code = 0x5d; break;
case XK_icircumflex: code = 0x5e; break;
case XK_ocircumflex: code = 0x60; break;
case XK_eacute: code = 0x7b; break;
case XK_ugrave: code = 0x7c; break;
case XK_egrave: code = 0x7d; break;
case XK_ucircumflex: code = 0x7e; break;
}
break;
case 'K':
switch (code) {
case XK_section: code = 0x40; break;
case XK_Adiaeresis: code = 0x5b; break;
case XK_Odiaeresis: code = 0x5c; break;
case XK_Udiaeresis: code = 0x5d; break;
case XK_adiaeresis: code = 0x7b; break;
case XK_odiaeresis: code = 0x7c; break;
case XK_udiaeresis: code = 0x7d; break;
case XK_ssharp: code = 0x7e; break;
}
break;
case 'Y':
switch (code) {
case XK_sterling: code = 0x23; break;
case XK_section: code = 0x40; break;
case XK_degree: code = 0x5b; break;
case XK_ccedilla: code = 0x5c; break;
case XK_eacute: code = 0x5d; break;
case XK_ugrave: code = 0x60; break;
case XK_agrave: code = 0x7b; break;
case XK_ograve: code = 0x7c; break;
case XK_egrave: code = 0x7d; break;
case XK_igrave: code = 0x7e; break;
}
break;
case 'E':
case '6':
switch (code) {
case XK_Adiaeresis: code = 0x40; break;
case XK_AE: code = 0x5b; break;
case XK_Ooblique: code = 0x5c; break;
case XK_Aring: code = 0x5d; break;
case XK_Udiaeresis: code = 0x5e; break;
case XK_adiaeresis: code = 0x60; break;
case XK_ae: code = 0x7b; break;
case XK_oslash: code = 0x7c; break;
case XK_aring: code = 0x7d; break;
case XK_udiaeresis: code = 0x7e; break;
}
break;
case 'Z':
switch (code) {
case XK_sterling: code = 0x23; break;
case XK_section: code = 0x40; break;
case XK_exclamdown: code = 0x5b; break;
case XK_Ntilde: code = 0x5c; break;
case XK_questiondown: code = 0x5d; break;
case XK_degree: code = 0x7b; break;
case XK_ntilde: code = 0x7c; break;
case XK_ccedilla: code = 0x7d; break;
}
break;
case 'H':
case '7':
switch (code) {
case XK_Eacute: code = 0x40; break;
case XK_Adiaeresis: code = 0x5b; break;
case XK_Odiaeresis: code = 0x5c; break;
case XK_Aring: code = 0x5d; break;
case XK_Udiaeresis: code = 0x5e; break;
case XK_eacute: code = 0x60; break;
case XK_adiaeresis: code = 0x7b; break;
case XK_odiaeresis: code = 0x7c; break;
case XK_aring: code = 0x7d; break;
case XK_udiaeresis: code = 0x7e; break;
}
break;
case '=':
switch (code) {
case XK_ugrave: code = 0x23; break;
case XK_agrave: code = 0x40; break;
case XK_eacute: code = 0x5b; break;
case XK_ccedilla: code = 0x5c; break;
case XK_ecircumflex: code = 0x5d; break;
case XK_icircumflex: code = 0x5e; break;
case XK_egrave: code = 0x5f; break;
case XK_ocircumflex: code = 0x60; break;
case XK_adiaeresis: code = 0x7b; break;
case XK_odiaeresis: code = 0x7c; break;
case XK_udiaeresis: code = 0x7d; break;
case XK_ucircumflex: code = 0x7e; break;
}
break;
default:
break;
}
code &= 0x7f;
}
return code;
}
int xtermCharSetOut(IChar *buf, IChar *ptr, char leftset)
{
IChar *s;
register TScreen *screen = &term->screen;
int count = 0;
int rightset = screen->gsets[(int)(screen->curgr)];
TRACE(("CHARSET GL=%c(G%d) GR=%c(G%d) %s\n",
leftset, screen->curss ? screen->curss : screen->curgl,
rightset, screen->curgr,
visibleIChar(buf, ptr-buf)));
for (s = buf; s < ptr; ++s) {
int eight = CharOf(E2A(*s));
int seven = eight & 0x7f;
int cs = (eight >= 128) ? rightset : leftset;
int chr = eight;
count++;
switch (cs) {
case 'A':
if ((term->flags & NATIONAL)
|| (screen->vtXX_level <= 1)) {
if (chr == 0x23)
chr = XPOUND;
} else {
chr = (seven | 0x80);
}
break;
#if OPT_XMC_GLITCH
case '?':
#endif
case '1':
case '2':
case 'B':
break;
case '0':
if (chr >= 0x5f && chr <= 0x7e) {
#if OPT_WIDE_CHARS
if (screen->utf8_mode)
chr = dec2ucs(chr - 0x5f);
else
#endif
chr = (chr == 0x5f) ? 0x7f : (chr - 0x5f);
}
break;
case '4':
switch (chr = seven) {
case 0x23: chr = XK_sterling; break;
case 0x40: chr = XK_threequarters; break;
case 0x5b: chr = XK_ydiaeresis; break;
case 0x5c: chr = XK_onehalf; break;
case 0x5d: chr = XK_bar; break;
case 0x7b: chr = XK_diaeresis; break;
case 0x7c: chr = XK_f; break;
case 0x7d: chr = XK_onequarter; break;
case 0x7e: chr = XK_acute; break;
}
break;
case 'C':
case '5':
switch (chr = seven) {
case 0x5b: chr = XK_Adiaeresis; break;
case 0x5c: chr = XK_Odiaeresis; break;
case 0x5d: chr = XK_Aring; break;
case 0x5e: chr = XK_Udiaeresis; break;
case 0x60: chr = XK_eacute; break;
case 0x7b: chr = XK_adiaeresis; break;
case 0x7c: chr = XK_odiaeresis; break;
case 0x7d: chr = XK_aring; break;
case 0x7e: chr = XK_udiaeresis; break;
}
break;
case 'R':
switch (chr = seven) {
case 0x23: chr = XK_sterling; break;
case 0x40: chr = XK_agrave; break;
case 0x5b: chr = XK_degree; break;
case 0x5c: chr = XK_ccedilla; break;
case 0x5d: chr = XK_section; break;
case 0x7b: chr = XK_eacute; break;
case 0x7c: chr = XK_ugrave; break;
case 0x7d: chr = XK_egrave; break;
case 0x7e: chr = XK_diaeresis; break;
}
break;
case 'Q':
switch (chr = seven) {
case 0x40: chr = XK_agrave; break;
case 0x5b: chr = XK_acircumflex; break;
case 0x5c: chr = XK_ccedilla; break;
case 0x5d: chr = XK_ecircumflex; break;
case 0x5e: chr = XK_icircumflex; break;
case 0x60: chr = XK_ocircumflex; break;
case 0x7b: chr = XK_eacute; break;
case 0x7c: chr = XK_ugrave; break;
case 0x7d: chr = XK_egrave; break;
case 0x7e: chr = XK_ucircumflex; break;
}
break;
case 'K':
switch (chr = seven) {
case 0x40: chr = XK_section; break;
case 0x5b: chr = XK_Adiaeresis; break;
case 0x5c: chr = XK_Odiaeresis; break;
case 0x5d: chr = XK_Udiaeresis; break;
case 0x7b: chr = XK_adiaeresis; break;
case 0x7c: chr = XK_odiaeresis; break;
case 0x7d: chr = XK_udiaeresis; break;
case 0x7e: chr = XK_ssharp; break;
}
break;
case 'Y':
switch (chr = seven) {
case 0x23: chr = XK_sterling; break;
case 0x40: chr = XK_section; break;
case 0x5b: chr = XK_degree; break;
case 0x5c: chr = XK_ccedilla; break;
case 0x5d: chr = XK_eacute; break;
case 0x60: chr = XK_ugrave; break;
case 0x7b: chr = XK_agrave; break;
case 0x7c: chr = XK_ograve; break;
case 0x7d: chr = XK_egrave; break;
case 0x7e: chr = XK_igrave; break;
}
break;
case 'E':
case '6':
switch (chr = seven) {
case 0x40: chr = XK_Adiaeresis; break;
case 0x5b: chr = XK_AE; break;
case 0x5c: chr = XK_Ooblique; break;
case 0x5d: chr = XK_Aring; break;
case 0x5e: chr = XK_Udiaeresis; break;
case 0x60: chr = XK_adiaeresis; break;
case 0x7b: chr = XK_ae; break;
case 0x7c: chr = XK_oslash; break;
case 0x7d: chr = XK_aring; break;
case 0x7e: chr = XK_udiaeresis; break;
}
break;
case 'Z':
switch (chr = seven) {
case 0x23: chr = XK_sterling; break;
case 0x40: chr = XK_section; break;
case 0x5b: chr = XK_exclamdown; break;
case 0x5c: chr = XK_Ntilde; break;
case 0x5d: chr = XK_questiondown; break;
case 0x7b: chr = XK_degree; break;
case 0x7c: chr = XK_ntilde; break;
case 0x7d: chr = XK_ccedilla; break;
}
break;
case 'H':
case '7':
switch (chr = seven) {
case 0x40: chr = XK_Eacute; break;
case 0x5b: chr = XK_Adiaeresis; break;
case 0x5c: chr = XK_Odiaeresis; break;
case 0x5d: chr = XK_Aring; break;
case 0x5e: chr = XK_Udiaeresis; break;
case 0x60: chr = XK_eacute; break;
case 0x7b: chr = XK_adiaeresis; break;
case 0x7c: chr = XK_odiaeresis; break;
case 0x7d: chr = XK_aring; break;
case 0x7e: chr = XK_udiaeresis; break;
}
break;
case '=':
switch (chr = seven) {
case 0x23: chr = XK_ugrave; break;
case 0x40: chr = XK_agrave; break;
case 0x5b: chr = XK_eacute; break;
case 0x5c: chr = XK_ccedilla; break;
case 0x5d: chr = XK_ecircumflex; break;
case 0x5e: chr = XK_icircumflex; break;
case 0x5f: chr = XK_egrave; break;
case 0x60: chr = XK_ocircumflex; break;
case 0x7b: chr = XK_adiaeresis; break;
case 0x7c: chr = XK_odiaeresis; break;
case 0x7d: chr = XK_udiaeresis; break;
case 0x7e: chr = XK_ucircumflex; break;
}
break;
default:
count --;
break;
}
*s = A2E(chr);
}
return count;
}