BSD 4_3 development
[unix-history] / usr / contrib / jove / term.c
CommitLineData
fb51ca13
C
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
24char *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
61int 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
75int ospeed;
76extern char PC;
77
78static char tspace[256];
79
80/* The ordering of ts and meas must agree !! */
81#ifdef LSRHS
82static char *ts="vsvealdlspcssosecmclcehoupbcicimdceillsfsrvbksketiteALDLICDCrsrepcip";
83static 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
91static char *ts="vsvealdlspcssosecmclcehoupbcicimdceillsfsrvbksketiteALDLICDCpcip";
92static 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
101static
102gets(buf)
103char *buf;
104{
105 buf[read(0, buf, 12) - 1] = 0;
106}
107
108/* VARARGS1 */
109
110static
111TermError(fmt, a)
112char *fmt;
113{
114 printf(fmt, a);
115 _exit(1);
116}
117
118getTERM()
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}
192