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