Forgot to fix ww_buf after ^[E.
[unix-history] / usr / src / usr.bin / window / wwinschar.c
CommitLineData
bc28423e 1#ifndef lint
f2a77fe1 2static char *sccsid = "@(#)wwinschar.c 3.8 83/09/15";
bc28423e
EW
3#endif
4
5#include "ww.h"
e908bfac 6#include "tt.h"
bc28423e 7
f2a77fe1 8wwinschar(w, row, col, c)
bc28423e 9register struct ww *w;
14f251df 10short c;
bc28423e 11{
14f251df 12 register i;
14f251df 13 int nvis;
bc28423e 14
19f9784c
EW
15 /*
16 * First, shift the line.
17 */
14f251df
EW
18 {
19 register union ww_char *p, *q;
20
f2a77fe1 21 p = &w->ww_buf[row][w->ww_b.r];
14f251df 22 q = p - 1;
f2a77fe1 23 for (i = w->ww_b.r - col; --i > 0;)
14f251df
EW
24 *--p = *--q;
25 q->c_w = c;
26 }
19f9784c
EW
27
28 /*
29 * If can't see it, just return.
30 */
f2a77fe1
EW
31 if (row < w->ww_i.t || row >= w->ww_i.b
32 || w->ww_i.r <= 0 || w->ww_i.r <= col)
14f251df 33 return;
19f9784c 34
f2a77fe1
EW
35 if (col < w->ww_i.l)
36 col = w->ww_i.l;
19f9784c
EW
37
38 /*
39 * Now find out how much is actually changed, and fix wwns.
40 */
14f251df
EW
41 {
42 register union ww_char *buf;
43 register char *win;
44 register union ww_char *ns;
45 register char *smap;
861cd1ed 46 char *touched;
14f251df
EW
47
48 nvis = 0;
f2a77fe1
EW
49 smap = &wwsmap[row][col];
50 for (i = w->ww_i.r - col; i > 0 && *smap++ != w->ww_index; i--)
51 col++;
14f251df
EW
52 if (i <= 0)
53 return;
f2a77fe1 54 buf = &w->ww_buf[row][col];
14f251df 55 win = &w->ww_win[row][col];
f2a77fe1
EW
56 ns = &wwns[row][col];
57 touched = &wwtouched[row];
14f251df
EW
58 c = buf->c_w ^ *win << WWC_MSHIFT;
59 for (; --i >= 0;) {
60 if (*win) {
61 if ((*win & (WWM_COV|WWM_GLS)) != 0) {
62 ns++;
63 buf++;
861cd1ed
EW
64 } else {
65 *touched = 1;
14f251df
EW
66 ns++->c_w = buf++->c_w
67 ^ *win++ << WWC_MSHIFT;
861cd1ed 68 }
bc28423e 69 } else {
861cd1ed 70 *touched = 1;
14f251df
EW
71 *ns++ = *buf++;
72 win++;
73 nvis++;
bc28423e
EW
74 }
75 }
bc28423e 76 }
19f9784c
EW
77
78 /*
79 * Can/Should we use delete character?
80 */
f2a77fe1 81 if (tt.tt_setinsert != 0 && nvis > (wwncol - col) / 2) {
14f251df
EW
82 register union ww_char *p, *q;
83
84 (*tt.tt_setinsert)(1);
f2a77fe1 85 (*tt.tt_move)(row, col);
14f251df
EW
86 (*tt.tt_setmodes)(c >> WWC_MSHIFT);
87 (*tt.tt_putc)(c & WWC_CMASK);
88 (*tt.tt_setinsert)(0);
89
f2a77fe1 90 p = &wwos[row][wwncol];
14f251df 91 q = p - 1;
f2a77fe1 92 for (i = wwncol - col; --i > 0;)
14f251df
EW
93 *--p = *--q;
94 q->c_w = c;
95 }
bc28423e 96}