inline expand some function calls
[unix-history] / usr / src / usr.bin / window / wwopen.c
CommitLineData
138b737c 1#ifndef lint
f2a77fe1 2static char *sccsid = "@(#)wwopen.c 3.12 83/09/15";
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
f2a77fe1
EW
29 if (nline < nrow)
30 nline = nrow;
31
19f9784c
EW
32 w->ww_w.t = row;
33 w->ww_w.b = row + nrow;
34 w->ww_w.l = col;
35 w->ww_w.r = col + ncol;
36 w->ww_w.nr = nrow;
37 w->ww_w.nc = ncol;
f2a77fe1
EW
38
39 w->ww_b.t = row;
40 w->ww_b.b = row + nline;
41 w->ww_b.l = col;
42 w->ww_b.r = col + ncol;
43 w->ww_b.nr = nline;
44 w->ww_b.nc = ncol;
45
19f9784c
EW
46 w->ww_i.t = MAX(w->ww_w.t, 0);
47 w->ww_i.b = MIN(w->ww_w.b, wwnrow);
48 w->ww_i.l = MAX(w->ww_w.l, 0);
49 w->ww_i.r = MIN(w->ww_w.r, wwncol);
50 w->ww_i.nr = w->ww_i.b - w->ww_i.t;
51 w->ww_i.nc = w->ww_i.r - w->ww_i.l;
52
f2a77fe1
EW
53 w->ww_cur.r = w->ww_w.t;
54 w->ww_cur.c = w->ww_w.l;
bb05dfb5 55
03f0d462 56 if (flags & WWO_PTY) {
03f0d462
EW
57 if (wwgetpty(w) < 0)
58 goto bad;
a8a39d2c 59 w->ww_haspty = 1;
03f0d462
EW
60 if (wwsettty(w->ww_pty, &wwwintty) < 0)
61 goto bad;
62 }
63
f2a77fe1
EW
64 w->ww_win = wwalloc(w->ww_w.t, w->ww_w.l,
65 w->ww_w.nr, w->ww_w.nc, sizeof (char));
bb05dfb5
EW
66 if (w->ww_win == 0)
67 goto bad;
68 m = 0;
69 if (flags & WWO_GLASS)
70 m |= WWM_GLS;
71 if (flags & WWO_REVERSE)
72 m |= WWM_REV;
f2a77fe1
EW
73 for (i = w->ww_w.t; i < w->ww_w.b; i++)
74 for (j = w->ww_w.l; j < w->ww_w.r; j++)
bb05dfb5
EW
75 w->ww_win[i][j] = m;
76
f2a77fe1
EW
77 w->ww_cov = wwalloc(w->ww_w.t, w->ww_w.l,
78 w->ww_w.nr, w->ww_w.nc, sizeof (char));
bb05dfb5
EW
79 if (w->ww_cov == 0)
80 goto bad;
f2a77fe1
EW
81 for (i = w->ww_w.t; i < w->ww_w.b; i++)
82 for (j = w->ww_w.l; j < w->ww_w.r; j++)
bb05dfb5 83 w->ww_cov[i][j] = WWX_NOBODY;
2357b64e
EW
84
85 if (flags & WWO_FRAME) {
f2a77fe1
EW
86 w->ww_fmap = wwalloc(w->ww_w.t, w->ww_w.l,
87 w->ww_w.nr, w->ww_w.nc, sizeof (char));
2357b64e 88 if (w->ww_fmap == 0)
03e75950 89 wwerrno = WWE_NOMEM;
f2a77fe1
EW
90 for (i = w->ww_w.t; i < w->ww_w.b; i++)
91 for (j = w->ww_w.l; j < w->ww_w.r; j++)
2357b64e
EW
92 w->ww_fmap[i][j] = 0;
93 }
bb05dfb5
EW
94
95 w->ww_buf = (union ww_char **)
f2a77fe1
EW
96 wwalloc(w->ww_b.t, w->ww_b.l,
97 w->ww_b.nr, w->ww_b.nc, sizeof (union ww_char));
bb05dfb5
EW
98 if (w->ww_buf == 0)
99 goto bad;
f2a77fe1
EW
100 for (i = w->ww_b.t; i < w->ww_b.b; i++)
101 for (j = w->ww_b.l; j < w->ww_b.r; j++)
bb05dfb5
EW
102 w->ww_buf[i][j].c_w = ' ';
103
104 w->ww_nvis = (short *)malloc((unsigned) w->ww_w.nr * sizeof (short));
03e75950
EW
105 if (w->ww_nvis == 0) {
106 wwerrno = WWE_NOMEM;
138b737c 107 goto bad;
03e75950 108 }
f2a77fe1 109 w->ww_nvis -= w->ww_w.t;
bb05dfb5 110 nvis = m ? 0 : w->ww_w.nc;
f2a77fe1 111 for (i = w->ww_w.t; i < w->ww_w.b; i++)
bb05dfb5
EW
112 w->ww_nvis[i] = nvis;
113
114 w->ww_state = WWS_INITIAL;
03f0d462 115 return wwindex[w->ww_index] = w;
138b737c 116bad:
4711df8b 117 if (w != 0) {
bb05dfb5 118 if (w->ww_win != 0)
f2a77fe1 119 wwfree(w->ww_win, w->ww_w.t);
bb05dfb5 120 if (w->ww_cov != 0)
f2a77fe1 121 wwfree(w->ww_cov, w->ww_w.t);
07f640ea 122 if (w->ww_fmap != 0)
f2a77fe1 123 wwfree(w->ww_fmap, w->ww_w.t);
bb05dfb5 124 if (w->ww_buf != 0)
f2a77fe1 125 wwfree((char **)w->ww_buf, w->ww_b.t);
bb05dfb5 126 if (w->ww_nvis != 0)
f2a77fe1 127 free((char *)(w->ww_nvis + w->ww_w.t));
a8a39d2c
EW
128 if (w->ww_haspty) {
129 (void) close(w->ww_tty);
130 (void) close(w->ww_pty);
131 }
489d8a09 132 free((char *)w);
4711df8b 133 }
138b737c
EW
134 return 0;
135}