12243Sarnold /* 22243Sarnold * Terminal initialization routines. 32243Sarnold * 4*12570Sarnold * 05/19/83 (Berkeley) @(#)setterm.c 1.13 52243Sarnold */ 62243Sarnold 72243Sarnold # include "curses.ext" 82243Sarnold 92243Sarnold static bool *sflags[] = { 102243Sarnold &AM, &BS, &EO, &HZ, &IN, &MI, &MS, &NC, &OS, &UL, &XN 112243Sarnold }; 122243Sarnold 132243Sarnold static char *xPC, 142243Sarnold **sstrs[] = { 155881Sarnold &AL, &BC, &BT, &CD, &CE, &CL, &CM, &CR, &DC, 165881Sarnold &DL, &DM, &DO, &ED, &EI, &HO, &IC, &IM, &IP, 175881Sarnold &LL, &MA, &ND, &NL, &xPC, &SE, &SF, &SO, &SR, 185881Sarnold &TA, &TE, &TI, &UC, &UE, &UP, &US, &VB, &VS, 195881Sarnold &VE 202243Sarnold }, 212465Sarnold *tgoto(); 222243Sarnold 234699Sarnold static char tspace[256], /* Space for capability strings */ 242243Sarnold *aoftspace; /* Address of tspace for relocation */ 252243Sarnold 262243Sarnold static int destcol, destline; 272243Sarnold 282243Sarnold /* 292243Sarnold * This routine does terminal type initialization routines, and 302243Sarnold * calculation of flags at entry. It is almost entirely stolen from 312243Sarnold * Bill Joy's ex version 2.6. 322243Sarnold */ 332243Sarnold short ospeed = -1; 342243Sarnold 352243Sarnold gettmode() { 362243Sarnold 372243Sarnold if (gtty(_tty_ch, &_tty) < 0) 382243Sarnold return; 392243Sarnold savetty(); 402243Sarnold if (stty(_tty_ch, &_tty) < 0) 412243Sarnold _tty.sg_flags = _res_flg; 422243Sarnold ospeed = _tty.sg_ospeed; 432243Sarnold _res_flg = _tty.sg_flags; 442243Sarnold UPPERCASE = (_tty.sg_flags & LCASE) != 0; 452243Sarnold GT = ((_tty.sg_flags & XTABS) == 0); 462243Sarnold NONL = ((_tty.sg_flags & CRMOD) == 0); 473631Sarnold _tty.sg_flags &= ~XTABS; 484612Sarnold stty(_tty_ch, &_tty); 492243Sarnold # ifdef DEBUG 502243Sarnold fprintf(outf, "GETTMODE: UPPERCASE = %s\n", UPPERCASE ? "TRUE":"FALSE"); 512243Sarnold fprintf(outf, "GETTMODE: GT = %s\n", GT ? "TRUE" : "FALSE"); 522243Sarnold fprintf(outf, "GETTMODE: NONL = %s\n", NONL ? "TRUE" : "FALSE"); 532243Sarnold fprintf(outf, "GETTMODE: ospeed = %d\n", ospeed); 542243Sarnold # endif 552243Sarnold } 562243Sarnold 572243Sarnold setterm(type) 582243Sarnold reg char *type; { 592243Sarnold 6011736Sarnold reg int unknown; 6111736Sarnold static char genbuf[1024]; 622243Sarnold 632243Sarnold # ifdef DEBUG 642243Sarnold fprintf(outf, "SETTERM(\"%s\")\n", type); 652243Sarnold fprintf(outf, "SETTERM: LINES = %d, COLS = %d\n", LINES, COLS); 662243Sarnold # endif 672243Sarnold if (type[0] == '\0') 682243Sarnold type = "xx"; 692243Sarnold unknown = FALSE; 702243Sarnold if (tgetent(genbuf, type) != 1) { 712243Sarnold unknown++; 722243Sarnold strcpy(genbuf, "xx|dumb:"); 732243Sarnold } 742243Sarnold # ifdef DEBUG 752243Sarnold fprintf(outf, "SETTERM: tty = %s\n", type); 762243Sarnold # endif 772243Sarnold if (LINES == 0) 782243Sarnold LINES = tgetnum("li"); 792243Sarnold if (LINES <= 5) 802243Sarnold LINES = 24; 812243Sarnold 822243Sarnold if (COLS == 0) 832243Sarnold COLS = tgetnum("co"); 842243Sarnold if (COLS <= 4) 852243Sarnold COLS = 80; 86*12570Sarnold 872243Sarnold # ifdef DEBUG 882243Sarnold fprintf(outf, "SETTERM: LINES = %d, COLS = %d\n", LINES, COLS); 892243Sarnold # endif 902243Sarnold aoftspace = tspace; 912243Sarnold zap(); /* get terminal description */ 922243Sarnold if (tgoto(CM, destcol, destline)[0] == 'O') 932243Sarnold CA = FALSE, CM = 0; 942243Sarnold else 952243Sarnold CA = TRUE; 962243Sarnold PC = xPC ? xPC[0] : FALSE; 972243Sarnold aoftspace = tspace; 982243Sarnold strcpy(ttytype, longname(genbuf, type)); 992243Sarnold if (unknown) 1002243Sarnold return ERR; 1012243Sarnold return OK; 1022243Sarnold } 1032243Sarnold /* 1044616Sarnold * This routine gets all the terminal flags from the termcap database 1052243Sarnold */ 1062243Sarnold zap() { 1072243Sarnold 1082243Sarnold reg bool **fp; 1092243Sarnold reg char *namp, ***sp; 1104616Sarnold reg int SG, UG; 1112243Sarnold extern char *tgetstr(); 1122243Sarnold 1132243Sarnold /* 1142243Sarnold * get boolean flags 1152243Sarnold */ 1162243Sarnold namp = "ambseohzinmimsncosulxn\0\0"; 1172243Sarnold # ifdef FULLDEBUG 1182243Sarnold fprintf(outf, "ZAP: namp = \"%s\"\n", namp); 1192243Sarnold # endif 1202243Sarnold fp = sflags; 1212243Sarnold do { 1222243Sarnold *(*fp++) = tgetflag(namp); 1232243Sarnold # ifdef FULLDEBUG 1242243Sarnold fprintf(outf, "ZAP: %.2s = %d", namp, *(*(fp - 1))); 1252243Sarnold # endif 1262243Sarnold namp += 2; 1272243Sarnold } while (*namp); 1282243Sarnold 1292243Sarnold /* 1302243Sarnold * get string values 1312243Sarnold */ 1325881Sarnold namp = "albcbtcdceclcmcrdcdldmdoedeihoicimipllmandnlpcsesfsosrtatetiucueupusvbvsve"; 1332243Sarnold # ifdef FULLDEBUG 1342243Sarnold fprintf(outf, "ZAP: namp = \"%s\"\n", namp); 1352243Sarnold # endif 1362243Sarnold sp = sstrs; 1372243Sarnold do { 1382243Sarnold *(*sp++) = tgetstr(namp, &aoftspace); 1392243Sarnold # ifdef FULLDEBUG 1402243Sarnold fprintf(outf, "ZAP: %.2s = \"%s\"\n", namp, *(*(sp-1))); 1412243Sarnold # endif 1422243Sarnold namp += 2; 1432243Sarnold } while (*namp); 1444616Sarnold SG = tgetnum("sg"); 1454616Sarnold UG = tgetnum("ug"); 1466424Sarnold if ((SG > 0 || !SO) && (UG <= 0 && US)) { 1472243Sarnold SO = US; 1482243Sarnold SE = UE; 1492243Sarnold } 1502243Sarnold } 1513786Sarnold 1523786Sarnold /* 1533786Sarnold * return a capability from termcap 1543786Sarnold */ 1553786Sarnold char * 1563786Sarnold getcap(name) 1573786Sarnold char *name; 1583786Sarnold { 1594616Sarnold char *tgetstr(); 1604615Sarnold 1614616Sarnold return tgetstr(name, &aoftspace); 1623786Sarnold } 163