SCO ACS patch from RDB. Apparently required for the Linux console
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sat, 19 May 2001 14:12:41 +0000 (14:12 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sat, 19 May 2001 14:12:41 +0000 (14:12 +0000)
terminfo.

git-svn-id: svn://svn.tartarus.org/sgt/putty@1137 cda61777-01e9-0310-a592-d414129be87e

putty.h
terminal.c
unicode.c

diff --git a/putty.h b/putty.h
index 6170303..cb77ac9 100644 (file)
--- a/putty.h
+++ b/putty.h
@@ -54,6 +54,7 @@
 /* These are internal use overlapping with the UTF-16 surrogates */
 #define ATTR_ASCII   0x0000D800UL      /* normal ASCII charset ESC ( B */
 #define ATTR_LINEDRW 0x0000D900UL      /* line drawing charset ESC ( 0 */
+#define ATTR_SCOACS  0x0000DA00UL      /* SCO Alternate charset */
 #define ATTR_GBCHR   0x0000DB00UL      /* UK variant   charset ESC ( A */
 #define CSET_MASK    0x0000FF00UL      /* Character set mask; MUST be 0xFF00 */
 
@@ -120,6 +121,7 @@ GLOBAL int dbcs_screenfont;
 GLOBAL int font_codepage;
 GLOBAL int kbd_codepage;
 GLOBAL int line_codepage;
+GLOBAL WCHAR unitab_scoacs[256];
 GLOBAL WCHAR unitab_line[256];
 GLOBAL WCHAR unitab_font[256];
 GLOBAL WCHAR unitab_xterm[256];
index 9f623e5..391f0d2 100644 (file)
@@ -104,6 +104,7 @@ static int tblinker;                       /* When the blinking text is on */
 static int blink_is_real;             /* Actually blink blinking text */
 static int term_echoing;              /* Does terminal want local echo? */
 static int term_editing;              /* Does terminal want local edit? */
+static int sco_acs, save_sco_acs;      /* CSI 10,11,12m -> OEM charset */
 static int vt52_bold;                 /* Force bold on non-bold colours */
 static int utf_state;                 /* Is there a pending UTF-8 character */
 static int utf_char;                  /* and what is it so far. */
@@ -116,7 +117,7 @@ static unsigned long cset_attr[2];
 /*
  * Saved settings on the alternate screen.
  */
-static int alt_x, alt_y, alt_om, alt_wrap, alt_wnext, alt_ins, alt_cset;
+static int alt_x, alt_y, alt_om, alt_wrap, alt_wnext, alt_ins, alt_cset, alt_sco_acs;
 static int alt_t, alt_b;
 static int alt_which;
 
@@ -278,6 +279,7 @@ static void power_on(void)
     alt_wnext = wrapnext = alt_ins = insert = FALSE;
     alt_wrap = wrap = cfg.wrap_mode;
     alt_cset = cset = 0;
+    alt_sco_acs = sco_acs = 0;
     cset_attr[0] = cset_attr[1] = ATTR_ASCII;
     rvideo = 0;
     in_vbell = FALSE;
@@ -536,6 +538,9 @@ static void swap_screen(int which)
     t = cset;
     cset = alt_cset;
     alt_cset = t;
+    t = sco_acs;
+    sco_acs = alt_sco_acs;
+    alt_sco_acs = t;
 
     fix_cpos;
 }
@@ -690,6 +695,7 @@ static void save_cursor(int save)
        save_attr = curr_attr;
        save_cset = cset;
        save_csattr = cset_attr[cset];
+       save_sco_acs = sco_acs;
     } else {
        curs = savecurs;
        /* Make sure the window hasn't shrunk since the save */
@@ -701,6 +707,7 @@ static void save_cursor(int save)
        curr_attr = save_attr;
        cset = save_cset;
        cset_attr[cset] = save_csattr;
+       sco_acs = save_sco_acs;
        fix_cpos;
        if (use_bce)
            erase_char = (' ' | (curr_attr & (ATTR_FGMASK | ATTR_BGMASK)));
@@ -1024,6 +1031,13 @@ void term_out(void)
                    if (c >= 0x10000)
                        c = 0xFFFD;
                    break;
+           }
+           /* Are we in the nasty ACS mode? Note: no sco in utf mode. */
+           else if(sco_acs && 
+                   (c!='\033' && c!='\n' && c!='\r' && c!='\b'))
+           {
+              if (sco_acs == 2) c ^= 0x80;
+              c |= ATTR_SCOACS;
            } else {
              evil_jump:;
                switch (cset_attr[cset]) {
@@ -1052,6 +1066,9 @@ void term_out(void)
                    else
                        c = ((unsigned char) c) | ATTR_ASCII;
                    break;
+               case ATTR_SCOACS:
+                   if (c>=' ') c = ((unsigned char)c) | ATTR_SCOACS;
+                   break;
                }
            }
        }
@@ -1483,6 +1500,10 @@ void term_out(void)
                    compatibility(VT100);
                    cset_attr[0] = ATTR_LINEDRW;
                    break;
+                 case ANSI('U', '('): 
+                   compatibility(OTHER);
+                   cset_attr[0] = ATTR_SCOACS; 
+                   break;
 
                  case ANSI('A', ')'):
                    compatibility(VT100);
