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