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