freedom 100
[unix-history] / usr / src / usr.bin / window / wwinit.c
CommitLineData
5528a91e 1#ifndef lint
f2a77fe1 2static char *sccsid = "@(#)wwinit.c 3.10 83/09/15";
5528a91e
EW
3#endif
4
5#include "ww.h"
e908bfac 6#include "tt.h"
5528a91e 7
bb05dfb5 8static char *kp = wwkeys;
30647f51 9extern char _sobuf[];
5528a91e
EW
10
11wwinit()
12{
bb05dfb5 13 register i, j;
3e0824a9 14 int kn;
4711df8b 15
30647f51 16 setbuf(stdout, _sobuf);
bb05dfb5 17 wwdtablesize = getdtablesize();
4711df8b
EW
18 if (wwgettty(0, &wwoldtty) < 0)
19 return -1;
c44edccd
EW
20 wwwintty = wwoldtty;
21 wwwintty.ww_sgttyb.sg_flags &= ~XTABS;
4711df8b
EW
22 wwnewtty.ww_sgttyb.sg_flags = wwoldtty.ww_sgttyb.sg_flags;
23 wwnewtty.ww_sgttyb.sg_ispeed = wwoldtty.ww_sgttyb.sg_ispeed;
24 wwnewtty.ww_sgttyb.sg_ospeed = wwoldtty.ww_sgttyb.sg_ospeed;
25 wwnewtty.ww_lmode = wwoldtty.ww_lmode;
26 wwnewtty.ww_pgrp = wwoldtty.ww_pgrp;
27 wwnewtty.ww_ldisc = wwoldtty.ww_ldisc;
28 wwnewtty.ww_sgttyb.sg_flags |= CBREAK;
2b44d852 29 wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD);
4711df8b 30 wwnewtty.ww_lmode |= LLITOUT;
4711df8b 31 if (wwsettty(0, &wwnewtty) < 0)
bb05dfb5
EW
32 goto bad;
33
03e75950
EW
34 if ((wwterm = getenv("TERM")) == 0) {
35 wwerrno = WWE_BADTERM;
bb05dfb5 36 goto bad;
03e75950
EW
37 }
38 if (tgetent(wwtermcap, wwterm) != 1) {
39 wwerrno = WWE_BADTERM;
bb05dfb5 40 goto bad;
03e75950 41 }
bb05dfb5
EW
42 wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed];
43
44 if (ttinit() < 0)
45 goto bad;
46 wwnrow = tt.tt_nrow;
47 wwncol = tt.tt_ncol;
7d77e730 48 wwavailmodes = tt.tt_availmodes;
5e785082 49 wwwrap = tt.tt_wrap;
e908bfac 50 (*tt.tt_init)();
bb05dfb5 51
73218728
EW
52 if (wwavailmodes & WWM_REV)
53 wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK;
54 else if (wwavailmodes & WWM_UL)
55 wwcursormodes = WWM_UL;
56
f2a77fe1 57 if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0)
bb05dfb5
EW
58 goto bad;
59 for (i = 0; i < wwnrow; i++)
60 for (j = 0; j < wwncol; j++)
61 wwsmap[i][j] = WWX_NOBODY;
0896e17e 62
bb05dfb5 63 wwos = (union ww_char **)
f2a77fe1 64 wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
bb05dfb5
EW
65 if (wwos == 0)
66 goto bad;
67 for (i = 0; i < wwnrow; i++)
68 for (j = 0; j < wwncol; j++)
69 wwos[i][j].c_w = ' ';
70 wwns = (union ww_char **)
f2a77fe1 71 wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
bb05dfb5
EW
72 if (wwns == 0)
73 goto bad;
74 for (i = 0; i < wwnrow; i++)
75 for (j = 0; j < wwncol; j++)
76 wwns[i][j].c_w = ' ';
77
861cd1ed 78 wwtouched = malloc((unsigned) wwnrow);
03e75950
EW
79 if (wwtouched == 0) {
80 wwerrno = WWE_NOMEM;
861cd1ed 81 goto bad;
03e75950 82 }
861cd1ed
EW
83 for (i = 0; i < wwnrow; i++)
84 wwtouched[i] = 0;
85
bb05dfb5
EW
86 wwindex[WWX_NOBODY] = &wwnobody;
87 wwnobody.ww_order = NWW;
3e0824a9 88
3e0824a9
EW
89 addcap("kb");
90 addcap("ku");
91 addcap("kd");
92 addcap("kl");
93 addcap("kr");
94 addcap("kh");
95 if ((kn = tgetnum("kn")) >= 0) {
96 char cap[5];
97 int i;
98
bb05dfb5 99 (void) sprintf(kp, "kn#%d:", kn);
3e0824a9
EW
100 for (; *kp; kp++)
101 ;
102 for (i = 1; i <= kn; i++) {
bb05dfb5 103 (void) sprintf(cap, "k%d", i);
3e0824a9
EW
104 addcap(cap);
105 cap[0] = 'l';
106 addcap(cap);
107 }
108 }
4711df8b 109 return 0;
bb05dfb5 110bad:
861cd1ed
EW
111 /*
112 * Don't bother to free storage. We're supposed
113 * to exit when wwinit fails anyway.
114 */
bb05dfb5
EW
115 (void) wwsettty(0, &wwoldtty);
116 return -1;
5528a91e 117}
3e0824a9 118
bb05dfb5 119static
3e0824a9
EW
120addcap(cap)
121register char *cap;
122{
bb05dfb5
EW
123 char tbuf[512];
124 char *tp = tbuf;
9ad71678 125 register char *str, *p;
3e0824a9
EW
126
127 if ((str = tgetstr(cap, &tp)) != 0) {
128 while (*kp++ = *cap++)
129 ;
130 kp[-1] = '=';
9ad71678
EW
131 while (*str) {
132 for (p = unctrl(*str++); *kp++ = *p++;)
133 ;
134 kp--;
135 }
136 *kp++ = ':';
3e0824a9
EW
137 *kp = 0;
138 }
139}