help updated for 'buffer' and new argument to 'window'
[unix-history] / usr / src / usr.bin / window / wwwrite.c
CommitLineData
fe3db729 1#ifndef lint
703c37ce 2static char *sccsid = "@(#)wwwrite.c 3.8 83/08/23";
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 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}