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