Commit | Line | Data |
---|---|---|
138b737c | 1 | #ifndef lint |
d78e3aa8 | 2 | static char *sccsid = "@(#)wwopen.c 3.6 83/08/22"; |
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 | { |
4711df8b | 10 | register struct ww *w = 0; |
bb05dfb5 EW |
11 | register i, j; |
12 | char m; | |
13 | short nvis; | |
138b737c | 14 | |
d78e3aa8 EW |
15 | if (nrow <= 0 || ncol <= 0) |
16 | return 0; | |
53bb45df | 17 | if (row < 0 || row + nrow > wwnrow || col < 0 || col + ncol > wwncol) |
bd709139 | 18 | return 0; |
bb05dfb5 EW |
19 | for (i = 0; i < NWW && wwindex[i] != 0; i++) |
20 | ; | |
21 | if (i >= NWW) | |
22 | return 0; | |
23 | wwindex[i] = w = (struct ww *)calloc(sizeof (struct ww), 1); | |
138b737c EW |
24 | if (w == 0) |
25 | goto bad; | |
bb05dfb5 EW |
26 | w->ww_index = i; |
27 | w->ww_pty = w->ww_tty = -1; /* closing by mistake is still safe */ | |
28 | if (flags & WWO_PTY) { | |
29 | w->ww_haspty = 1; | |
2b44d852 EW |
30 | if (wwgetpty(w) < 0) |
31 | goto bad; | |
c44edccd | 32 | if (wwsettty(w->ww_pty, &wwwintty) < 0) |
2b44d852 | 33 | goto bad; |
2b44d852 | 34 | } |
bb05dfb5 EW |
35 | |
36 | if ((w->ww_w.l = col) < 0) | |
37 | goto bad; | |
38 | if ((w->ww_w.r = col + ncol) > wwncol) | |
39 | goto bad; | |
40 | if ((w->ww_w.t = row) < 0) | |
41 | goto bad; | |
42 | if ((w->ww_w.b = row + nrow) > wwnrow) | |
43 | goto bad; | |
44 | w->ww_w.nc = ncol; | |
45 | w->ww_w.nr = nrow; | |
46 | w->ww_nline = MAX(nline, w->ww_w.nr); | |
47 | ||
48 | w->ww_win = wwalloc(w->ww_w.nr, w->ww_w.nc, sizeof (char)); | |
49 | if (w->ww_win == 0) | |
50 | goto bad; | |
51 | m = 0; | |
52 | if (flags & WWO_GLASS) | |
53 | m |= WWM_GLS; | |
54 | if (flags & WWO_REVERSE) | |
55 | m |= WWM_REV; | |
56 | for (i = 0; i < w->ww_w.nr; i++) | |
57 | for (j = 0; j < w->ww_w.nc; j++) | |
58 | w->ww_win[i][j] = m; | |
59 | ||
60 | w->ww_cov = wwalloc(w->ww_w.nr, w->ww_w.nc, sizeof (char)); | |
61 | if (w->ww_cov == 0) | |
62 | goto bad; | |
63 | for (i = 0; i < w->ww_w.nr; i++) | |
64 | for (j = 0; j < w->ww_w.nc; j++) | |
65 | w->ww_cov[i][j] = WWX_NOBODY; | |
2357b64e EW |
66 | |
67 | if (flags & WWO_FRAME) { | |
68 | w->ww_fmap = wwalloc(w->ww_w.nr, w->ww_w.nc, sizeof (char)); | |
69 | if (w->ww_fmap == 0) | |
70 | goto bad; | |
71 | for (i = 0; i < wwnrow; i++) | |
72 | for (j = 0; j < wwncol; j++) | |
73 | w->ww_fmap[i][j] = 0; | |
74 | } | |
bb05dfb5 EW |
75 | |
76 | w->ww_buf = (union ww_char **) | |
77 | wwalloc(w->ww_nline, w->ww_w.nc, sizeof (union ww_char)); | |
78 | if (w->ww_buf == 0) | |
79 | goto bad; | |
80 | for (i = 0; i < w->ww_nline; i++) | |
81 | for (j = 0; j < w->ww_w.nc; j++) | |
82 | w->ww_buf[i][j].c_w = ' '; | |
83 | ||
84 | w->ww_nvis = (short *)malloc((unsigned) w->ww_w.nr * sizeof (short)); | |
85 | if (w->ww_nvis == 0) | |
138b737c | 86 | goto bad; |
bb05dfb5 EW |
87 | nvis = m ? 0 : w->ww_w.nc; |
88 | for (i = 0; i < w->ww_w.nr; i++) | |
89 | w->ww_nvis[i] = nvis; | |
90 | ||
91 | w->ww_state = WWS_INITIAL; | |
138b737c EW |
92 | return w; |
93 | bad: | |
4711df8b | 94 | if (w != 0) { |
bb05dfb5 | 95 | if (w->ww_win != 0) |
489d8a09 | 96 | wwfree(w->ww_win); |
bb05dfb5 | 97 | if (w->ww_cov != 0) |
489d8a09 | 98 | wwfree(w->ww_cov); |
bb05dfb5 | 99 | if (w->ww_buf != 0) |
489d8a09 | 100 | wwfree((char **)w->ww_buf); |
bb05dfb5 EW |
101 | if (w->ww_nvis != 0) |
102 | free((char *)w->ww_nvis); | |
103 | (void) close(w->ww_tty); | |
104 | (void) close(w->ww_pty); | |
489d8a09 | 105 | free((char *)w); |
4711df8b | 106 | } |
138b737c EW |
107 | return 0; |
108 | } |