bug from last time
[unix-history] / usr / src / usr.bin / window / ttgeneric.c
index 189748c..c3063d3 100644 (file)
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)ttgeneric.c 3.1 83/08/09";
+static char *sccsid = "@(#)ttgeneric.c 3.22 84/03/03";
 #endif
 
 #include "ww.h"
 #endif
 
 #include "ww.h"
+#include "tt.h"
 
 
-/*
-kb|h19|heath|h19-b|h19b|heathkit|heath-19|z19|zenith:
-       cr=^M:nl=^J:bl=^G:al=1*\EL:am:le=^H:bs:cd=\EJ:ce=\EK:
-       cl=\EE:cm=\EY%+ %+ :co#80:dc=\EN:dl=1*\EM:do=\EB:
-       ei=\EO:ho=\EH:im=\E@:li#24:mi:nd=\EC:as=\EF:ae=\EG:ms:
-       ta=^I:pt:sr=\EI:se=\Eq:so=\Ep:up=\EA:vs=\Ex4:ve=\Ey4:
-       kb=^h:ku=\EA:kd=\EB:kl=\ED:kr=\EC:kh=\EH:
-       kn#8:k1=\ES:k2=\ET:k3=\EU:k4=\EV:k5=\EW:
-       l6=blue:l7=red:l8=white:k6=\EP:k7=\EQ:k8=\ER:
-       es:hs:ts=\Ej\Ex5\Ex1\EY8%+ \Eo:fs=\Ek\Ey5:ds=\Ey1:
-*/
+char PC, *BC, *UP;
+short ospeed;
+char *tgoto();
 
 
-char gen_frame[16] = {
+short gen_frame[16] = {
        ' ', '|', '-', '+',
        '|', '|', '+', '+',
        ' ', '|', '-', '+',
        '|', '|', '+', '+',
-       '-', '|', '-', '+',
+       '-', '+', '-', '+',
        '+', '+', '+', '+'
 };
 
        '+', '+', '+', '+'
 };
 
-char gen_row, gen_col;
-char gen_modes, gen_nmodes;
-char gen_insert, gen_ninsert;
-char gen_graphics;
-short gen_msp10c;
+char *gen_CM;
+char *gen_IM;
+char *gen_IC;
+char *gen_IP;
+char *gen_EI;
+char *gen_DC;
+char *gen_AL;
+char *gen_DL;
+char *gen_CE;
+char *gen_CD;
+char *gen_CL;
+char *gen_VS;
+char *gen_VE;
+char *gen_TI;
+char *gen_TE;
+char *gen_SO;
+char *gen_SE;
+char *gen_US;
+char *gen_UE;
+char *gen_UP;
+char *gen_PC;
+char *gen_BC;
+char *gen_ND;
+char *gen_HO;
+char *gen_NL;
+char *gen_AS;
+char *gen_AE;
+char gen_MI;
+char gen_MS;
+char gen_AM;
+char gen_OS;
+char gen_BS;
+char gen_DB;
+int gen_CO;
+int gen_LI;
+int gen_UG;
+int gen_SG;
 
 
-#define pc(c)  putchar('c')
-#define esc()  pc(\033)
-#define PAD(ms10) { \
-       register i; \
-       for (i = ((ms10) + 5) / gen_msp10c; --i >= 0;) \
-               pc(\0); \
-}
-#define ICPAD() PAD((80 - gen_col) * 1)                /* 0.1 ms per char */
-#define ILPAD() PAD((24 - gen_row) * 10);      /* 1 ms per char */
-
-#define SETINSERT(m) \
-       ((m) != gen_insert \
-               ? (esc(), (gen_insert = (m)) ? pc(@) : pc(O)) : 0)
-#define SETMODES(m) \
-       ((m) != gen_modes \
-               ? (esc(), (gen_modes = (m)) ? pc(p) : pc(q)) : 0)
-#define SETGRAPHICS(m) \
-       ((m) != gen_graphics \
-               ? (esc(), (gen_graphics = (m)) ? pc(F) : pc(G)) : 0)
+#define ps(s) ttputs(s)
 
 gen_setinsert(new)
 char new;
 {
 
 gen_setinsert(new)
 char new;
 {
-       gen_ninsert = new;
+       if (new) {
+               if (gen_IM)
+                       ps(gen_IM);
+       } else
+               if (gen_EI)
+                       ps(gen_EI);
+       tt.tt_insert = new;
 }
 
 gen_setmodes(new)
 }
 
 gen_setmodes(new)
