Commit | Line | Data |
---|---|---|
fe3db729 | 1 | #ifndef lint |
bb05dfb5 | 2 | static char *sccsid = "@(#)wwwrite.c 2.1.1.1 83/08/09"; |
fe3db729 EW |
3 | #endif |
4 | ||
5 | #include "ww.h" | |
6 | ||
39b49130 EW |
7 | int wwnwrite; |
8 | int wwnwritec; | |
fe3db729 EW |
9 | |
10 | wwwrite(w, p, n) | |
11 | register struct ww *w; | |
12 | register char *p; | |
13 | register 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 | } |