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