date and time created 83/08/22 15:59:47 by edward
[unix-history] / usr / src / usr.bin / window / wwopen.c
CommitLineData
138b737c 1#ifndef lint
53bb45df 2static char *sccsid = "@(#)wwopen.c 3.5 83/08/22";
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
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;
91bad:
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}