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