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