+register new;
 {
 {
-       gen_nmodes = new & WWM_REV;
+       register diff;
+
+       diff = new ^ tt.tt_modes;
+       if (diff & WWM_REV) {
+               if (new & WWM_REV) {
+                       if (gen_SO)
+                               ps(gen_SO);
+               } else
+                       if (gen_SE)
+                               ps(gen_SE);
+       }
+       if (diff & WWM_UL) {
+               if (new & WWM_UL) {
+                       if (gen_US)
+                               ps(gen_US);
+               } else
+                       if (gen_UE)
+                               ps(gen_UE);
+       }
+       if (diff & WWM_GRP) {
+               if (new & WWM_GRP) {
+                       if (gen_AS)
+                               ps(gen_AS);
+               } else
+                       if (gen_AE)
+                               ps(gen_AE);
+       }
+       tt.tt_modes = new;
 }
 
 gen_insline()
 {
 }
 
 gen_insline()
 {
-       esc();
-       pc(L);
-       ILPAD();
+       if (tt.tt_modes)                        /* for concept 100 */
+               gen_setmodes(0);
+       if (gen_AL)
+               tttputs(gen_AL, gen_LI - tt.tt_row);
 }
 
 gen_delline()
 {
 }
 
 gen_delline()
 {
-       esc();
-       pc(M);
-       ILPAD();
+       if (tt.tt_modes)                        /* for concept 100 */
+               gen_setmodes(0);
+       if (gen_DL)
+               tttputs(gen_DL, gen_LI - tt.tt_row);
 }
 
 gen_putc(c)
 register char c;
 {
 }
 
 gen_putc(c)
 register char c;
 {
-       SETMODES(gen_nmodes);
-       SETINSERT(gen_ninsert);
-       if (c & 0x80) {
-               SETGRAPHICS(1);
-               putchar(c & 0x7f);
-       } else {
-               SETGRAPHICS(0);
-               putchar(c);
-       }
-       if (gen_insert)
-               ICPAD();
-       gen_col++;
-}
-
-gen_write(start, end)
-register char *start, *end;
-{
-       register char c;
-
-       SETMODES(gen_nmodes);
-       SETINSERT(gen_ninsert);
-       if (gen_insert) {
-               while (start <= end) {
-                       if ((c = *start++) & 0x80) {
-                               SETGRAPHICS(1);
-                               putchar(c & 0x7f);
-                       } else {
-                               SETGRAPHICS(0);
-                               putchar(c);
-                       }
-                       ICPAD();
-                       gen_col++;
-               }
-       } else {
-               gen_col += end - start + 1;
-               while (start <= end)
-                       if ((c = *start++) & 0x80) {
-                               SETGRAPHICS(1);
-                               putchar(c & 0x7f);
-                       } else {
-                               SETGRAPHICS(0);
-                               putchar(c);
-                       }
-       }
+       if (tt.tt_ninsert != tt.tt_insert)
+               gen_setinsert(tt.tt_ninsert);
+       if (tt.tt_nmodes != tt.tt_modes)
+               gen_setmodes(tt.tt_nmodes);
+       if (tt.tt_insert) {
+               if (gen_IC)
+                       tttputs(gen_IC, gen_CO - tt.tt_col);
+               ttputc(c);
+               if (gen_IP)
+                       tttputs(gen_IP, gen_CO - tt.tt_col);
+       } else
+               ttputc(c);
+       if (++tt.tt_col == gen_CO)
+               if (gen_AM)
+                       tt.tt_col = 0, tt.tt_row++;
+               else
+                       tt.tt_col--;
 }
 
 }
 
