|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)wwinit.c 3.26 5/1/86";
3: #endif
4:
5: /*
6: * Copyright (c) 1983 Regents of the University of California,
7: * All rights reserved. Redistribution permitted subject to
8: * the terms of the Berkeley Software License Agreement.
9: */
10:
11: #include "ww.h"
12: #include "tt.h"
13: #include <sys/signal.h>
14: #include <fcntl.h>
15: #include "char.h"
16:
17: wwinit()
18: {
19: register i, j;
20: char *kp;
21: register char **p, **q;
22: char **env, **termcap = 0;
23: extern char **environ;
24: int s;
25:
26: wwdtablesize = getdtablesize();
27: wwhead.ww_forw = &wwhead;
28: wwhead.ww_back = &wwhead;
29:
30: s = sigblock(sigmask(SIGIO));
31: if (signal(SIGIO, wwrint) == BADSIG)
32: return -1;
33:
34: if (wwgettty(0, &wwoldtty) < 0)
35: return -1;
36: wwwintty = wwoldtty;
37: wwwintty.ww_sgttyb.sg_flags &= ~XTABS;
38: wwnewtty.ww_sgttyb = wwoldtty.ww_sgttyb;
39: wwnewtty.ww_sgttyb.sg_erase = -1;
40: wwnewtty.ww_sgttyb.sg_kill = -1;
41: wwnewtty.ww_sgttyb.sg_flags |= CBREAK;
42: wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD);
43: wwnewtty.ww_tchars.t_intrc = -1;
44: wwnewtty.ww_tchars.t_quitc = -1;
45: wwnewtty.ww_tchars.t_startc = -1;
46: wwnewtty.ww_tchars.t_stopc = -1;
47: wwnewtty.ww_tchars.t_eofc = -1;
48: wwnewtty.ww_tchars.t_brkc = -1;
49: wwnewtty.ww_ltchars.t_suspc = -1;
50: wwnewtty.ww_ltchars.t_dsuspc = -1;
51: wwnewtty.ww_ltchars.t_rprntc = -1;
52: wwnewtty.ww_ltchars.t_flushc = -1;
53: wwnewtty.ww_ltchars.t_werasc = -1;
54: wwnewtty.ww_ltchars.t_lnextc = -1;
55: wwnewtty.ww_lmode = wwoldtty.ww_lmode | LLITOUT;
56: wwnewtty.ww_ldisc = wwoldtty.ww_ldisc;
57: wwnewtty.ww_fflags = wwoldtty.ww_fflags | FASYNC;
58: if (wwsettty(0, &wwnewtty, &wwoldtty) < 0)
59: goto bad;
60:
61: if ((wwterm = getenv("TERM")) == 0) {
62: wwerrno = WWE_BADTERM;
63: goto bad;
64: }
65: if (tgetent(wwtermcap, wwterm) != 1) {
66: wwerrno = WWE_BADTERM;
67: goto bad;
68: }
69: wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed];
70:
71: if (ttinit() < 0)
72: goto bad;
73: wwnrow = tt.tt_nrow;
74: wwncol = tt.tt_ncol;
75: wwavailmodes = tt.tt_availmodes;
76: wwwrap = tt.tt_wrap;
77: (*tt.tt_init)();
78:
79: if (wwavailmodes & WWM_REV)
80: wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK;
81: else if (wwavailmodes & WWM_UL)
82: wwcursormodes = WWM_UL;
83:
84: if ((wwib = malloc((unsigned) 512)) == 0)
85: goto bad;
86: wwibe = wwib + 512;
87: wwibq = wwibp = wwib;
88:
89: if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0)
90: goto bad;
91: for (i = 0; i < wwnrow; i++)
92: for (j = 0; j < wwncol; j++)
93: wwsmap[i][j] = WWX_NOBODY;
94:
95: wwos = (union ww_char **)
96: wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
97: if (wwos == 0)
98: goto bad;
99: for (i = 0; i < wwnrow; i++)
100: for (j = 0; j < wwncol; j++)
101: wwos[i][j].c_w = ' ';
102: wwns = (union ww_char **)
103: wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
104: if (wwns == 0)
105: goto bad;
106: for (i = 0; i < wwnrow; i++)
107: for (j = 0; j < wwncol; j++)
108: wwns[i][j].c_w = ' ';
109:
110: wwtouched = malloc((unsigned) wwnrow);
111: if (wwtouched == 0) {
112: wwerrno = WWE_NOMEM;
113: goto bad;
114: }
115: for (i = 0; i < wwnrow; i++)
116: wwtouched[i] = 0;
117:
118: wwindex[WWX_NOBODY] = &wwnobody;
119: wwnobody.ww_order = NWW;
120:
121: kp = wwkeys;
122: wwaddcap("kb", &kp);
123: wwaddcap("ku", &kp);
124: wwaddcap("kd", &kp);
125: wwaddcap("kl", &kp);
126: wwaddcap("kr", &kp);
127: wwaddcap("kh", &kp);
128: if ((j = tgetnum("kn")) >= 0) {
129: char cap[32];
130:
131: (void) sprintf(kp, "kn#%d:", j);
132: for (; *kp; kp++)
133: ;
134: for (i = 1; i <= j; i++) {
135: (void) sprintf(cap, "k%d", i);
136: wwaddcap(cap, &kp);
137: cap[0] = 'l';
138: wwaddcap(cap, &kp);
139: }
140: }
141: for (i = 0, p = environ; *p++; i++)
142: ;
143: if ((env = (char **)malloc((unsigned)(i + 3) * sizeof (char *))) == 0)
144: goto bad;
145: for (p = environ, q = env; *p; p++, q++) {
146: if (strncmp(*p, "TERM=", 5) == 0)
147: *q = WWT_TERM;
148: else if (strncmp(*p, "TERMCAP=", 8) == 0)
149: termcap = q;
150: else
151: *q = *p;
152: }
153: *(termcap ? termcap : q++) = wwwintermcap;
154: *q = 0;
155: environ = env;
156:
157: (void) signal(SIGPIPE, SIG_IGN);
158: (void) sigsetmask(s);
159: return 0;
160: bad:
161: /*
162: * Don't bother to free storage. We're supposed
163: * to exit when wwinit fails anyway.
164: */
165: (void) wwsettty(0, &wwoldtty, &wwnewtty);
166: (void) signal(SIGIO, SIG_DFL);
167: (void) sigsetmask(s);
168: return -1;
169: }
170:
171: wwaddcap(cap, kp)
172: register char *cap;
173: register char **kp;
174: {
175: char tbuf[512];
176: char *tp = tbuf;
177: register char *str, *p;
178:
179: if ((str = tgetstr(cap, &tp)) != 0) {
180: while (*(*kp)++ = *cap++)
181: ;
182: (*kp)[-1] = '=';
183: while (*str) {
184: for (p = unctrl(*str++); *(*kp)++ = *p++;)
185: ;
186: (*kp)--;
187: }
188: *(*kp)++ = ':';
189: **kp = 0;
190: }
191: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.