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