1: /* 2: * Copyright (c) 1980 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: */ 6: 7: #ifndef lint 8: static char sccsid[] = "@(#)cr_tty.c 5.2 (Berkeley) 11/8/85"; 9: #endif not lint 10: 11: /* 12: * Terminal initialization routines. 13: * 14: */ 15: 16: # include "curses.ext" 17: 18: static bool *sflags[] = { 19: &AM, &BS, &DA, &DB, &EO, &HC, &HZ, &IN, &MI, 20: &MS, &NC, &NS, &OS, &UL, &XB, &XN, &XT, &XS, 21: &XX 22: }; 23: 24: static char *_PC, 25: **sstrs[] = { 26: &AL, &BC, &BT, &CD, &CE, &CL, &CM, &CR, &CS, 27: &DC, &DL, &DM, &DO, &ED, &EI, &K0, &K1, &K2, 28: &K3, &K4, &K5, &K6, &K7, &K8, &K9, &HO, &IC, 29: &IM, &IP, &KD, &KE, &KH, &KL, &KR, &KS, &KU, 30: &LL, &MA, &ND, &NL, &_PC, &RC, &SC, &SE, &SF, 31: &SO, &SR, &TA, &TE, &TI, &UC, &UE, &UP, &US, 32: &VB, &VS, &VE, &AL_PARM, &DL_PARM, &UP_PARM, 33: &DOWN_PARM, &LEFT_PARM, &RIGHT_PARM, 34: }, 35: *tgoto(); 36: 37: char _tspace[2048]; /* Space for capability strings */ 38: 39: static char *aoftspace; /* Address of _tspace for relocation */ 40: 41: static int destcol, destline; 42: 43: /* 44: * This routine does terminal type initialization routines, and 45: * calculation of flags at entry. It is almost entirely stolen from 46: * Bill Joy's ex version 2.6. 47: */ 48: short ospeed = -1; 49: 50: gettmode() { 51: 52: if (gtty(_tty_ch, &_tty) < 0) 53: return; 54: savetty(); 55: if (stty(_tty_ch, &_tty) < 0) 56: _tty.sg_flags = _res_flg; 57: ospeed = _tty.sg_ospeed; 58: _res_flg = _tty.sg_flags; 59: UPPERCASE = (_tty.sg_flags & LCASE) != 0; 60: GT = ((_tty.sg_flags & XTABS) == 0); 61: NONL = ((_tty.sg_flags & CRMOD) == 0); 62: _tty.sg_flags &= ~XTABS; 63: stty(_tty_ch, &_tty); 64: # ifdef DEBUG 65: fprintf(outf, "GETTMODE: UPPERCASE = %s\n", UPPERCASE ? "TRUE":"FALSE"); 66: fprintf(outf, "GETTMODE: GT = %s\n", GT ? "TRUE" : "FALSE"); 67: fprintf(outf, "GETTMODE: NONL = %s\n", NONL ? "TRUE" : "FALSE"); 68: fprintf(outf, "GETTMODE: ospeed = %d\n", ospeed); 69: # endif 70: } 71: 72: setterm(type) 73: reg char *type; { 74: 75: reg int unknown; 76: static char genbuf[1024]; 77: # ifdef TIOCGWINSZ 78: struct winsize win; 79: # endif 80: 81: # ifdef DEBUG 82: fprintf(outf, "SETTERM(\"%s\")\n", type); 83: fprintf(outf, "SETTERM: LINES = %d, COLS = %d\n", LINES, COLS); 84: # endif 85: if (type[0] == '\0') 86: type = "xx"; 87: unknown = FALSE; 88: if (tgetent(genbuf, type) != 1) { 89: unknown++; 90: strcpy(genbuf, "xx|dumb:"); 91: } 92: # ifdef DEBUG 93: fprintf(outf, "SETTERM: tty = %s\n", type); 94: # endif 95: # ifdef TIOCGWINSZ 96: if (ioctl(_tty_ch, TIOCGWINSZ, &win) >= 0) { 97: if (LINES == 0) 98: LINES = win.ws_row; 99: if (COLS == 0) 100: COLS = win.ws_col; 101: } 102: # endif 103: 104: if (LINES == 0) 105: LINES = tgetnum("li"); 106: if (LINES <= 5) 107: LINES = 24; 108: 109: if (COLS == 0) 110: COLS = tgetnum("co"); 111: if (COLS <= 4) 112: COLS = 80; 113: 114: # ifdef DEBUG 115: fprintf(outf, "SETTERM: LINES = %d, COLS = %d\n", LINES, COLS); 116: # endif 117: aoftspace = _tspace; 118: zap(); /* get terminal description */ 119: 120: /* 121: * Handle funny termcap capabilities 122: */ 123: if (CS && SC && RC) AL=DL=""; 124: if (AL_PARM && AL==NULL) AL=""; 125: if (DL_PARM && DL==NULL) DL=""; 126: if (IC && IM==NULL) IM=""; 127: if (IC && EI==NULL) EI=""; 128: if (!GT) BT=NULL; /* If we can't tab, we can't backtab either */ 129: 130: if (tgoto(CM, destcol, destline)[0] == 'O') 131: CA = FALSE, CM = 0; 132: else 133: CA = TRUE; 134: 135: PC = _PC ? _PC[0] : FALSE; 136: aoftspace = _tspace; 137: strncpy(ttytype, longname(genbuf, type), sizeof(ttytype) - 1); 138: ttytype[sizeof(ttytype) - 1] = '\0'; 139: if (unknown) 140: return ERR; 141: return OK; 142: } 143: 144: /* 145: * This routine gets all the terminal flags from the termcap database 146: */ 147: 148: zap() 149: { 150: register char *namp; 151: register bool **fp; 152: register char ***sp; 153: #ifdef DEBUG 154: register char *cp; 155: #endif 156: extern char *tgetstr(); 157: 158: namp = "ambsdadbeohchzinmimsncnsosulxbxnxtxsxx"; 159: fp = sflags; 160: do { 161: *(*fp++) = tgetflag(namp); 162: #ifdef DEBUG 163: fprintf(outf, "%2.2s = %s\n", namp, *fp[-1] ? "TRUE" : "FALSE"); 164: #endif 165: namp += 2; 166: } while (*namp); 167: namp = "albcbtcdceclcmcrcsdcdldmdoedeik0k1k2k3k4k5k6k7k8k9hoicimipkdkekhklkrkskullmandnlpcrcscsesfsosrtatetiucueupusvbvsveALDLUPDOLERI"; 168: sp = sstrs; 169: do { 170: *(*sp++) = tgetstr(namp, &aoftspace); 171: #ifdef DEBUG 172: fprintf(outf, "%2.2s = %s", namp, *sp[-1] == NULL ? "NULL\n" : "\""); 173: if (*sp[-1] != NULL) { 174: for (cp = *sp[-1]; *cp; cp++) 175: fprintf(outf, "%s", unctrl(*cp)); 176: fprintf(outf, "\"\n"); 177: } 178: #endif 179: namp += 2; 180: } while (*namp); 181: if (XS) 182: SO = SE = NULL; 183: else { 184: if (tgetnum("sg") > 0) 185: SO = NULL; 186: if (tgetnum("ug") > 0) 187: US = NULL; 188: if (!SO && US) { 189: SO = US; 190: SE = UE; 191: } 192: } 193: } 194: 195: /* 196: * return a capability from termcap 197: */ 198: char * 199: getcap(name) 200: char *name; 201: { 202: char *tgetstr(); 203: 204: return tgetstr(name, &aoftspace); 205: }