lastselwin, and restructured some code
[unix-history] / usr / src / usr.bin / window / wwwrite.c
CommitLineData
fe3db729 1#ifndef lint
86697c44 2static char *sccsid = "@(#)wwwrite.c 3.13 83/09/15";
fe3db729
EW
3#endif
4
5#include "ww.h"
6
fe3db729
EW
7wwwrite(w, p, n)
8register struct ww *w;
9register char *p;
2b269ee7 10int n;
fe3db729 11{
19f9784c 12 char hascursor;
fe3db729 13
39b49130
EW
14 wwnwrite++;
15 wwnwritec += n;
73218728
EW
16 if (hascursor = w->ww_hascursor)
17 wwcursor(w, 0);
19f9784c
EW
18 while (n > 0) {
19 if (w->ww_wstate == 0 && !ISCTRL(*p)) {
20 register i;
19f9784c
EW
21 register union ww_char *bp;
22 union ww_char *bq;
f2a77fe1 23 int col;
19f9784c
EW
24
25 if (w->ww_insert) {
26 n--;
f2a77fe1 27 wwinschar(w, w->ww_cur.r, w->ww_cur.c,
19f9784c
EW
28 *p++ | w->ww_modes << WWC_MSHIFT);
29 goto right;
30 }
31
f2a77fe1
EW
32 bp = bq = &w->ww_buf[w->ww_cur.r][w->ww_cur.c];
33 if ((i = w->ww_b.r - w->ww_cur.c) > n)
19f9784c
EW
34 i = n;
35 while (--i >= 0 && !ISCTRL(*p))
36 bp++->c_w = *p++ | w->ww_modes << WWC_MSHIFT;
f2a77fe1 37
19f9784c
EW
38 i = bp - bq;
39 n -= i;
f2a77fe1
EW
40 col = w->ww_cur.c;
41 w->ww_cur.c += i;
19f9784c 42 bp = bq;
f2a77fe1
EW
43 if (col < w->ww_i.l) {
44 /* use col as a temporary */
45 col = w->ww_i.l - col;
46 bp += col;
47 i -= col;
48 col = w->ww_i.l;
19f9784c 49 }
f2a77fe1
EW
50 if (i > w->ww_i.r - col)
51 i = w->ww_i.r - col;
52
53 if (w->ww_cur.r >= w->ww_i.t && w->ww_cur.r < w->ww_i.b)
54 {
2b269ee7
EW
55 register union ww_char *ns;
56 register char *smap;
57 register char *win;
58 char *touched;
bb05dfb5 59
f2a77fe1
EW
60 win = &w->ww_win[w->ww_cur.r][col];
61 smap = &wwsmap[w->ww_cur.r][col];
62 ns = &wwns[w->ww_cur.r][col];
63 touched = &wwtouched[w->ww_cur.r];
19f9784c 64 while (--i >= 0)
2b269ee7
EW
65 if (*smap++ == w->ww_index) {
66 *touched = 1;
67 ns++->c_w = bp++->c_w
68 ^ *win++ << WWC_MSHIFT;
69 } else {
70 ns++;
71 bp++;
72 win++;
30647f51 73 }
fe3db729 74 }
f2a77fe1
EW
75 if (w->ww_cur.c >= w->ww_w.r) {
76 w->ww_cur.c = w->ww_w.l;
19f9784c
EW
77 goto lf;
78 }
79 continue;
80 }
81 n--;
82 switch (w->ww_wstate) {
83 case 0:
84 switch (*p++) {
fe3db729 85 case '\n':
bb05dfb5 86 if (w->ww_mapnl)
f2a77fe1 87 w->ww_cur.c = w->ww_w.l;
bb05dfb5 88 lf:
f2a77fe1
EW
89 if (++w->ww_cur.r >= w->ww_w.b) {
90 w->ww_cur.r = w->ww_w.b - 1;
86697c44
EW
91 if (w->ww_w.b < w->ww_b.b) {
92 (void) wwscroll1(w, w->ww_i.t,
93 w->ww_i.b, 1, 0);
94 w->ww_buf++;
95 w->ww_b.t--;
96 w->ww_b.b--;
97 } else
f2a77fe1 98 wwdelline(w, w->ww_b.t);
bb05dfb5 99 }
fe3db729
EW
100 break;
101 case '\t':
f2a77fe1
EW
102 w->ww_cur.c +=
103 8 - (w->ww_cur.c - w->ww_w.l & 7);
104 if (w->ww_cur.c >= w->ww_w.r) {
105 w->ww_cur.c = w->ww_w.l;
2b269ee7
EW
106 goto lf;
107 }
bb05dfb5 108 break;
fe3db729 109 case '\b':
f2a77fe1
EW
110 if (--w->ww_cur.c < w->ww_w.l) {
111 w->ww_cur.c = w->ww_w.r - 1;
b0d4d9e2
EW
112 goto up;
113 }
bb05dfb5 114 break;
fe3db729 115 case '\r':
f2a77fe1 116 w->ww_cur.c = w->ww_w.l;
bb05dfb5 117 break;
fe3db729 118 case CTRL(g):
bb05dfb5 119 wwbell();
fe3db729
EW
120 break;
121 case CTRL([):
122 w->ww_wstate = 1;
123 break;
124 }
125 break;
126 case 1:
127 w->ww_wstate = 0;
19f9784c 128 switch (*p++) {
fe3db729
EW
129 case '@':
130 w->ww_insert = 1;
131 break;
132 case 'A':
b0d4d9e2 133 up:
f2a77fe1
EW
134 if (--w->ww_cur.r < w->ww_w.t) {
135 w->ww_cur.r = w->ww_w.t;
86697c44
EW
136 if (w->ww_w.t > w->ww_b.t) {
137 (void) wwscroll1(w, w->ww_i.t,
138 w->ww_i.b, -1, 0);
139 w->ww_buf--;
140 w->ww_b.t++;
141 w->ww_b.b++;
142 } else
f2a77fe1 143 wwinsline(w, w->ww_b.t);
b0d4d9e2 144 }
fe3db729
EW
145 break;
146 case 'B':
bb05dfb5 147 goto lf;
fe3db729 148 case 'C':
f2a77fe1
EW
149 right:
150 if (++w->ww_cur.c >= w->ww_w.r) {
151 w->ww_cur.c = w->ww_w.l;
152 goto lf;
153 }
154 break;
fe3db729 155 case 'E':
215eb00f 156 w->ww_buf -= w->ww_w.t - w->ww_b.t;
f2a77fe1
EW
157 w->ww_b.t = w->ww_w.t;
158 w->ww_b.b = w->ww_b.t + w->ww_b.nr;
159 w->ww_cur.r = w->ww_w.t;
160 w->ww_cur.c = w->ww_w.l;
161 wwclreos(w, w->ww_w.t, w->ww_w.l);
fe3db729
EW
162 break;
163 case 'H':
f2a77fe1
EW
164 w->ww_cur.r = w->ww_w.t;
165 w->ww_cur.c = w->ww_w.l;
fe3db729
EW
166 break;
167 case 'J':
f2a77fe1 168 wwclreos(w, w->ww_cur.r, w->ww_cur.c);
fe3db729
EW
169 break;
170 case 'K':
f2a77fe1 171 wwclreol(w, w->ww_cur.r, w->ww_cur.c);
fe3db729
EW
172 break;
173 case 'L':
f2a77fe1 174 wwinsline(w, w->ww_cur.r);
fe3db729
EW
175 break;
176 case 'M':
f2a77fe1 177 wwdelline(w, w->ww_cur.r);
fe3db729
EW
178 break;
179 case 'N':
f2a77fe1 180 wwdelchar(w, w->ww_cur.r, w->ww_cur.c);
fe3db729
EW
181 break;
182 case 'O':
183 w->ww_insert = 0;
184 break;
185 case 'Y':
186 w->ww_wstate = 2;
187 break;
7d77e730
EW
188 case 'p':
189 w->ww_modes |= WWM_REV;
190 break;
191 case 'q':
192 w->ww_modes &= ~WWM_REV;
193 break;
194 case 'r':
195 w->ww_modes |= WWM_UL;
196 break;
197 case 's':
198 w->ww_modes &= ~WWM_UL;
199 break;
fe3db729
EW
200 }
201 break;
202 case 2:
f2a77fe1
EW
203 w->ww_cur.r = w->ww_w.t + (*p++ - ' ') % w->ww_w.nr;
204 w->ww_wstate = 3;
fe3db729
EW
205 break;
206 case 3:
f2a77fe1 207 w->ww_cur.c = w->ww_w.l + (*p++ - ' ') % w->ww_w.nc;
fe3db729
EW
208 w->ww_wstate = 0;
209 break;
210 }
211 }
73218728
EW
212 if (hascursor)
213 wwcursor(w, 1);
03e75950 214 return 0;
fe3db729 215}