Commit | Line | Data |
---|---|---|
fe3db729 | 1 | #ifndef lint |
19f9784c | 2 | static char *sccsid = "@(#)wwwrite.c 3.10 83/09/14"; |
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; | |
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 | } |