Commit | Line | Data |
---|---|---|
138b737c | 1 | #ifndef lint |
f2a77fe1 | 2 | static char *sccsid = "@(#)wwopen.c 3.12 83/09/15"; |
138b737c EW |
3 | #endif |
4 | ||
5 | #include "ww.h" | |
138b737c | 6 | |
138b737c | 7 | struct ww * |
bb05dfb5 | 8 | wwopen(flags, nrow, ncol, row, col, nline) |
138b737c | 9 | { |
a8a39d2c | 10 | register struct ww *w; |
bb05dfb5 EW |
11 | register i, j; |
12 | char m; | |
13 | short nvis; | |
138b737c | 14 | |
03f0d462 | 15 | w = (struct ww *)calloc(sizeof (struct ww), 1); |
03e75950 EW |
16 | if (w == 0) { |
17 | wwerrno = WWE_NOMEM; | |
03f0d462 | 18 | goto bad; |
03e75950 | 19 | } |
03f0d462 | 20 | |
bb05dfb5 EW |
21 | for (i = 0; i < NWW && wwindex[i] != 0; i++) |
22 | ; | |
03e75950 EW |
23 | if (i >= NWW) { |
24 | wwerrno = WWE_TOOMANY; | |
138b737c | 25 | goto bad; |
03e75950 | 26 | } |
bb05dfb5 | 27 | w->ww_index = i; |
bb05dfb5 | 28 | |
f2a77fe1 EW |
29 | if (nline < nrow) |
30 | nline = nrow; | |
31 | ||
19f9784c EW |
32 | w->ww_w.t = row; |
33 | w->ww_w.b = row + nrow; | |
34 | w->ww_w.l = col; | |
35 | w->ww_w.r = col + ncol; | |
36 | w->ww_w.nr = nrow; | |
37 | w->ww_w.nc = ncol; | |
f2a77fe1 EW |
38 | |
39 | w->ww_b.t = row; | |
40 | w->ww_b.b = row + nline; | |
41 | w->ww_b.l = col; | |
42 | w->ww_b.r = col + ncol; | |
43 | w->ww_b.nr = nline; | |
44 | w->ww_b.nc = ncol; | |
45 | ||
19f9784c EW |
46 | w->ww_i.t = MAX(w->ww_w.t, 0); |
47 | w->ww_i.b = MIN(w->ww_w.b, wwnrow); | |
48 | w->ww_i.l = MAX(w->ww_w.l, 0); | |
49 | w->ww_i.r = MIN(w->ww_w.r, wwncol); | |
50 | w->ww_i.nr = w->ww_i.b - w->ww_i.t; | |
51 | w->ww_i.nc = w->ww_i.r - w->ww_i.l; | |
52 | ||
f2a77fe1 EW |
53 | w->ww_cur.r = w->ww_w.t; |
54 | w->ww_cur.c = w->ww_w.l; | |
bb05dfb5 | 55 | |
03f0d462 | 56 | if (flags & WWO_PTY) { |
03f0d462 EW |
57 | if (wwgetpty(w) < 0) |
58 | goto bad; | |
a8a39d2c | 59 | w->ww_haspty = 1; |
03f0d462 EW |
60 | if (wwsettty(w->ww_pty, &wwwintty) < 0) |
61 | goto bad; | |
62 | } | |
63 | ||
f2a77fe1 EW |
64 | w->ww_win = wwalloc(w->ww_w.t, w->ww_w.l, |
65 | w->ww_w.nr, w->ww_w.nc, sizeof (char)); | |
bb05dfb5 EW |
66 | if (w->ww_win == 0) |
67 | goto bad; | |
68 | m = 0; | |
69 | if (flags & WWO_GLASS) | |
70 | m |= WWM_GLS; | |
71 | if (flags & WWO_REVERSE) | |
72 | m |= WWM_REV; | |
f2a77fe1 EW |
73 | for (i = w->ww_w.t; i < w->ww_w.b; i++) |
74 | for (j = w->ww_w.l; j < w->ww_w.r; j++) | |
bb05dfb5 EW |
75 | w->ww_win[i][j] = m; |
76 | ||
f2a77fe1 EW |
77 | w->ww_cov = wwalloc(w->ww_w.t, w->ww_w.l, |
78 | w->ww_w.nr, w->ww_w.nc, sizeof (char)); | |
bb05dfb5 EW |
79 | if (w->ww_cov == 0) |
80 | goto bad; | |
f2a77fe1 EW |
81 | for (i = w->ww_w.t; i < w->ww_w.b; i++) |
82 | for (j = w->ww_w.l; j < w->ww_w.r; j++) | |
bb05dfb5 | 83 | w->ww_cov[i][j] = WWX_NOBODY; |
2357b64e EW |
84 | |
85 | if (flags & WWO_FRAME) { | |
f2a77fe1 EW |
86 | w->ww_fmap = wwalloc(w->ww_w.t, w->ww_w.l, |
87 | w->ww_w.nr, w->ww_w.nc, sizeof (char)); | |
2357b64e | 88 | if (w->ww_fmap == 0) |
03e75950 | 89 | wwerrno = WWE_NOMEM; |
f2a77fe1 EW |
90 | for (i = w->ww_w.t; i < w->ww_w.b; i++) |
91 | for (j = w->ww_w.l; j < w->ww_w.r; j++) | |
2357b64e EW |
92 | w->ww_fmap[i][j] = 0; |
93 | } | |
bb05dfb5 EW |
94 | |
95 | w->ww_buf = (union ww_char **) | |
f2a77fe1 EW |
96 | wwalloc(w->ww_b.t, w->ww_b.l, |
97 | w->ww_b.nr, w->ww_b.nc, sizeof (union ww_char)); | |
bb05dfb5 EW |
98 | if (w->ww_buf == 0) |
99 | goto bad; | |
f2a77fe1 EW |
100 | for (i = w->ww_b.t; i < w->ww_b.b; i++) |
101 | for (j = w->ww_b.l; j < w->ww_b.r; j++) | |
bb05dfb5 EW |
102 | w->ww_buf[i][j].c_w = ' '; |
103 | ||
104 | w->ww_nvis = (short *)malloc((unsigned) w->ww_w.nr * sizeof (short)); | |
03e75950 EW |
105 | if (w->ww_nvis == 0) { |
106 | wwerrno = WWE_NOMEM; | |
138b737c | 107 | goto bad; |
03e75950 | 108 | } |
f2a77fe1 | 109 | w->ww_nvis -= w->ww_w.t; |
bb05dfb5 | 110 | nvis = m ? 0 : w->ww_w.nc; |
f2a77fe1 | 111 | for (i = w->ww_w.t; i < w->ww_w.b; i++) |
bb05dfb5 EW |
112 | w->ww_nvis[i] = nvis; |
113 | ||
114 | w->ww_state = WWS_INITIAL; | |
03f0d462 | 115 | return wwindex[w->ww_index] = w; |
138b737c | 116 | bad: |
4711df8b | 117 | if (w != 0) { |
bb05dfb5 | 118 | if (w->ww_win != 0) |
f2a77fe1 | 119 | wwfree(w->ww_win, w->ww_w.t); |
bb05dfb5 | 120 | if (w->ww_cov != 0) |
f2a77fe1 | 121 | wwfree(w->ww_cov, w->ww_w.t); |
07f640ea | 122 | if (w->ww_fmap != 0) |
f2a77fe1 | 123 | wwfree(w->ww_fmap, w->ww_w.t); |
bb05dfb5 | 124 | if (w->ww_buf != 0) |
f2a77fe1 | 125 | wwfree((char **)w->ww_buf, w->ww_b.t); |
bb05dfb5 | 126 | if (w->ww_nvis != 0) |
f2a77fe1 | 127 | free((char *)(w->ww_nvis + w->ww_w.t)); |
a8a39d2c EW |
128 | if (w->ww_haspty) { |
129 | (void) close(w->ww_tty); | |
130 | (void) close(w->ww_pty); | |
131 | } | |
489d8a09 | 132 | free((char *)w); |
4711df8b | 133 | } |
138b737c EW |
134 | return 0; |
135 | } |