date and time created 83/08/22 15:19:40 by edward
[unix-history] / usr / src / usr.bin / window / wwopen.c
CommitLineData
138b737c 1#ifndef lint
2357b64e 2static char *sccsid = "@(#)wwopen.c 3.3 83/08/19";
138b737c
EW
3#endif
4
5#include "ww.h"
138b737c 6
138b737c 7struct ww *
bb05dfb5 8wwopen(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;
2357b64e
EW
62
63 if (flags & WWO_FRAME) {
64 w->ww_fmap = wwalloc(w->ww_w.nr, w->ww_w.nc, sizeof (char));
65 if (w->ww_fmap == 0)
66 goto bad;
67 for (i = 0; i < wwnrow; i++)
68 for (j = 0; j < wwncol; j++)
69 w->ww_fmap[i][j] = 0;
70 }
bb05dfb5
EW
71
72 w->ww_buf = (union ww_char **)
73 wwalloc(w->ww_nline, w->ww_w.nc, sizeof (union ww_char));
74 if (w->ww_buf == 0)
75 goto bad;
76 for (i = 0; i < w->ww_nline; i++)
77 for (j = 0; j < w->ww_w.nc; j++)
78 w->ww_buf[i][j].c_w = ' ';
79
80 w->ww_nvis = (short *)malloc((unsigned) w->ww_w.nr * sizeof (short));
81 if (w->ww_nvis == 0)
138b737c 82 goto bad;
bb05dfb5
EW
83 nvis = m ? 0 : w->ww_w.nc;
84 for (i = 0; i < w->ww_w.nr; i++)
85 w->ww_nvis[i] = nvis;
86
87 w->ww_state = WWS_INITIAL;
138b737c
EW
88 return w;
89bad:
4711df8b 90 if (w != 0) {
bb05dfb5 91 if (w->ww_win != 0)
489d8a09 92 wwfree(w->ww_win);
bb05dfb5 93 if (w->ww_cov != 0)
489d8a09 94 wwfree(w->ww_cov);
bb05dfb5 95 if (w->ww_buf != 0)
489d8a09 96 wwfree((char **)w->ww_buf);
bb05dfb5
EW
97 if (w->ww_nvis != 0)
98 free((char *)w->ww_nvis);
99 (void) close(w->ww_tty);
100 (void) close(w->ww_pty);
489d8a09 101 free((char *)w);
4711df8b 102 }
138b737c
EW
103 return 0;
104}