make l_window() accept "*" again
[unix-history] / usr / src / usr.bin / window / wwopen.c
CommitLineData
138b737c 1#ifndef lint
eec72f58 2static char *sccsid = "@(#)wwopen.c 3.14 83/12/01";
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 }
eec72f58 20 w->ww_pty = -1;
03f0d462 21
bb05dfb5
EW
22 for (i = 0; i < NWW && wwindex[i] != 0; i++)
23 ;
03e75950
EW
24 if (i >= NWW) {
25 wwerrno = WWE_TOOMANY;
138b737c 26 goto bad;
03e75950 27 }
bb05dfb5 28 w->ww_index = i;
bb05dfb5 29
f2a77fe1
EW
30 if (nline < nrow)
31 nline = nrow;
32
19f9784c
EW
33 w->ww_w.t = row;
34 w->ww_w.b = row + nrow;
35 w->ww_w.l = col;
36 w->ww_w.r = col + ncol;
37 w->ww_w.nr = nrow;
38 w->ww_w.nc = ncol;
f2a77fe1
EW
39
40 w->ww_b.t = row;
41 w->ww_b.b = row + nline;
42 w->ww_b.l = col;
43 w->ww_b.r = col + ncol;
44 w->ww_b.nr = nline;
45 w->ww_b.nc = ncol;
46
19f9784c
EW
47 w->ww_i.t = MAX(w->ww_w.t, 0);
48 w->ww_i.b = MIN(w->ww_w.b, wwnrow);
49 w->ww_i.l = MAX(w->ww_w.l, 0);
50 w->ww_i.r = MIN(w->ww_w.r, wwncol);
51 w->ww_i.nr = w->ww_i.b - w->ww_i.t;
52 w->ww_i.nc = w->ww_i.r - w->ww_i.l;
53
f2a77fe1
EW
54 w->ww_cur.r = w->ww_w.t;
55 w->ww_cur.c = w->ww_w.l;
bb05dfb5 56
03f0d462 57 if (flags & WWO_PTY) {
03f0d462
EW
58 if (wwgetpty(w) < 0)
59 goto bad;
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 75 w->ww_win[i][j] = m;
2357b64e
EW
76
77 if (flags & WWO_FRAME) {
f2a77fe1
EW
78 w->ww_fmap = wwalloc(w->ww_w.t, w->ww_w.l,
79 w->ww_w.nr, w->ww_w.nc, sizeof (char));
2357b64e 80 if (w->ww_fmap == 0)
03e75950 81 wwerrno = WWE_NOMEM;
f2a77fe1
EW
82 for (i = w->ww_w.t; i < w->ww_w.b; i++)
83 for (j = w->ww_w.l; j < w->ww_w.r; j++)
2357b64e
EW
84 w->ww_fmap[i][j] = 0;
85 }
bb05dfb5
EW
86
87 w->ww_buf = (union ww_char **)
f2a77fe1
EW
88 wwalloc(w->ww_b.t, w->ww_b.l,
89 w->ww_b.nr, w->ww_b.nc, sizeof (union ww_char));
bb05dfb5
EW
90 if (w->ww_buf == 0)
91 goto bad;
f2a77fe1
EW
92 for (i = w->ww_b.t; i < w->ww_b.b; i++)
93 for (j = w->ww_b.l; j < w->ww_b.r; j++)
bb05dfb5
EW
94 w->ww_buf[i][j].c_w = ' ';
95
96 w->ww_nvis = (short *)malloc((unsigned) w->ww_w.nr * sizeof (short));
03e75950
EW
97 if (w->ww_nvis == 0) {
98 wwerrno = WWE_NOMEM;
138b737c 99 goto bad;
03e75950 100 }
f2a77fe1 101 w->ww_nvis -= w->ww_w.t;
bb05dfb5 102 nvis = m ? 0 : w->ww_w.nc;
f2a77fe1 103 for (i = w->ww_w.t; i < w->ww_w.b; i++)
bb05dfb5
EW
104 w->ww_nvis[i] = nvis;
105
106 w->ww_state = WWS_INITIAL;
03f0d462 107 return wwindex[w->ww_index] = w;
138b737c 108bad:
4711df8b 109 if (w != 0) {
bb05dfb5 110 if (w->ww_win != 0)
f2a77fe1 111 wwfree(w->ww_win, w->ww_w.t);
07f640ea 112 if (w->ww_fmap != 0)
f2a77fe1 113 wwfree(w->ww_fmap, w->ww_w.t);
bb05dfb5 114 if (w->ww_buf != 0)
f2a77fe1 115 wwfree((char **)w->ww_buf, w->ww_b.t);
bb05dfb5 116 if (w->ww_nvis != 0)
f2a77fe1 117 free((char *)(w->ww_nvis + w->ww_w.t));
eec72f58 118 (void) close(w->ww_pty);
489d8a09 119 free((char *)w);
4711df8b 120 }
138b737c
EW
121 return 0;
122}