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