date and time created 83/08/09 18:37:52 by edward
[unix-history] / usr / src / usr.bin / window / wwopen.c
CommitLineData
138b737c 1#ifndef lint
bb05dfb5 2static char *sccsid = "@(#)wwopen.c 2.1.1.1 83/08/09";
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;
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;
80bad:
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}