fts_statb -> fts_statp
[unix-history] / usr / src / usr.bin / window / wwsize.c
CommitLineData
60de5df9 1/*
46e9ea25
KB
2 * Copyright (c) 1983 Regents of the University of California.
3 * All rights reserved.
4 *
3dd3a9e5
KB
5 * This code is derived from software contributed to Berkeley by
6 * Edward Wang at The University of California, Berkeley.
7 *
87f529ec 8 * %sccs.include.redist.c%
60de5df9
EW
9 */
10
46e9ea25 11#ifndef lint
9de86788 12static char sccsid[] = "@(#)wwsize.c 3.10 (Berkeley) %G%";
46e9ea25
KB
13#endif /* not lint */
14
0b8d556f
EW
15#include "ww.h"
16
17/*
18 * Resize a window. Should be unattached.
19 */
20wwsize(w, nrow, ncol)
21register struct ww *w;
22{
23 register i, j;
24 int nline;
25 union ww_char **buf = 0;
26 char **win = 0;
27 short *nvis = 0;
28 char **fmap = 0;
29 char m;
30
0b8d556f
EW
31 /*
32 * First allocate new buffers.
33 */
34 win = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char));
35 if (win == 0)
36 goto bad;
37 if (w->ww_fmap != 0) {
38 fmap = wwalloc(w->ww_w.t, w->ww_w.l, nrow, ncol, sizeof (char));
39 if (fmap == 0)
40 goto bad;
41 }
42 if (nrow > w->ww_b.nr || ncol > w->ww_b.nc) {
43 nline = MAX(w->ww_b.nr, nrow);
44 buf = (union ww_char **) wwalloc(w->ww_b.t, w->ww_b.l,
45 nline, ncol, sizeof (union ww_char));
46 if (buf == 0)
47 goto bad;
48 }
49 nvis = (short *)malloc((unsigned) nrow * sizeof (short));
50 if (nvis == 0) {
51 wwerrno = WWE_NOMEM;
52 goto bad;
53 }
54 nvis -= w->ww_w.t;
55 /*
56 * Copy text buffer.
57 */
58 if (buf != 0) {
59 int b, r;
60
61 b = w->ww_b.t + nline;
62 r = w->ww_b.l + ncol;
63 if (ncol < w->ww_b.nc)
64 for (i = w->ww_b.t; i < w->ww_b.b; i++)
65 for (j = w->ww_b.l; j < r; j++)
66 buf[i][j] = w->ww_buf[i][j];
67 else
68 for (i = w->ww_b.t; i < w->ww_b.b; i++) {
69 for (j = w->ww_b.l; j < w->ww_b.r; j++)
70 buf[i][j] = w->ww_buf[i][j];
71 for (; j < r; j++)
72 buf[i][j].c_w = ' ';
73 }
74 for (; i < b; i++)
75 for (j = w->ww_b.l; j < r; j++)
76 buf[i][j].c_w = ' ';
77 }
78 /*
79 * Now free the old stuff.
80 */
81 wwfree((char **)w->ww_win, w->ww_w.t);
82 w->ww_win = win;
83 if (buf != 0) {
84 wwfree((char **)w->ww_buf, w->ww_b.t);
85 w->ww_buf = buf;
86 }
87 if (w->ww_fmap != 0) {
88 wwfree((char **)w->ww_fmap, w->ww_w.t);
89 w->ww_fmap = fmap;
90 }
91 free((char *)(w->ww_nvis + w->ww_w.t));
92 w->ww_nvis = nvis;
93 /*
94 * Set new sizes.
95 */
96 /* window */
97 w->ww_w.b = w->ww_w.t + nrow;
98 w->ww_w.r = w->ww_w.l + ncol;
99 w->ww_w.nr = nrow;
100 w->ww_w.nc = ncol;
101 /* text buffer */
102 if (buf != 0) {
103 w->ww_b.b = w->ww_b.t + nline;
104 w->ww_b.r = w->ww_b.l + ncol;
105 w->ww_b.nr = nline;
106 w->ww_b.nc = ncol;
107 }
108 /* scroll */
109 if ((i = w->ww_b.b - w->ww_w.b) < 0 ||
110 (i = w->ww_cur.r - w->ww_w.b + 1) > 0) {
111 w->ww_buf += i;
112 w->ww_b.t -= i;
113 w->ww_b.b -= i;
114 w->ww_cur.r -= i;
115 }
116 /* interior */
117 w->ww_i.b = MIN(w->ww_w.b, wwnrow);
118 w->ww_i.r = MIN(w->ww_w.r, wwncol);
119 w->ww_i.nr = w->ww_i.b - w->ww_i.t;
120 w->ww_i.nc = w->ww_i.r - w->ww_i.l;
121 /*
122 * Initialize new buffers.
123 */
124 /* window */
125 m = 0;
126 if (w->ww_oflags & WWO_GLASS)
127 m |= WWM_GLS;
128 if (w->ww_oflags & WWO_REVERSE)
129 m |= WWM_REV;
130 for (i = w->ww_w.t; i < w->ww_w.b; i++)
131 for (j = w->ww_w.l; j < w->ww_w.r; j++)
132 w->ww_win[i][j] = m;
133 /* frame map */
134 if (fmap != 0)
135 for (i = w->ww_w.t; i < w->ww_w.b; i++)
136 for (j = w->ww_w.l; j < w->ww_w.r; j++)
137 w->ww_fmap[i][j] = 0;
138 /* visibility */
139 j = m ? 0 : w->ww_w.nc;
140 for (i = w->ww_w.t; i < w->ww_w.b; i++)
141 w->ww_nvis[i] = j;
142 /*
143 * Put cursor back.
144 */
145 if (w->ww_hascursor) {
146 w->ww_hascursor = 0;
147 wwcursor(w, 1);
148 }
149 /*
150 * Fool with pty.
151 */
9de86788
EW
152 if (w->ww_ispty && w->ww_pty >= 0)
153 (void) wwsetttysize(w->ww_pty, nrow, ncol);
0b8d556f
EW
154 return 0;
155bad:
156 if (win != 0)
157 wwfree(win, w->ww_w.t);
158 if (fmap != 0)
159 wwfree(fmap, w->ww_w.t);
160 if (buf != 0)
161 wwfree((char **)buf, w->ww_b.t);
162 if (nvis != 0)
163 free((char *)(nvis + w->ww_w.t));
164 return -1;
165}