in 'x' or 'i' mode, ask if mode of "." should be changed
[unix-history] / usr / src / usr.bin / window / wwwrite.c
CommitLineData
fe3db729 1#ifndef lint
bb05dfb5 2static char *sccsid = "@(#)wwwrite.c 2.1.1.1 83/08/09";
fe3db729
EW
3#endif
4
5#include "ww.h"
6
39b49130
EW
7int wwnwrite;
8int wwnwritec;
fe3db729
EW
9
10wwwrite(w, p, n)
11register struct ww *w;
12register char *p;
13register n;
14{
15 register char c;
bb05dfb5 16 int oldn = n;
fe3db729 17
bb05dfb5 18 if (w == 0)
fe3db729 19 return -1;
39b49130
EW
20 wwnwrite++;
21 wwnwritec += n;
bb05dfb5 22 while (--n >= 0) {
fe3db729
EW
23 c = *p++ & 0x7f;
24 switch (w->ww_wstate) {
25 case 0:
26 if (c >= ' ' && c < 0x7f) {
bb05dfb5
EW
27 register i, j, cc;
28
fe3db729 29 if (w->ww_insert)
bb05dfb5
EW
30 wwinschar(w, 1);
31 cc = w->ww_buf[w->ww_scroll + w->ww_cur.r]
32 [w->ww_cur.c].c_w = c;
33 i = wwcurrow(w);
34 j = wwcurcol(w);
35 if (wwsmap[i][j] == w->ww_index) {
36 cc = wwns[i][j].c_w = cc
37 ^ w->ww_win[w->ww_cur.r]
38 [w->ww_cur.c] << WWC_MSHIFT;
39 }
40 right:
41 if (++w->ww_cur.c >= w->ww_w.nc) {
42 w->ww_cur.c = 0;
43 goto lf;
44 }
fe3db729
EW
45 break;
46 }
47 switch (c) {
48 case '\n':
bb05dfb5
EW
49 if (w->ww_mapnl)
50 w->ww_cur.c = 0;
51 lf:
52 if (++w->ww_cur.r >= w->ww_w.nr) {
53 w->ww_cur.r = w->ww_w.nr - 1;
54 wwdelline(w, 0);
55 }
fe3db729
EW
56 break;
57 case '\t':
bb05dfb5
EW
58 w->ww_cur.c |= 7;
59 goto right;
60 break;
fe3db729 61 case '\b':
bb05dfb5
EW
62 if (--w->ww_cur.c < 0)
63 w->ww_cur.c = 0;
64 break;
fe3db729 65 case '\r':
bb05dfb5
EW
66 w->ww_cur.c = 0;
67 break;
fe3db729 68 case CTRL(g):
bb05dfb5 69 wwbell();
fe3db729
EW
70 break;
71 case CTRL([):
72 w->ww_wstate = 1;
73 break;
74 }
75 break;
76 case 1:
77 w->ww_wstate = 0;
78 switch (c) {
79 case '@':
80 w->ww_insert = 1;
81 break;
82 case 'A':
bb05dfb5
EW
83 if (--w->ww_cur.r < 0)
84 w->ww_cur.r = 0;
fe3db729
EW
85 break;
86 case 'B':
bb05dfb5 87 goto lf;
fe3db729 88 case 'C':
bb05dfb5 89 goto right;
fe3db729 90 case 'E':
bb05dfb5
EW
91 w->ww_cur.c = w->ww_cur.r = 0;
92 wwclreos(w);
fe3db729
EW
93 break;
94 case 'H':
bb05dfb5 95 w->ww_cur.c = w->ww_cur.r = 0;
fe3db729
EW
96 break;
97 case 'J':
bb05dfb5 98 wwclreos(w);
fe3db729
EW
99 break;
100 case 'K':
bb05dfb5
EW
101 wwclreol(w, w->ww_scroll + w->ww_cur.r,
102 w->ww_cur.c, 0);
fe3db729
EW
103 break;
104 case 'L':
bb05dfb5 105 wwinsline(w);
fe3db729
EW
106 break;
107 case 'M':
bb05dfb5 108 wwdelline(w, w->ww_scroll + w->ww_cur.r);
fe3db729
EW
109 break;
110 case 'N':
bb05dfb5 111 wwdelchar(w);
fe3db729
EW
112 break;
113 case 'O':
114 w->ww_insert = 0;
115 break;
116 case 'Y':
117 w->ww_wstate = 2;
118 break;
119 }
120 break;
121 case 2:
bb05dfb5 122 w->ww_cur.r = (c - ' ') % w->ww_w.nr;
fe3db729
EW
123 w->ww_wstate++;
124 break;
125 case 3:
bb05dfb5 126 w->ww_cur.c = (c - ' ') % w->ww_w.nc;
fe3db729
EW
127 w->ww_wstate = 0;
128 break;
129 }
130 }
bb05dfb5 131 return oldn - n;
fe3db729 132}