do case insensitive comparison on domain name
[unix-history] / usr / src / usr.bin / window / wwinit.c
... / ...
CommitLineData
1/*
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
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.
16 */
17
18#ifndef lint
19static char sccsid[] = "@(#)wwinit.c 3.32 (Berkeley) %G%";
20#endif /* not lint */
21
22#include "ww.h"
23#include "tt.h"
24#include <sys/signal.h>
25#include <fcntl.h>
26#include "char.h"
27
28wwinit()
29{
30 register i, j;
31 char *kp;
32 int s;
33
34 wwdtablesize = getdtablesize();
35 wwhead.ww_forw = &wwhead;
36 wwhead.ww_back = &wwhead;
37
38 s = sigblock(sigmask(SIGIO));
39 if (signal(SIGIO, wwrint) == BADSIG)
40 return -1;
41
42 if (wwgettty(0, &wwoldtty) < 0)
43 return -1;
44 wwwintty = wwoldtty;
45 wwwintty.ww_sgttyb.sg_flags &= ~XTABS;
46 wwnewtty.ww_sgttyb = wwoldtty.ww_sgttyb;
47 wwnewtty.ww_sgttyb.sg_erase = -1;
48 wwnewtty.ww_sgttyb.sg_kill = -1;
49 wwnewtty.ww_sgttyb.sg_flags |= CBREAK;
50 wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD);
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;
66 if (wwsettty(0, &wwnewtty, &wwoldtty) < 0)
67 goto bad;
68
69 if ((wwterm = getenv("TERM")) == 0) {
70 wwerrno = WWE_BADTERM;
71 goto bad;
72 }
73 if (tgetent(wwtermcap, wwterm) != 1) {
74 wwerrno = WWE_BADTERM;
75 goto bad;
76 }
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;
83 wwavailmodes = tt.tt_availmodes;
84 wwwrap = tt.tt_wrap;
85 (*tt.tt_init)();
86
87 if (wwavailmodes & WWM_REV)
88 wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK;
89 else if (wwavailmodes & WWM_UL)
90 wwcursormodes = WWM_UL;
91
92 if ((wwib = malloc((unsigned) 512)) == 0)
93 goto bad;
94 wwibe = wwib + 512;
95 wwibq = wwibp = wwib;
96
97 if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0)
98 goto bad;
99 for (i = 0; i < wwnrow; i++)
100 for (j = 0; j < wwncol; j++)
101 wwsmap[i][j] = WWX_NOBODY;
102
103 wwos = (union ww_char **)
104 wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
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 **)
111 wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
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
118 wwtouched = malloc((unsigned) wwnrow);
119 if (wwtouched == 0) {
120 wwerrno = WWE_NOMEM;
121 goto bad;
122 }
123 for (i = 0; i < wwnrow; i++)
124 wwtouched[i] = 0;
125
126 wwupd = (struct ww_update *) malloc((unsigned) wwnrow * sizeof *wwupd);
127 if (wwupd == 0) {
128 wwerrno = WWE_NOMEM;
129 goto bad;
130 }
131
132 wwindex[WWX_NOBODY] = &wwnobody;
133 wwnobody.ww_order = NWW;
134
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);
154 wwaddcap("kb", &kp);
155 wwaddcap("ku", &kp);
156 wwaddcap("kd", &kp);
157 wwaddcap("kl", &kp);
158 wwaddcap("kr", &kp);
159 wwaddcap("kh", &kp);
160 if ((j = tgetnum("kn")) >= 0) {
161 char cap[32];
162
163 (void) sprintf(kp, "kn#%d:", j);
164 for (; *kp; kp++)
165 ;
166 for (i = 1; i <= j; i++) {
167 (void) sprintf(cap, "k%d", i);
168 wwaddcap(cap, &kp);
169 cap[0] = 'l';
170 wwaddcap(cap, &kp);
171 }
172 }
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 */
178 (void) setenv("TERM", WWT_TERM, 1);
179
180 (void) signal(SIGPIPE, SIG_IGN);
181 (void) sigsetmask(s);
182 return 0;
183bad:
184 /*
185 * Don't bother to free storage. We're supposed
186 * to exit when wwinit fails anyway.
187 */
188 (void) wwsettty(0, &wwoldtty, &wwnewtty);
189 (void) signal(SIGIO, SIG_DFL);
190 (void) sigsetmask(s);
191 return -1;
192}
193
194wwaddcap(cap, kp)
195 register char *cap;
196 register char **kp;
197{
198 char tbuf[512];
199 char *tp = tbuf;
200 register char *str, *p;
201
202 if ((str = tgetstr(cap, &tp)) != 0) {
203 while (*(*kp)++ = *cap++)
204 ;
205 (*kp)[-1] = '=';
206 while (*str) {
207 for (p = unctrl(*str++); *(*kp)++ = *p++;)
208 ;
209 (*kp)--;
210 }
211 *(*kp)++ = ':';
212 **kp = 0;
213 }
214}
215
216wwaddcap1(cap, kp)
217 register char *cap;
218 register char **kp;
219{
220 while (*(*kp)++ = *cap++)
221 ;
222 (*kp)--;
223}