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