handle multiple uba's
[unix-history] / usr / src / usr.bin / ex / ex_tty.c
index d84bbc0..ca96700 100644 (file)
@@ -1,5 +1,5 @@
-/* Copyright (c) 1980 Regents of the University of California */
-static char *sccsid = "@(#)ex_tty.c    6.2 %G%";
+/* Copyright (c) 1981 Regents of the University of California */
+static char *sccsid = "@(#)ex_tty.c    7.5     %G%";
 #include "ex.h"
 #include "ex_tty.h"
 
 #include "ex.h"
 #include "ex_tty.h"
 
@@ -8,7 +8,7 @@ static char *sccsid = "@(#)ex_tty.c     6.2 %G%";
  * and calculation of flags at entry or after
  * a shell escape which may change them.
  */
  * and calculation of flags at entry or after
  * a shell escape which may change them.
  */
-short  ospeed = -1;
+/* short       ospeed = -1;    mjm: def also in tputs.c of termcap.a  */
 
 gettmode()
 {
 
 gettmode()
 {
@@ -26,22 +26,23 @@ gettmode()
 #else
        if (ioctl(1, TCGETA, &tty) < 0)
                return;
 #else
        if (ioctl(1, TCGETA, &tty) < 0)
                return;
-       if (ospeed != tty.c_cflag & CBAUD)
+       if (ospeed != (tty.c_cflag & CBAUD))    /* mjm */
                value(SLOWOPEN) = (tty.c_cflag & CBAUD) < B1200;
        ospeed = tty.c_cflag & CBAUD;
        normf = tty;
        UPPERCASE = (tty.c_iflag & IUCLC) != 0;
        GT = (tty.c_oflag & TABDLY) != TAB3 && !XT;
                value(SLOWOPEN) = (tty.c_cflag & CBAUD) < B1200;
        ospeed = tty.c_cflag & CBAUD;
        normf = tty;
        UPPERCASE = (tty.c_iflag & IUCLC) != 0;
        GT = (tty.c_oflag & TABDLY) != TAB3 && !XT;
-       NONL = (tty.c_oflag & OCRNL) == 0;
+       NONL = (tty.c_oflag & ONLCR) == 0;
 #endif
 }
 
 char *xPC;
 char **sstrs[] = {
 #endif
 }
 
 char *xPC;
 char **sstrs[] = {
-       &AL, &BC, &BT, &CD, &CE, &CL, &CM, &xCR, &DC, &DL, &DM, &DO, &ED, &EI,
-       &F0, &F1, &F2, &F3, &F4, &F5, &F6, &F7, &F8, &F9,
-       &HO, &IC, &IM, &IP, &KD, &KE, &KH, &KL, &KR, &KS, &KU, &LL,
-       &ND, &xNL, &xPC, &SE, &SF, &SO, &SR, &TA, &TE, &TI, &UP, &VB, &VS, &VE
+       &AL, &BC, &BT, &CD, &CE, &CL, &CM, &xCR, &CS, &DC, &DL, &DM, &DO,
+       &ED, &EI, &F0, &F1, &F2, &F3, &F4, &F5, &F6, &F7, &F8, &F9,
+       &HO, &IC, &IM, &IP, &KD, &KE, &KH, &KL, &KR, &KS, &KU, &LL, &ND, &xNL,
+       &xPC, &RC, &SC, &SE, &SF, &SO, &SR, &TA, &TE, &TI, &UP, &VB, &VS, &VE,
+       &AL_PARM, &DL_PARM, &UP_PARM, &DOWN_PARM, &LEFT_PARM, &RIGHT_PARM
 };
 bool *sflags[] = {
        &AM, &BS, &DA, &DB, &EO, &HC, &HZ, &IN, &MI, &NC, &NS, &OS, &UL,
 };
 bool *sflags[] = {
        &AM, &BS, &DA, &DB, &EO, &HC, &HZ, &IN, &MI, &NC, &NS, &OS, &UL,
@@ -89,6 +90,16 @@ setterm(type)
        arrows[3].cap = KR; arrows[3].mapto = "l"; arrows[3].descr = "right";
        arrows[4].cap = KH; arrows[4].mapto = "H"; arrows[4].descr = "home";
 
        arrows[3].cap = KR; arrows[3].mapto = "l"; arrows[3].descr = "right";
        arrows[4].cap = KH; arrows[4].mapto = "H"; arrows[4].descr = "home";
 
+       /*
+        * Handle funny termcap capabilities
+        */
+       if (CS && SC && RC) AL=DL="";
+       if (AL_PARM && AL==NULL) AL="";
+       if (DL_PARM && DL==NULL) DL="";
+       if (IC && IM==NULL) IM="";
+       if (IC && EI==NULL) EI="";
+       if (!GT) BT=NULL;       /* If we can't tab, we can't backtab either */
+
 #ifdef TIOCLGET
        /*
         * Now map users susp char to ^Z, being careful that the susp
 #ifdef TIOCLGET
        /*
         * Now map users susp char to ^Z, being careful that the susp
@@ -124,6 +135,9 @@ setterm(type)
                CA = 1, costCM = cost(tgoto(CM, 8, 10));
        costSR = cost(SR);
        costAL = cost(AL);
                CA = 1, costCM = cost(tgoto(CM, 8, 10));
        costSR = cost(SR);
        costAL = cost(AL);
+       costDP = cost(tgoto(DOWN_PARM, 10, 10));
+       costLP = cost(tgoto(LEFT_PARM, 10, 10));
+       costRP = cost(tgoto(RIGHT_PARM, 10, 10));
        PC = xPC ? xPC[0] : 0;
        aoftspace = tspace;
        CP(ttytype, longname(ltcbuf, type));
        PC = xPC ? xPC[0] : 0;
        aoftspace = tspace;
        CP(ttytype, longname(ltcbuf, type));
@@ -146,13 +160,13 @@ zap()
        register bool **fp;
        register char ***sp;
 
        register bool **fp;
        register char ***sp;
 
-       namp = "ambsdadbeohchzinmincnsosulxbxnxtxx";
+       namp = "ambsdadbeohchzinmincnsosulxbxnxtxx";
        fp = sflags;
        do {
                *(*fp++) = tgetflag(namp);
                namp += 2;
        } while (*namp);
        fp = sflags;
        do {
                *(*fp++) = tgetflag(namp);
                namp += 2;
        } while (*namp);
-       namp = "albcbtcdceclcmcrdcdldmdoedeik0k1k2k3k4k5k6k7k8k9hoicimipkdkekhklkrkskullndnlpcsesfsosrtatetiupvbvsve";
+       namp = "albcbtcdceclcmcrcsdcdldmdoedeik0k1k2k3k4k5k6k7k8k9hoicimipkdkekhklkrkskullndnlpcrcscsesfsosrtatetiupvbvsveALDLUPDOLERI";
        sp = sstrs;
        do {
                *(*sp++) = tgetstr(namp, &aoftspace);
        sp = sstrs;
        do {
                *(*sp++) = tgetstr(namp, &aoftspace);
@@ -206,7 +220,7 @@ char *str;
 {
        int countnum();
 
 {
        int countnum();
 
-       if (str == NULL)
+       if (str == NULL || *str=='O')   /* OOPS */
                return 10000;   /* infinity */
        costnum = 0;
        tputs(str, LINES, countnum);
                return 10000;   /* infinity */
        costnum = 0;
        tputs(str, LINES, countnum);