From 4b4ecd72e19dfac66aff6b49a0aaa8290cc0a4f4 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Sat, 5 Jan 1991 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1991-01-05 --- gnot/screen.c | 171 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 166 insertions(+), 5 deletions(-) diff --git a/gnot/screen.c b/gnot/screen.c index 41bd4f00ae98b62b7bd587d6fe928246eb4798d8..f946c67e0549dedef9befab8450f39c6322e23d5 100644 --- a/gnot/screen.c +++ b/gnot/screen.c @@ -337,11 +337,152 @@ duartstartrs232o(void) duartrs232intr(); } +struct latin +{ + uchar l; + char c[2]; +}latintab[] = { + '€', "!!", /* spanish initial ! */ + '€', "c|", /* cent */ + '€', "c$", /* cent */ + '€', "l$", /* pound sterling */ + '€', "g$", /* general currency */ + '€', "y$", /* yen */ + '€', "j$", /* yen */ + '€', "||", /* broken vertical bar */ + '€', "SS", /* section symbol */ + '€', "\"\"", /* dieresis */ + '€', "cr", /* copyright */ + '€', "cO", /* copyright */ + '€', "sa", /* super a, feminine ordinal */ + '€', "<<", /* left angle quotation */ + '€', "no", /* not sign, hooked overbar */ + '€', "--", /* soft hyphen */ + '€', "rg", /* registered trademark */ + '€', "__", /* macron */ + '€', "s0", /* degree (sup o) */ + '€', "+-", /* plus-minus */ + '€', "s2", /* sup 2 */ + '€', "s3", /* sup 3 */ + '€', "''", /* grave accent */ + '€', "mu", /* mu */ + '€', "pg", /* paragraph (pilcrow) */ + '€', "..", /* centered . */ + '€', ",,", /* cedilla */ + '€', "s1", /* sup 1 */ + '€', "so", /* sup o */ + '€', ">>", /* right angle quotation */ + '€', "14", /* 1/4 */ + '€', "12", /* 1/2 */ + '€', "34", /* 3/4 */ + '€', "??", /* spanish initial ? */ + '€', "A`", /* A grave */ + '€', "A'", /* A acute */ + '€', "A^", /* A circumflex */ + '€', "A~", /* A tilde */ + '€', "A\"", /* A dieresis */ + '€', "A:", /* A dieresis */ + '€', "Ao", /* A circle */ + '€', "AO", /* A circle */ + '€', "Ae", /* AE ligature */ + '€', "AE", /* AE ligature */ + '€', "C,", /* C cedilla */ + '€', "E`", /* E grave */ + '€', "E'", /* E acute */ + '€', "E^", /* E circumflex */ + '€', "E\"", /* E dieresis */ + '€', "E:", /* E dieresis */ + '€', "I`", /* I grave */ + '€', "I'", /* I acute */ + '€', "I^", /* I circumflex */ + '€', "I\"", /* I dieresis */ + '€', "I:", /* I dieresis */ + '€', "D-", /* Eth */ + '€', "N~", /* N tilde */ + '€', "O`", /* O grave */ + '€', "O'", /* O acute */ + '€', "O^", /* O circumflex */ + '€', "O~", /* O tilde */ + '€', "O\"", /* O dieresis */ + '€', "O:", /* O dieresis */ + '€', "OE", /* O dieresis */ + '€', "Oe", /* O dieresis */ + '€', "xx", /* times sign */ + '€', "O/", /* O slash */ + '€', "U`", /* U grave */ + '€', "U'", /* U acute */ + '€', "U^", /* U circumflex */ + '€', "U\"", /* U dieresis */ + '€', "U:", /* U dieresis */ + '€', "UE", /* U dieresis */ + '€', "Ue", /* U dieresis */ + '€', "Y'", /* Y acute */ + '€', "P|", /* Thorn */ + '€', "Th", /* Thorn */ + '€', "TH", /* Thorn */ + '€', "ss", /* sharp s */ + '€', "a`", /* a grave */ + '€', "a'", /* a acute */ + '€', "a^", /* a circumflex */ + '€', "a~", /* a tilde */ + '€', "a\"", /* a dieresis */ + '€', "a:", /* a dieresis */ + '€', "ao", /* a circle */ + '€', "ae", /* ae ligature */ + '€', "c,", /* c cedilla */ + '€', "e`", /* e grave */ + '€', "e'", /* e acute */ + '€', "e^", /* e circumflex */ + '€', "e\"", /* e dieresis */ + '€', "e:", /* e dieresis */ + '€', "i`", /* i grave */ + '€', "i'", /* i acute */ + '€', "i^", /* i circumflex */ + '€', "i\"", /* i dieresis */ + '€', "i:", /* i dieresis */ + '€', "d-", /* eth */ + '€', "n~", /* n tilde */ + '€', "o`", /* o grave */ + '€', "o'", /* o acute */ + '€', "o^", /* o circumflex */ + '€', "o~", /* o tilde */ + '€', "o\"", /* o dieresis */ + '€', "o:", /* o dieresis */ + '€', "oe", /* o dieresis */ + '€', "-:", /* divide sign */ + '€', "o/", /* o slash */ + '€', "u`", /* u grave */ + '€', "u'", /* u acute */ + '€', "u^", /* u circumflex */ + '€', "u\"", /* u dieresis */ + '€', "u:", /* u dieresis */ + '€', "ue", /* u dieresis */ + '€', "y'", /* y acute */ + '€', "th", /* thorn */ + '€', "p|", /* thorn */ + '€', "y\"", /* y dieresis */ + '€', "y:", /* y dieresis */ + 0, 0, +}; + +int +latin1(int k1, int k2) +{ + int i; + struct latin *l; + + for(l=latintab; l->l; l++) + if(k1==l->c[0] && k2==l->c[1]) + return l->l; + return 0; +} + void duartintr(Ureg *ur) { int cause, status, c; Duart *duart; + static int kbdstate, k1, k2; duart = DUARTREG; cause = duart->is_imr; @@ -371,11 +512,31 @@ duartintr(Ureg *ur) if(status & PAR_ERR) /* control word: caps lock (0x4) or repeat (0x10) */ kbdrepeat((c&0x10) == 0); else{ - if(c == 0x7F) - c = 0xFF; /* VIEW key (bizarre) */ - if(c & 0x80) - c = keymap[c&0x7F]; - kbdchar(c); + if(c == 0x7F) /* VIEW key (bizarre) */ + c = 0xFF; + if(c == 0xB6) /* NUM PAD */ + kbdstate = 1; + else{ + if(c & 0x80) + c = keymap[c&0x7F]; + switch(kbdstate){ + case 1: + k1 = c; + kbdstate = 2; + break; + case 2: + k2 = c; + c = latin1(k1, k2); + if(c == 0){ + kbdchar(k1); + c = k2; + } + /* fall through */ + default: + kbdstate = 0; + kbdchar(c); + } + } } } /*