@@ -1496,6 +1517,10 @@ void term_out(void)
                    compatibility(VT100);
                    cset_attr[1] = ATTR_LINEDRW;
                    break;
+                 case ANSI('U', ')'): 
+                   compatibility(OTHER);
+                   cset_attr[1] = ATTR_SCOACS; 
+                   break;
 
                  case ANSI('8', '%'):  /* Old Linux code */
                  case ANSI('G', '%'):
@@ -1763,6 +1788,15 @@ void term_out(void)
                                  case 7:       /* enable reverse video */
                                    curr_attr |= ATTR_REVERSE;
                                    break;
+                                 case 10:      /* SCO acs off */
+                                   compatibility(SCOANSI);
+                                   sco_acs = 0; break;
+                                 case 11:      /* SCO acs on */
+                                   compatibility(SCOANSI);
+                                   sco_acs = 1; break;
+                                 case 12:      /* SCO acs on flipped */
+                                   compatibility(SCOANSI);
+                                   sco_acs = 2; break;
                                  case 22:      /* disable bold */
                                    compatibility2(OTHER, VT220);
                                    curr_attr &= ~ATTR_BOLD;
@@ -2499,6 +2533,9 @@ static void do_paint(Context ctx, int may_optimise)
              case ATTR_LINEDRW:
                tchar = unitab_xterm[tchar & 0xFF];
                break;
+             case ATTR_SCOACS:  
+               tchar = unitab_scoacs[tchar&0xFF]; 
+               break;
            }
            tattr |= (tchar & CSET_MASK);
            tchar &= CHAR_MASK;
@@ -2733,6 +2770,9 @@ static void clipme(pos top, pos bottom)
              case ATTR_ASCII:
                uc = unitab_line[uc & 0xFF];
                break;
+             case ATTR_SCOACS:  
+               uc = unitab_scoacs[uc&0xFF]; 
+               break;
            }
            switch (uc & CSET_MASK) {
              case ATTR_ACP:
@@ -2893,6 +2933,9 @@ static int wordtype(int uc)
       case ATTR_ASCII:
        uc = unitab_line[uc & 0xFF];
        break;
+      case ATTR_SCOACS:  
+       uc = unitab_scoacs[uc&0xFF]; 
+       break;
     }
     switch (uc & CSET_MASK) {
       case ATTR_ACP:
index 1cafcc1..4703425 100644 (file)
--- a/unicode.c
+++ b/unicode.c
@@ -74,6 +74,12 @@ void init_ucs_tables(void)
     /* Collect OEMCP ucs table */
     get_unitab(CP_OEMCP, unitab_oemcp, 1);
 
+    /* Collect CP437 ucs table for SCO acs */
+    if (cfg.vtmode == VT_OEMANSI || cfg.vtmode == VT_XWINDOWS)
+       memcpy(unitab_scoacs, unitab_oemcp, sizeof(unitab_scoacs));
+    else
+       get_unitab(437, unitab_scoacs, 1);
+
     /* Collect line set ucs table */
     if (line_codepage == font_codepage &&
        (dbcs_screenfont || cfg.vtmode == VT_POORMAN)) {
@@ -143,7 +149,11 @@ void init_ucs_tables(void)
            unitab_ctrl[i] = 0xFF;
 
     /* Generate line->screen direct conversion links. */
+    if (cfg.vtmode == VT_OEMANSI || cfg.vtmode == VT_XWINDOWS)
+       link_font(unitab_scoacs, unitab_oemcp, ATTR_OEMCP);
+
     link_font(unitab_line, unitab_font, ATTR_ACP);
+    link_font(unitab_scoacs, unitab_font, ATTR_ACP);
     link_font(unitab_xterm, unitab_font, ATTR_ACP);
 
     if (cfg.vtmode == VT_OEMANSI || cfg.vtmode == VT_XWINDOWS) {
@@ -153,6 +163,8 @@ void init_ucs_tables(void)
 
     /* Last chance, if !unicode then try poorman links. */
     if (cfg.vtmode != VT_UNICODE) {
+       static char poorman_scoacs[] = 
+           "CueaaaaceeeiiiAAE**ooouuyOUc$YPsaiounNao?++**!<>###||||++||++++++--|-+||++--|-+----++++++++##||#aBTPEsyt******EN=+><++-=... n2* ";
        static char poorman_latin1[] =
            " !cL.Y|S\"Ca<--R~o+23'u|.,1o>///?AAAAAAACEEEEIIIIDNOOOOOxOUUUUYPBaaaaaaaceeeeiiiionooooo/ouuuuypy";
        static char poorman_vt100[] = "*#****o~**+++++-----++++|****L.";
@@ -167,6 +179,10 @@ void init_ucs_tables(void)
            if (!DIRECT_FONT(unitab_xterm[i]))
                unitab_xterm[i] =
                    (WCHAR) (ATTR_ACP + poorman_vt100[i - 96]);
+       for(i=128;i<256;i++) 
+           if (!DIRECT_FONT(unitab_scoacs[i]))
+               unitab_scoacs[i] = 
+                   (WCHAR) (ATTR_ACP + poorman_scoacs[i - 128]);
     }
 }