do case insensitive comparison on domain name
[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
6a1ef78a 19static char sccsid[] = "@(#)wwinit.c 3.32 (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
6a1ef78a
EW
126 wwupd = (struct ww_update *) malloc((unsigned) wwnrow * sizeof *wwupd);
127 if (wwupd == 0) {
128 wwerrno = WWE_NOMEM;
129 goto bad;
130 }
131
bb05dfb5
EW
132 wwindex[WWX_NOBODY] = &wwnobody;
133 wwnobody.ww_order = NWW;
3e0824a9 134
cf28fdac
EW
135 kp = wwwintermcap;
136 if (wwavailmodes & WWM_REV)
137 wwaddcap1(WWT_REV, &kp);
138 if (wwavailmodes & WWM_BLK)
139 wwaddcap1(WWT_BLK, &kp);
140 if (wwavailmodes & WWM_UL)
141 wwaddcap1(WWT_UL, &kp);
142 if (wwavailmodes & WWM_GRP)
143 wwaddcap1(WWT_GRP, &kp);
144 if (wwavailmodes & WWM_DIM)
145 wwaddcap1(WWT_DIM, &kp);
146 if (wwavailmodes & WWM_USR)
147 wwaddcap1(WWT_USR, &kp);
148 if (tt.tt_insline && tt.tt_delline || tt.tt_setscroll)
149 wwaddcap1(WWT_ALDL, &kp);
150 if (tt.tt_hasinsert)
151 wwaddcap1(WWT_IMEI, &kp);
152 if (tt.tt_delchar)
153 wwaddcap1(WWT_DC, &kp);
3f32a92a
EW
154 wwaddcap("kb", &kp);
155 wwaddcap("ku", &kp);
156 wwaddcap("kd", &kp);
157 wwaddcap("kl", &kp);
158 wwaddcap("kr", &kp);
159 wwaddcap("kh", &kp);
4222244b
EW
160 if ((j = tgetnum("kn")) >= 0) {
161 char cap[32];
3e0824a9 162
4222244b 163 (void) sprintf(kp, "kn#%d:", j);
3e0824a9
EW
164 for (; *kp; kp++)
165 ;
4222244b 166 for (i = 1; i <= j; i++) {
bb05dfb5 167 (void) sprintf(cap, "k%d", i);
3f32a92a 168 wwaddcap(cap, &kp);
3e0824a9 169 cap[0] = 'l';
3f32a92a 170 wwaddcap(cap, &kp);
3e0824a9
EW
171 }
172 }
cd9c5720
EW
173 /*
174 * It's ok to do this here even if setenv() is destructive
175 * since tt_init() has already made its own copy of it and
176 * wwterm now points to the copy.
177 */
91b689b9 178 (void) setenv("TERM", WWT_TERM, 1);
4222244b 179
3f32a92a 180 (void) signal(SIGPIPE, SIG_IGN);
7c38ad4d 181 (void) sigsetmask(s);
4711df8b 182 return 0;
bb05dfb5 183bad:
861cd1ed
EW
184 /*
185 * Don't bother to free storage. We're supposed
186 * to exit when wwinit fails anyway.
187 */
4cbd8755 188 (void) wwsettty(0, &wwoldtty, &wwnewtty);
b1189050 189 (void) signal(SIGIO, SIG_DFL);
7c38ad4d 190 (void) sigsetmask(s);
bb05dfb5 191 return -1;
5528a91e 192}
3e0824a9 193
3f32a92a 194wwaddcap(cap, kp)
cf28fdac
EW
195 register char *cap;
196 register char **kp;
3e0824a9 197{
bb05dfb5
EW
198 char tbuf[512];
199 char *tp = tbuf;
9ad71678 200 register char *str, *p;
3e0824a9
EW
201
202 if ((str = tgetstr(cap, &tp)) != 0) {
4222244b 203 while (*(*kp)++ = *cap++)
3e0824a9 204 ;
4222244b 205 (*kp)[-1] = '=';
9ad71678 206 while (*str) {
4222244b 207 for (p = unctrl(*str++); *(*kp)++ = *p++;)
9ad71678 208 ;
4222244b 209 (*kp)--;
9ad71678 210 }
4222244b
EW
211 *(*kp)++ = ':';
212 **kp = 0;
3e0824a9
EW
213 }
214}
cf28fdac
EW
215
216wwaddcap1(cap, kp)
217 register char *cap;
218 register char **kp;
219{
220 while (*(*kp)++ = *cap++)
221 ;
222 (*kp)--;
223}