Commit | Line | Data |
---|---|---|
7c1c9e39 | 1 | #ifndef lint |
19f9784c | 2 | static char *sccsid = "@(#)wwadd.c 3.4 83/09/14"; |
7c1c9e39 EW |
3 | #endif |
4 | ||
5 | #include "ww.h" | |
6 | ||
7 | /* | |
8 | * Stick w1 behind w2 | |
9 | * W1 should have an empty ww_cov map. | |
10 | */ | |
11 | wwadd(w1, w2) | |
12 | register struct ww *w1, *w2; | |
13 | { | |
14 | if (w1->ww_forw != 0 || w1->ww_back != 0) | |
19f9784c EW |
15 | return; /* sanity */ |
16 | ||
7c1c9e39 EW |
17 | w1->ww_order = w2->ww_order + 1; |
18 | w1->ww_back = w2; | |
19 | w1->ww_forw = w2->ww_forw; | |
20 | w2->ww_forw->ww_back = w1; | |
21 | w2->ww_forw = w1; | |
19f9784c | 22 | |
7c1c9e39 EW |
23 | { |
24 | register struct ww *wp; | |
25 | ||
26 | for (wp = w2; wp != &wwhead; wp = wp->ww_back) | |
27 | wwcover(wp, w1); | |
28 | for (wp = w1->ww_forw; wp != &wwhead; wp = wp->ww_forw) { | |
29 | wp->ww_order++; | |
30 | wwcover(w1, wp); | |
31 | } | |
32 | } | |
33 | { | |
19f9784c | 34 | int i = w1->ww_i.t; |
861cd1ed | 35 | char *touched = &wwtouched[i]; |
7c1c9e39 | 36 | |
19f9784c EW |
37 | for (; i < w1->ww_i.b; i++, touched++) { |
38 | int j = w1->ww_i.nc; | |
39 | register char *win = &w1->ww_win[i - w1->ww_w.t] | |
40 | [w1->ww_i.l - w1->ww_w.l]; | |
41 | register char *smap = &wwsmap[i][w1->ww_i.l]; | |
42 | register union ww_char *ns = &wwns[i][w1->ww_i.l]; | |
43 | register union ww_char *buf | |
44 | = &w1->ww_buf[w1->ww_scroll + i - w1->ww_w.t] | |
45 | [w1->ww_i.l - w1->ww_w.l]; | |
7c1c9e39 | 46 | |
861cd1ed | 47 | while (--j >= 0) { |
7c1c9e39 | 48 | if ((*win & (WWM_GLS|WWM_COV)) == 0) { |
861cd1ed | 49 | *touched = 1; |
7c1c9e39 EW |
50 | *smap++ = w1->ww_index; |
51 | ns++->c_w = buf++->c_w | |
52 | ^ *win++ << WWC_MSHIFT; | |
53 | } else { | |
54 | smap++; | |
55 | ns++; | |
56 | win++; | |
57 | buf++; | |
58 | } | |
59 | } | |
60 | } | |
61 | } | |
62 | } |