-gen_blank(n)
+gen_write(p, n)
+register char *p;
 register n;
 {
 register n;
 {
-       if (n <= 0)
-               return;
-       SETMODES(gen_nmodes);
-       SETINSERT(gen_ninsert);
-       if (gen_insert) {
+       if (tt.tt_ninsert != tt.tt_insert)
+               gen_setinsert(tt.tt_ninsert);
+       if (tt.tt_nmodes != tt.tt_modes)
+               gen_setmodes(tt.tt_nmodes);
+       if (tt.tt_insert) {
                while (--n >= 0) {
                while (--n >= 0) {
-                       putchar(' ');
-                       ICPAD();
-                       gen_col++;
+                       if (gen_IC)
+                               tttputs(gen_IC, gen_CO - tt.tt_col);
+                       ttputc(*p++);
+                       if (gen_IP)
+                               tttputs(gen_IP, gen_CO - tt.tt_col);
+                       tt.tt_col++;
                }
        } else {
                }
        } else {
-               gen_col += n;
+               tt.tt_col += n;
                while (--n >= 0)
                while (--n >= 0)
-                       putchar(' ');
+                       ttputc(*p++);
        }
        }
+       if (tt.tt_col == gen_CO)
+               if (gen_AM)
+                       tt.tt_col = 0, tt.tt_row++;
+               else
+                       tt.tt_col--;
 }
 
 gen_move(row, col)
 register char row, col;
 {
 }
 
 gen_move(row, col)
 register char row, col;
 {
-       if (gen_row == row) {
-               if (gen_col == col)
+       if (tt.tt_row == row && tt.tt_col == col)
+               return;
+       if (!gen_MI && tt.tt_insert)
+               gen_setinsert(0);
+       if (!gen_MS && tt.tt_modes)
+               gen_setmodes(0);
+       if (tt.tt_row == row) {
+               if (tt.tt_col == col)
                        return;
                        return;
-               if (gen_col == col - 1) {
-                       esc();
-                       pc(C);
-                       goto out;
-               } else if (gen_col == col + 1) {
-                       pc(\b);
-                       goto out;
+               if (tt.tt_col == col - 1) {
+                       if (gen_ND) {
+                               ps(gen_ND);
+                               goto out;
+                       }
+               } else if (tt.tt_col == col + 1) {
+                       if (gen_BC) {
+                               ps(gen_BC);
+                               goto out;
+                       }
                }
        }
                }
        }
-       if (gen_col == col) {
-               if (gen_row == row + 1) {
-                       esc();
-                       pc(A);
-                       goto out;
-               } else if (gen_row == row + 1) {
-                       pc(\n);
-                       goto out;
+       if (tt.tt_col == col) {
+               if (tt.tt_row == row + 1) {
+                       if (gen_UP) {
+                               ps(gen_UP);
+                               goto out;
+                       }
+               } else if (tt.tt_row == row + 1) {
+                       if (gen_NL) {
+                               ps(gen_NL);
+                               goto out;
+                       }
                }
        }
                }
        }
-       if (col == 1 && row == 1) {
-               esc();
-               pc(H);
+       if (gen_HO && col == 0 && row == 0) {
+               ps(gen_HO);
                goto out;
        }
                goto out;
        }
-       esc();
-       pc(Y);
-       putchar(' ' + row);
-       putchar(' ' + col);
+       ps(tgoto(gen_CM, col, row));
 out:
 out:
-       gen_col = col;
-       gen_row = row;
+       tt.tt_col = col;
+       tt.tt_row = row;
 }
 
 gen_init()
 {
 }
 
 gen_init()
 {
-       float cpms = (float) wwbaud / 10000;    /* char per ms */
-
-       gen_msp10c = 10 / cpms;                 /* ms per 10 char */
-#ifdef notdef
-       tt.tt_ILmf = cpms;                      /* 1 ms */
-       tt.tt_ILov = 2;
-       tt.tt_ICmf = cpms * 1.5 ;               /* 1.5 ms */
-       tt.tt_ICov = 2;
-       tt.tt_DCmf = 0;
-       tt.tt_DCov = 2;
-#endif
-       return 0;
+       if (gen_VS)
+               ps(gen_VS);
+       if (gen_TI)
+               ps(gen_TI);
+       if (gen_CL)
+               ps(gen_CL);
+       tt.tt_col = tt.tt_row = 0;
+       tt.tt_ninsert = tt.tt_insert = 0;
+       tt.tt_nmodes = tt.tt_modes = 0;
 }
 
 }
 
