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