Commit | Line | Data |
---|---|---|
fe3db729 | 1 | #ifndef lint |
86697c44 | 2 | static char *sccsid = "@(#)wwwrite.c 3.13 83/09/15"; |
fe3db729 EW |
3 | #endif |
4 | ||
5 | #include "ww.h" | |
6 | ||
fe3db729 EW |
7 | wwwrite(w, p, n) |
8 | register struct ww *w; | |
9 | register char *p; | |
2b269ee7 | 10 | int 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 | } |