1: /************************************************************************* 2: * This program is copyright (C) 1985, 1986 by Jonathan Payne. It is * 3: * provided to you without charge for use only on a licensed Unix * 4: * system. You may copy JOVE provided that this notice is included with * 5: * the copy. You may not sell copies of this program or versions * 6: * modified for use on microcomputer systems, unless the copies are * 7: * included with a Unix system distribution and the source is provided. * 8: *************************************************************************/ 9: 10: #include "jove.h" 11: #include <errno.h> 12: #ifdef SYSV 13: # include <termio.h> 14: #else 15: # include <sgtty.h> 16: #endif SYSV 17: 18: #ifdef IPROCS 19: # include <signal.h> 20: #endif 21: 22: /* Termcap definitions */ 23: 24: char *UP, 25: *CS, 26: *SO, 27: *SE, 28: *CM, 29: *CL, 30: *CE, 31: *HO, 32: *AL, 33: *DL, 34: *VS, 35: *VE, 36: *KS, 37: *KE, 38: *TI, 39: *TE, 40: *IC, 41: *DC, 42: *IM, 43: *EI, 44: *LL, 45: *BC, 46: *M_IC, /* Insert char with arg */ 47: *M_DC, /* Delete char with arg */ 48: *M_AL, /* Insert line with arg */ 49: *M_DL, /* Delete line with arg */ 50: *SF, /* Scroll forward */ 51: *SR, 52: *SP, /* Send Cursor Position */ 53: #ifdef LSRHS 54: *RS, /* Reverse video start */ 55: *RE, /* Reverse end */ 56: #endif 57: *VB, 58: *IP, /* insert pad after character inserted */ 59: *lPC; 60: 61: int LI, 62: ILI, /* Internal lines, i.e., 23 of LI is 24. */ 63: CO, 64: 65: UL, 66: MI, 67: SG, /* number of magic cookies left by SO and SE */ 68: XS, /* whether standout is braindamaged */ 69: 70: TABS, 71: UPlen, 72: HOlen, 73: LLlen; 74: 75: int ospeed; 76: extern char PC; 77: 78: static char tspace[256]; 79: 80: /* The ordering of ts and meas must agree !! */ 81: #ifdef LSRHS 82: static char *ts="vsvealdlspcssosecmclcehoupbcicimdceillsfsrvbksketiteALDLICDCrsrepcip"; 83: static char **meas[] = { 84: &VS, &VE, &AL, &DL, &SP, &CS, &SO, &SE, 85: &CM, &CL, &CE, &HO, &UP, &BC, &IC, &IM, 86: &DC, &EI, &LL, &SF, &SR, &VB, &KS, &KE, 87: &TI, &TE, &M_AL, &M_DL, &M_IC, &M_DC, 88: &RS, &RE, &lPC, &IP, 0 89: }; 90: #else 91: static char *ts="vsvealdlspcssosecmclcehoupbcicimdceillsfsrvbksketiteALDLICDCpcip"; 92: static char **meas[] = { 93: &VS, &VE, &AL, &DL, &SP, &CS, &SO, &SE, 94: &CM, &CL, &CE, &HO, &UP, &BC, &IC, &IM, 95: &DC, &EI, &LL, &SF, &SR, &VB, &KS, &KE, 96: &TI, &TE, &M_AL, &M_DL, &M_IC, &M_DC, 97: &lPC, &IP, 0 98: }; 99: #endif 100: 101: static 102: gets(buf) 103: char *buf; 104: { 105: buf[read(0, buf, 12) - 1] = 0; 106: } 107: 108: /* VARARGS1 */ 109: 110: static 111: TermError(fmt, a) 112: char *fmt; 113: { 114: printf(fmt, a); 115: _exit(1); 116: } 117: 118: getTERM() 119: { 120: char *getenv(); 121: char termbuf[13], 122: *termname = 0, 123: *termp = tspace, 124: tbuff[2048]; /* Good grief! */ 125: int i; 126: 127: termname = getenv("TERM"); 128: if (termname == 0) { 129: putstr("Enter terminal name: "); 130: gets(termbuf); 131: if (termbuf[0] == 0) 132: TermError(NullStr); 133: 134: termname = termbuf; 135: } 136: 137: if (tgetent(tbuff, termname) < 1) 138: TermError("[\"%s\" unknown terminal type?]", termname); 139: 140: if ((CO = tgetnum("co")) == -1) 141: TermError("columns?"); 142: 143: if ((LI = tgetnum("li")) == -1) 144: TermError("lines?"); 145: 146: if ((SG = tgetnum("sg")) == -1) 147: SG = 0; /* Used for mode line only */ 148: 149: if ((XS = tgetflag("xs")) == -1) 150: XS = 0; /* Used for mode line only */ 151: 152: for (i = 0; meas[i]; i++) { 153: *(meas[i]) = (char *) tgetstr(ts, &termp); 154: ts += 2; 155: } 156: if (lPC) 157: PC = *lPC; 158: if (XS) 159: SO = SE = 0; 160: 161: if (CS && !SR) 162: CS = SR = SF = 0; 163: 164: if (CS && !SF) 165: SF = "\n"; 166: 167: if (IM && (*IM == 0)) 168: IM = 0; 169: else 170: MI = tgetflag("mi"); 171: 172: UL = tgetflag("ul"); 173: 174: #ifdef LSRHS /* We, at the high school, are the only ones who 175: do SO right in termcap, but unfortunately the 176: right SO doesn't look as good with modelines. */ 177: if (RS) 178: SO = RS; 179: if (RE) 180: SE = RE; 181: /* I only ever use SO for the modeline anyway. */ 182: 183: /* SO is really BOLDFACE! Why is LS always right and the rest of the 184: world wrong? */ 185: #endif 186: #ifdef ID_CHAR 187: disp_opt_init(); 188: #endif 189: if (CanScroll = ((AL && DL) || CS)) 190: IDline_setup(termname); 191: }