Annotation of src/usr.bin/window/cmd7.c, Revision 1.1.1.1
1.1 deraadt 1: /* $NetBSD: cmd7.c,v 1.3 1995/09/28 10:34:12 tls Exp $ */
2:
3: /*
4: * Copyright (c) 1983, 1993
5: * The Regents of the University of California. All rights reserved.
6: *
7: * This code is derived from software contributed to Berkeley by
8: * Edward Wang at The University of California, Berkeley.
9: *
10: * Redistribution and use in source and binary forms, with or without
11: * modification, are permitted provided that the following conditions
12: * are met:
13: * 1. Redistributions of source code must retain the above copyright
14: * notice, this list of conditions and the following disclaimer.
15: * 2. Redistributions in binary form must reproduce the above copyright
16: * notice, this list of conditions and the following disclaimer in the
17: * documentation and/or other materials provided with the distribution.
18: * 3. All advertising materials mentioning features or use of this software
19: * must display the following acknowledgement:
20: * This product includes software developed by the University of
21: * California, Berkeley and its contributors.
22: * 4. Neither the name of the University nor the names of its contributors
23: * may be used to endorse or promote products derived from this software
24: * without specific prior written permission.
25: *
26: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36: * SUCH DAMAGE.
37: */
38:
39: #ifndef lint
40: #if 0
41: static char sccsid[] = "@(#)cmd7.c 8.1 (Berkeley) 6/6/93";
42: #else
43: static char rcsid[] = "$NetBSD: cmd7.c,v 1.3 1995/09/28 10:34:12 tls Exp $";
44: #endif
45: #endif /* not lint */
46:
47: #include "defs.h"
48: #include "string.h"
49:
50: /*
51: * Window size.
52: */
53:
54: c_size(w)
55: register struct ww *w;
56: {
57: int col, row;
58:
59: if (!terse)
60: wwputs("New window size (lower right corner): ", cmdwin);
61: col = MIN(w->ww_w.r, wwncol) - 1;
62: row = MIN(w->ww_w.b, wwnrow) - 1;
63: wwadd(boxwin, framewin->ww_back);
64: for (;;) {
65: wwbox(boxwin, w->ww_w.t - 1, w->ww_w.l - 1,
66: row - w->ww_w.t + 3, col - w->ww_w.l + 3);
67: wwsetcursor(row, col);
68: while (wwpeekc() < 0)
69: wwiomux();
70: switch (getpos(&row, &col, w->ww_w.t, w->ww_w.l,
71: wwnrow - 1, wwncol - 1)) {
72: case 3:
73: wwunbox(boxwin);
74: wwdelete(boxwin);
75: return;
76: case 2:
77: wwunbox(boxwin);
78: break;
79: case 1:
80: wwunbox(boxwin);
81: case 0:
82: continue;
83: }
84: break;
85: }
86: wwdelete(boxwin);
87: if (!terse)
88: wwputc('\n', cmdwin);
89: wwcurtowin(cmdwin);
90: sizewin(w, row - w->ww_w.t + 1, col - w->ww_w.l + 1);
91: }
92:
93: /*
94: * Yank and put
95: */
96:
97: struct yb {
98: char *line;
99: int length;
100: struct yb *link;
101: };
102: struct yb *yb_head, *yb_tail;
103:
104: c_yank()
105: {
106: struct ww *w = selwin;
107: int col1, row1;
108: int col2, row2;
109: int r, c;
110:
111: if (!terse)
112: wwputs("Yank starting position: ", cmdwin);
113: wwcursor(w, 0);
114: row1 = w->ww_cur.r;
115: col1 = w->ww_cur.c;
116: for (;;) {
117: wwsetcursor(row1, col1);
118: while (wwpeekc() < 0)
119: wwiomux();
120: switch (getpos(&row1, &col1, w->ww_i.t, w->ww_i.l,
121: w->ww_i.b - 1, w->ww_i.r - 1)) {
122: case 3:
123: goto out;
124: case 2:
125: break;
126: case 1:
127: case 0:
128: continue;
129: }
130: break;
131: }
132: if (!terse)
133: wwputs("\nYank ending position: ", cmdwin);
134: row2 = row1;
135: col2 = col1;
136: for (;;) {
137: wwsetcursor(row2, col2);
138: while (wwpeekc() < 0)
139: wwiomux();
140: r = row2;
141: c = col2;
142: switch (getpos(&row2, &col2, w->ww_i.t, w->ww_i.l,
143: w->ww_i.b - 1, w->ww_i.r - 1)) {
144: case 3:
145: yank_highlight(row1, col1, r, c);
146: goto out;
147: case 2:
148: break;
149: case 1:
150: yank_highlight(row1, col1, r, c);
151: yank_highlight(row1, col1, row2, col2);
152: case 0:
153: continue;
154: }
155: break;
156: }
157: if (row2 < row1 || row2 == row1 && col2 < col1) {
158: r = row1;
159: c = col1;
160: row1 = row2;
161: col1 = col2;
162: row2 = r;
163: col2 = c;
164: }
165: unyank();
166: c = col1;
167: for (r = row1; r < row2; r++) {
168: yank_line(r, c, w->ww_b.r);
169: c = w->ww_b.l;
170: }
171: yank_line(r, c, col2);
172: yank_highlight(row1, col1, row2, col2);
173: if (!terse)
174: wwputc('\n', cmdwin);
175: out:
176: wwcursor(w, 1);
177: }
178:
179: yank_highlight(row1, col1, row2, col2)
180: {
181: struct ww *w = selwin;
182: int r, c;
183:
184: if ((wwavailmodes & WWM_REV) == 0)
185: return;
186: if (row2 < row1 || row2 == row1 && col2 < col1) {
187: r = row1;
188: c = col1;
189: row1 = row2;
190: col1 = col2;
191: row2 = r;
192: col2 = c;
193: }
194: c = col1;
195: for (r = row1; r < row2; r++) {
196: yank_highlight_line(r, c, w->ww_b.r);
197: c = w->ww_b.l;
198: }
199: yank_highlight_line(r, c, col2);
200: }
201:
202: yank_highlight_line(r, c, cend)
203: {
204: struct ww *w = selwin;
205: char *win;
206:
207: if (r < w->ww_i.t || r >= w->ww_i.b)
208: return;
209: if (c < w->ww_i.l)
210: c = w->ww_i.l;
211: if (cend >= w->ww_i.r)
212: cend = w->ww_i.r;
213: for (win = w->ww_win[r] + c; c < cend; c++, win++) {
214: *win ^= WWM_REV;
215: if (wwsmap[r][c] == w->ww_index) {
216: if (*win == 0)
217: w->ww_nvis[r]++;
218: else if (*win == WWM_REV)
219: w->ww_nvis[r]--;
220: wwns[r][c].c_m ^= WWM_REV;
221: wwtouched[r] |= WWU_TOUCHED;
222: }
223: }
224: }
225:
226: unyank()
227: {
228: struct yb *yp, *yq;
229:
230: for (yp = yb_head; yp; yp = yq) {
231: yq = yp->link;
232: str_free(yp->line);
233: free((char *) yp);
234: }
235: yb_head = yb_tail = 0;
236: }
237:
238: yank_line(r, c, cend)
239: {
240: struct yb *yp;
241: int nl = 0;
242: int n;
243: union ww_char *bp;
244: char *cp;
245:
246: if (c == cend)
247: return;
248: if ((yp = (struct yb *) malloc(sizeof *yp)) == 0)
249: return;
250: yp->link = 0;
251: nl = cend == selwin->ww_b.r;
252: bp = selwin->ww_buf[r];
253: for (cend--; cend >= c; cend--)
254: if (bp[cend].c_c != ' ')
255: break;
256: yp->length = n = cend - c + 1;
257: if (nl)
258: yp->length++;
259: yp->line = str_alloc(yp->length + 1);
260: for (bp += c, cp = yp->line; --n >= 0;)
261: *cp++ = bp++->c_c;
262: if (nl)
263: *cp++ = '\n';
264: *cp = 0;
265: if (yb_head)
266: yb_tail = yb_tail->link = yp;
267: else
268: yb_head = yb_tail = yp;
269: }
270:
271: c_put()
272: {
273: struct yb *yp;
274:
275: for (yp = yb_head; yp; yp = yp->link)
276: (void) write(selwin->ww_pty, yp->line, yp->length);
277: }