Commit | Line | Data |
---|---|---|
5528a91e | 1 | #ifndef lint |
f2a77fe1 | 2 | static 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 | 8 | static char *kp = wwkeys; |
30647f51 | 9 | extern char _sobuf[]; |
5528a91e EW |
10 | |
11 | wwinit() | |
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 | 110 | bad: |
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 | 119 | static |
3e0824a9 EW |
120 | addcap(cap) |
121 | register 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 | } |