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