Commit | Line | Data |
---|---|---|
bc28423e | 1 | #ifndef lint |
5e785082 | 2 | static char *sccsid = "@(#)wwinschar.c 3.6 83/08/17"; |
bc28423e EW |
3 | #endif |
4 | ||
5 | #include "ww.h" | |
e908bfac | 6 | #include "tt.h" |
bc28423e | 7 | |
14f251df | 8 | wwinschar(w, line, col, c) |
bc28423e | 9 | register struct ww *w; |
14f251df | 10 | short c; |
bc28423e | 11 | { |
14f251df EW |
12 | register i; |
13 | int row = line - w->ww_scroll; | |
14 | int nvis; | |
bc28423e | 15 | |
14f251df EW |
16 | { |
17 | register union ww_char *p, *q; | |
18 | ||
19 | p = &w->ww_buf[line][w->ww_w.nc]; | |
20 | q = p - 1; | |
21 | for (i = w->ww_w.nc - col - 1; --i >= 0;) | |
22 | *--p = *--q; | |
23 | q->c_w = c; | |
24 | } | |
25 | if (row < 0 || row >= w->ww_w.nr) | |
26 | return; | |
27 | { | |
28 | register union ww_char *buf; | |
29 | register char *win; | |
30 | register union ww_char *ns; | |
31 | register char *smap; | |
861cd1ed | 32 | char *touched; |
14f251df EW |
33 | |
34 | nvis = 0; | |
35 | smap = &wwsmap[row + w->ww_w.t][col + w->ww_w.l]; | |
36 | for (i = w->ww_w.nc - col; i > 0; i--) | |
37 | if (*smap == w->ww_index) | |
38 | break; | |
39 | else { | |
40 | smap++; | |
41 | col++; | |
42 | } | |
43 | if (i <= 0) | |
44 | return; | |
45 | buf = &w->ww_buf[line][col]; | |
46 | win = &w->ww_win[row][col]; | |
47 | ns = &wwns[row + w->ww_w.t][col + w->ww_w.l]; | |
861cd1ed | 48 | touched = &wwtouched[row + w->ww_w.t]; |
14f251df EW |
49 | c = buf->c_w ^ *win << WWC_MSHIFT; |
50 | for (; --i >= 0;) { | |
51 | if (*win) { | |
52 | if ((*win & (WWM_COV|WWM_GLS)) != 0) { | |
53 | ns++; | |
54 | buf++; | |
861cd1ed EW |
55 | } else { |
56 | *touched = 1; | |
14f251df EW |
57 | ns++->c_w = buf++->c_w |
58 | ^ *win++ << WWC_MSHIFT; | |
861cd1ed | 59 | } |
bc28423e | 60 | } else { |
861cd1ed | 61 | *touched = 1; |
14f251df EW |
62 | *ns++ = *buf++; |
63 | win++; | |
64 | nvis++; | |
bc28423e EW |
65 | } |
66 | } | |
bc28423e | 67 | } |
14f251df EW |
68 | col += w->ww_w.l; |
69 | row += w->ww_w.t; | |
5e785082 EW |
70 | if (tt.tt_setinsert != 0 && nvis > (wwncol - col) / 2 |
71 | && col != wwncol - 1) { | |
14f251df EW |
72 | register union ww_char *p, *q; |
73 | ||
74 | (*tt.tt_setinsert)(1); | |
75 | (*tt.tt_move)(row, col); | |
76 | (*tt.tt_setmodes)(c >> WWC_MSHIFT); | |
77 | (*tt.tt_putc)(c & WWC_CMASK); | |
78 | (*tt.tt_setinsert)(0); | |
79 | ||
80 | p = &wwos[row][wwncol]; | |
81 | q = p - 1; | |
82 | for (i = wwncol - col - 1; --i >= 0;) | |
83 | *--p = *--q; | |
84 | q->c_w = c; | |
85 | } | |
bc28423e | 86 | } |