moving windows
[unix-history] / usr / src / usr.bin / window / wwopen.c
CommitLineData
138b737c 1#ifndef lint
a8a39d2c 2static char *sccsid = "@(#)wwopen.c 3.10 83/08/26";
138b737c
EW
3#endif
4
5#include "ww.h"
138b737c 6
138b737c 7struct ww *
bb05dfb5 8wwopen(flags, nrow, ncol, row, col, nline)
138b737c 9{
a8a39d2c 10 register struct ww *w;
bb05dfb5
EW
11 register i, j;
12 char m;
13 short nvis;
138b737c 14
03f0d462 15 w = (struct ww *)calloc(sizeof (struct ww), 1);
03e75950
EW
16 if (w == 0) {
17 wwerrno = WWE_NOMEM;
03f0d462 18 goto bad;
03e75950 19 }
03f0d462 20
bb05dfb5
EW
21 for (i = 0; i < NWW && wwindex[i] != 0; i++)
22 ;
03e75950
EW
23 if (i >= NWW) {
24 wwerrno = WWE_TOOMANY;
138b737c 25 goto bad;
03e75950 26 }
bb05dfb5 27 w->ww_index = i;
bb05dfb5 28
03e75950
EW
29 if ((w->ww_w.nr = nrow) <= 0
30 || (w->ww_w.nc = ncol) <= 0
31 || (w->ww_w.l = col) < 0
32 || (w->ww_w.r = col + ncol) > wwncol
33 || (w->ww_w.t = row) < 0
34 || (w->ww_w.b = row + nrow) > wwnrow) {
35 wwerrno = WWE_SIZE;
bb05dfb5 36 goto bad;
03e75950 37 }
bb05dfb5
EW
38 w->ww_nline = MAX(nline, w->ww_w.nr);
39
03f0d462 40 if (flags & WWO_PTY) {
03f0d462
EW
41 if (wwgetpty(w) < 0)
42 goto bad;
a8a39d2c 43 w->ww_haspty = 1;
03f0d462
EW
44 if (wwsettty(w->ww_pty, &wwwintty) < 0)
45 goto bad;
46 }
47
bb05dfb5
EW
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)
03e75950 70 wwerrno = WWE_NOMEM;
2357b64e
EW
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));
03e75950
EW
85 if (w->ww_nvis == 0) {
86 wwerrno = WWE_NOMEM;
138b737c 87 goto bad;
03e75950 88 }
bb05dfb5
EW
89 nvis = m ? 0 : w->ww_w.nc;
90 for (i = 0; i < w->ww_w.nr; i++)
91 w->ww_nvis[i] = nvis;
92
93 w->ww_state = WWS_INITIAL;
03f0d462 94 return wwindex[w->ww_index] = w;
138b737c 95bad:
4711df8b 96 if (w != 0) {
bb05dfb5 97 if (w->ww_win != 0)
489d8a09 98 wwfree(w->ww_win);
bb05dfb5 99 if (w->ww_cov != 0)
489d8a09 100 wwfree(w->ww_cov);
07f640ea
EW
101 if (w->ww_fmap != 0)
102 wwfree(w->ww_fmap);
bb05dfb5 103 if (w->ww_buf != 0)
489d8a09 104 wwfree((char **)w->ww_buf);
bb05dfb5
EW
105 if (w->ww_nvis != 0)
106 free((char *)w->ww_nvis);
a8a39d2c
EW
107 if (w->ww_haspty) {
108 (void) close(w->ww_tty);
109 (void) close(w->ww_pty);
110 }
489d8a09 111 free((char *)w);
4711df8b 112 }
138b737c
EW
113 return 0;
114}