-gen_reset()
+gen_end()
 {
 {
-       esc();
-       pc(x);
-       pc(4);
-       esc();
-       pc(E);
-       esc();
-       pc(w);
-       gen_col = gen_row = 0;
-       gen_insert = 0;
-       gen_graphics = 0;
-       gen_modes = 0;
-}
-
-gen_cleanup()
-{
-       SETMODES(0);
-       SETINSERT(0);
-       SETGRAPHICS(0);
-       esc();
-       pc(y);
-       pc(4);
-       esc();
-       pc(v);
+       gen_setmodes(0);
+       gen_setinsert(0);
+       if (gen_TE)
+               ps(gen_TE);
+       if (gen_VE)
+               ps(gen_VE);
 }
 
 gen_clreol()
 {
 }
 
 gen_clreol()
 {
-       esc();
-       pc(K);
+       if (tt.tt_modes)                        /* for concept 100 */
+               gen_setmodes(0);
+       if (gen_CE)
+               tttputs(gen_CE, gen_CO - tt.tt_col);
 }
 
 gen_clreos()
 {
 }
 
 gen_clreos()
 {
-       esc();
-       pc(J);
+       if (tt.tt_modes)                        /* for concept 100 */
+               gen_setmodes(0);
+       if (gen_CD)
+               tttputs(gen_CD, gen_LI - tt.tt_row);
 }
 
 gen_clear()
 {
 }
 
 gen_clear()
 {
-       esc();
-       pc(E);
+       if (tt.tt_modes)                        /* for concept 100 */
+               gen_setmodes(0);
+       if (gen_CL)
+               ps(gen_CL);
 }
 
 gen_delchar()
 {
 }
 
 gen_delchar()
 {
-       esc();
-       pc(N);
+       if (gen_DC)
+               tttputs(gen_DC, gen_CO - tt.tt_col);
 }
 
 tt_generic()
 {
 }
 
 tt_generic()
 {
-       tt.tt_setinsert = gen_setinsert;
-       tt.tt_setmodes = gen_setmodes;
-       tt.tt_insline = gen_insline;
-       tt.tt_delline = gen_delline;
-       tt.tt_delchar = gen_delchar;
-       tt.tt_blank = gen_blank;
+       gen_CM = ttxgetstr("cm");               /* may not work */
+       gen_IM = ttxgetstr("im");
+       gen_IC = tttgetstr("ic");
+       gen_IP = tttgetstr("ip");
+       gen_EI = ttxgetstr("ei");
+       gen_DC = tttgetstr("dc");
+       gen_AL = tttgetstr("al");
+       gen_DL = tttgetstr("dl");
+       gen_CE = tttgetstr("ce");
+       gen_CD = tttgetstr("cd");
+       gen_CL = ttxgetstr("cl");
+       gen_VS = ttxgetstr("vs");
+       gen_VE = ttxgetstr("ve");
+       gen_TI = ttxgetstr("ti");
+       gen_TE = ttxgetstr("te");
+       gen_SO = ttxgetstr("so");
+       gen_SE = ttxgetstr("se");
+       gen_US = ttxgetstr("us");
+       gen_UE = ttxgetstr("ue");
+       gen_UP = ttxgetstr("up");
+       gen_PC = tttgetstr("pc");
+       gen_BC = ttxgetstr("bc");
+       gen_ND = ttxgetstr("nd");
+       gen_HO = ttxgetstr("ho");
+       gen_NL = ttxgetstr("nl");
+       gen_AS = ttxgetstr("as");
+       gen_AE = ttxgetstr("ae");
+       gen_MI = tgetflag("mi");
+       gen_MS = tgetflag("ms");
+       gen_AM = tgetflag("am");
+       gen_OS = tgetflag("os");
+       gen_BS = tgetflag("bs");
+       gen_DB = tgetflag("db");
+       gen_CO = tgetnum("co");
+       gen_LI = tgetnum("li");
+       gen_UG = tgetnum("ug");
+       gen_SG = tgetnum("sg");
+
+       if (gen_CL == 0 || gen_CM == 0 || gen_OS)
+               return -1;
+
+       if (gen_NL == 0)
+               gen_NL = "\n";
+       if (gen_BC == 0 && gen_BS)
+               gen_BC = "\b";
+
+       PC = gen_PC ? *gen_PC : 0;
+       BC = gen_BC;
+       UP = gen_UP;
+       ospeed = wwoldtty.ww_sgttyb.sg_ospeed;
+
+       if (gen_DC)
+               tt.tt_delchar = gen_delchar;
+       if (gen_AL)
+               tt.tt_insline = gen_insline;
+       if (gen_DL)
+               tt.tt_delline = gen_delline;
+       if (gen_CE)
+               tt.tt_clreol = gen_clreol;
+       if (gen_CD)
+               tt.tt_clreos = gen_clreos;
+       if (gen_CL)
+               tt.tt_clear = gen_clear;
+       if (gen_SG > 0)
+               gen_SO = 0;
+       if (gen_UG > 0)
+               gen_US = 0;
+       if (gen_SO)
+               tt.tt_availmodes |= WWM_REV;
+       if (gen_US)
+               tt.tt_availmodes |= WWM_UL;
+       if (gen_AS)
+               tt.tt_availmodes |= WWM_GRP;
+       tt.tt_hasinsert = gen_IM != 0;
+       tt.tt_wrap = gen_AM;
+       tt.tt_retain = gen_DB;
+       tt.tt_ncol = gen_CO;
+       tt.tt_nrow = gen_LI;
        tt.tt_init = gen_init;
        tt.tt_init = gen_init;
-       tt.tt_cleanup = gen_cleanup;
-       tt.tt_clreol = gen_clreol;
-       tt.tt_clreos = gen_clreos;
-       tt.tt_clear = gen_clear;
-       tt.tt_move = gen_move;
-       tt.tt_reset = gen_reset;
+       tt.tt_end = gen_end;
        tt.tt_write = gen_write;
        tt.tt_putc = gen_putc;
        tt.tt_write = gen_write;
        tt.tt_putc = gen_putc;
-       tt.tt_ncol = 80;
-       tt.tt_nrow = 24;
+       tt.tt_move = gen_move;
        tt.tt_frame = gen_frame;
        return 0;
 }
        tt.tt_frame = gen_frame;
        return 0;
 }