Commit | Line | Data |
---|---|---|
fe3db729 | 1 | #ifndef lint |
00b2d63f | 2 | static char *sccsid = "@(#)wwwrite.c 3.17 84/01/16"; |
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; |
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 | } |