|
|
1.1 root 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
19: static char sccsid[] = "@(#)wwinit.c 3.31 (Berkeley) 6/29/88";
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:
28: wwinit()
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: wwindex[WWX_NOBODY] = &wwnobody;
127: wwnobody.ww_order = NWW;
128:
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);
148: wwaddcap("kb", &kp);
149: wwaddcap("ku", &kp);
150: wwaddcap("kd", &kp);
151: wwaddcap("kl", &kp);
152: wwaddcap("kr", &kp);
153: wwaddcap("kh", &kp);
154: if ((j = tgetnum("kn")) >= 0) {
155: char cap[32];
156:
157: (void) sprintf(kp, "kn#%d:", j);
158: for (; *kp; kp++)
159: ;
160: for (i = 1; i <= j; i++) {
161: (void) sprintf(cap, "k%d", i);
162: wwaddcap(cap, &kp);
163: cap[0] = 'l';
164: wwaddcap(cap, &kp);
165: }
166: }
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: */
172: (void) setenv("TERM", WWT_TERM, 1);
173:
174: (void) signal(SIGPIPE, SIG_IGN);
175: (void) sigsetmask(s);
176: return 0;
177: bad:
178: /*
179: * Don't bother to free storage. We're supposed
180: * to exit when wwinit fails anyway.
181: */
182: (void) wwsettty(0, &wwoldtty, &wwnewtty);
183: (void) signal(SIGIO, SIG_DFL);
184: (void) sigsetmask(s);
185: return -1;
186: }
187:
188: wwaddcap(cap, kp)
189: register char *cap;
190: register char **kp;
191: {
192: char tbuf[512];
193: char *tp = tbuf;
194: register char *str, *p;
195:
196: if ((str = tgetstr(cap, &tp)) != 0) {
197: while (*(*kp)++ = *cap++)
198: ;
199: (*kp)[-1] = '=';
200: while (*str) {
201: for (p = unctrl(*str++); *(*kp)++ = *p++;)
202: ;
203: (*kp)--;
204: }
205: *(*kp)++ = ':';
206: **kp = 0;
207: }
208: }
209:
210: wwaddcap1(cap, kp)
211: register char *cap;
212: register char **kp;
213: {
214: while (*(*kp)++ = *cap++)
215: ;
216: (*kp)--;
217: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.