rip out SHELL_ESCAPE define
[unix-history] / usr / src / usr.bin / window / wwinit.c
CommitLineData
60de5df9 1/*
46e9ea25
KB
2 * Copyright (c) 1983 Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
5e8b0e60
KB
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Berkeley. The name of the
11 * University may not be used to endorse or promote products derived
12 * from this software without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
60de5df9
EW
16 */
17
46e9ea25 18#ifndef lint
5e8b0e60 19static char sccsid[] = "@(#)wwinit.c 3.31 (Berkeley) %G%";
46e9ea25
KB
20#endif /* not lint */
21
5528a91e 22#include "ww.h"
e908bfac 23#include "tt.h"
b1189050
EW
24#include <sys/signal.h>
25#include <fcntl.h>
0e64e422 26#include "char.h"
5528a91e 27
5528a91e
EW
28wwinit()
29{
bb05dfb5 30 register i, j;
4222244b 31 char *kp;
7c38ad4d 32 int s;
4711df8b 33
bb05dfb5 34 wwdtablesize = getdtablesize();
4222244b
EW
35 wwhead.ww_forw = &wwhead;
36 wwhead.ww_back = &wwhead;
b1189050 37
7c38ad4d 38 s = sigblock(sigmask(SIGIO));
b1189050
EW
39 if (signal(SIGIO, wwrint) == BADSIG)
40 return -1;
b1189050 41
4711df8b
EW
42 if (wwgettty(0, &wwoldtty) < 0)
43 return -1;
c44edccd
EW
44 wwwintty = wwoldtty;
45 wwwintty.ww_sgttyb.sg_flags &= ~XTABS;
4222244b
EW
46 wwnewtty.ww_sgttyb = wwoldtty.ww_sgttyb;
47 wwnewtty.ww_sgttyb.sg_erase = -1;
48 wwnewtty.ww_sgttyb.sg_kill = -1;
4711df8b 49 wwnewtty.ww_sgttyb.sg_flags |= CBREAK;
2b44d852 50 wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD);
4222244b
EW
51 wwnewtty.ww_tchars.t_intrc = -1;
52 wwnewtty.ww_tchars.t_quitc = -1;
53 wwnewtty.ww_tchars.t_startc = -1;
54 wwnewtty.ww_tchars.t_stopc = -1;
55 wwnewtty.ww_tchars.t_eofc = -1;
56 wwnewtty.ww_tchars.t_brkc = -1;
57 wwnewtty.ww_ltchars.t_suspc = -1;
58 wwnewtty.ww_ltchars.t_dsuspc = -1;
59 wwnewtty.ww_ltchars.t_rprntc = -1;
60 wwnewtty.ww_ltchars.t_flushc = -1;
61 wwnewtty.ww_ltchars.t_werasc = -1;
62 wwnewtty.ww_ltchars.t_lnextc = -1;
63 wwnewtty.ww_lmode = wwoldtty.ww_lmode | LLITOUT;
64 wwnewtty.ww_ldisc = wwoldtty.ww_ldisc;
65 wwnewtty.ww_fflags = wwoldtty.ww_fflags | FASYNC;
4cbd8755 66 if (wwsettty(0, &wwnewtty, &wwoldtty) < 0)
bb05dfb5
EW
67 goto bad;
68
03e75950
EW
69 if ((wwterm = getenv("TERM")) == 0) {
70 wwerrno = WWE_BADTERM;
bb05dfb5 71 goto bad;
03e75950
EW
72 }
73 if (tgetent(wwtermcap, wwterm) != 1) {
74 wwerrno = WWE_BADTERM;
bb05dfb5 75 goto bad;
03e75950 76 }
bb05dfb5
EW
77 wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed];
78
79 if (ttinit() < 0)
80 goto bad;
81 wwnrow = tt.tt_nrow;
82 wwncol = tt.tt_ncol;
7d77e730 83 wwavailmodes = tt.tt_availmodes;
5e785082 84 wwwrap = tt.tt_wrap;
e908bfac 85 (*tt.tt_init)();
bb05dfb5 86
73218728
EW
87 if (wwavailmodes & WWM_REV)
88 wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK;
89 else if (wwavailmodes & WWM_UL)
90 wwcursormodes = WWM_UL;
91
8fa6d94c
EW
92 if ((wwib = malloc((unsigned) 512)) == 0)
93 goto bad;
94 wwibe = wwib + 512;
b1189050 95 wwibq = wwibp = wwib;
8fa6d94c 96
f2a77fe1 97 if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0)
bb05dfb5
EW
98 goto bad;
99 for (i = 0; i < wwnrow; i++)
100 for (j = 0; j < wwncol; j++)
101 wwsmap[i][j] = WWX_NOBODY;
0896e17e 102
bb05dfb5 103 wwos = (union ww_char **)
f2a77fe1 104 wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
bb05dfb5
EW
105 if (wwos == 0)
106 goto bad;
107 for (i = 0; i < wwnrow; i++)
108 for (j = 0; j < wwncol; j++)
109 wwos[i][j].c_w = ' ';
110 wwns = (union ww_char **)
f2a77fe1 111 wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
bb05dfb5
EW
112 if (wwns == 0)
113 goto bad;
114 for (i = 0; i < wwnrow; i++)
115 for (j = 0; j < wwncol; j++)
116 wwns[i][j].c_w = ' ';
117
861cd1ed 118 wwtouched = malloc((unsigned) wwnrow);
03e75950
EW
119 if (wwtouched == 0) {
120 wwerrno = WWE_NOMEM;
861cd1ed 121 goto bad;
03e75950 122 }
861cd1ed
EW
123 for (i = 0; i < wwnrow; i++)
124 wwtouched[i] = 0;
125
bb05dfb5
EW
126 wwindex[WWX_NOBODY] = &wwnobody;
127 wwnobody.ww_order = NWW;
3e0824a9 128
cf28fdac
EW
129 kp = wwwintermcap;
130 if (wwavailmodes & WWM_REV)
131 wwaddcap1(WWT_REV, &kp);
132 if (wwavailmodes & WWM_BLK)
133 wwaddcap1(WWT_BLK, &kp);
134 if (wwavailmodes & WWM_UL)
135 wwaddcap1(WWT_UL, &kp);
136 if (wwavailmodes & WWM_GRP)
137 wwaddcap1(WWT_GRP, &kp);
138 if (wwavailmodes & WWM_DIM)
139 wwaddcap1(WWT_DIM, &kp);
140 if (wwavailmodes & WWM_USR)
141 wwaddcap1(WWT_USR, &kp);
142 if (tt.tt_insline && tt.tt_delline || tt.tt_setscroll)
143 wwaddcap1(WWT_ALDL, &kp);
144 if (tt.tt_hasinsert)
145 wwaddcap1(WWT_IMEI, &kp);
146 if (tt.tt_delchar)
147 wwaddcap1(WWT_DC, &kp);
3f32a92a
EW
148 wwaddcap("kb", &kp);
149 wwaddcap("ku", &kp);
150 wwaddcap("kd", &kp);
151 wwaddcap("kl", &kp);
152 wwaddcap("kr", &kp);
153 wwaddcap("kh", &kp);
4222244b
EW
154 if ((j = tgetnum("kn")) >= 0) {
155 char cap[32];
3e0824a9 156
4222244b 157 (void) sprintf(kp, "kn#%d:", j);
3e0824a9
EW
158 for (; *kp; kp++)
159 ;
4222244b 160 for (i = 1; i <= j; i++) {
bb05dfb5 161 (void) sprintf(cap, "k%d", i);
3f32a92a 162 wwaddcap(cap, &kp);
3e0824a9 163 cap[0] = 'l';
3f32a92a 164 wwaddcap(cap, &kp);
3e0824a9
EW
165 }
166 }
cd9c5720
EW
167 /*
168 * It's ok to do this here even if setenv() is destructive
169 * since tt_init() has already made its own copy of it and
170 * wwterm now points to the copy.
171 */
91b689b9 172 (void) setenv("TERM", WWT_TERM, 1);
4222244b 173
3f32a92a 174 (void) signal(SIGPIPE, SIG_IGN);
7c38ad4d 175 (void) sigsetmask(s);
4711df8b 176 return 0;
bb05dfb5 177bad:
861cd1ed
EW
178 /*
179 * Don't bother to free storage. We're supposed
180 * to exit when wwinit fails anyway.
181 */
4cbd8755 182 (void) wwsettty(0, &wwoldtty, &wwnewtty);
b1189050 183 (void) signal(SIGIO, SIG_DFL);
7c38ad4d 184 (void) sigsetmask(s);
bb05dfb5 185 return -1;
5528a91e 186}
3e0824a9 187
3f32a92a 188wwaddcap(cap, kp)
cf28fdac
EW
189 register char *cap;
190 register char **kp;
3e0824a9 191{
bb05dfb5
EW
192 char tbuf[512];
193 char *tp = tbuf;
9ad71678 194 register char *str, *p;
3e0824a9
EW
195
196 if ((str = tgetstr(cap, &tp)) != 0) {
4222244b 197 while (*(*kp)++ = *cap++)
3e0824a9 198 ;
4222244b 199 (*kp)[-1] = '=';
9ad71678 200 while (*str) {
4222244b 201 for (p = unctrl(*str++); *(*kp)++ = *p++;)
9ad71678 202 ;
4222244b 203 (*kp)--;
9ad71678 204 }
4222244b
EW
205 *(*kp)++ = ':';
206 **kp = 0;
3e0824a9
EW
207 }
208}
cf28fdac
EW
209
210wwaddcap1(cap, kp)
211 register char *cap;
212 register char **kp;
213{
214 while (*(*kp)++ = *cap++)
215 ;
216 (*kp)--;
217}