Commit | Line | Data |
---|---|---|
7c1c9e39 | 1 | #ifndef lint |
f2a77fe1 | 2 | static char *sccsid = "@(#)wwadd.c 3.5 83/09/15"; |
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 | 37 | for (; i < w1->ww_i.b; i++, touched++) { |
f2a77fe1 EW |
38 | int j = w1->ww_i.l; |
39 | register char *win = &w1->ww_win[i][j]; | |
40 | register char *smap = &wwsmap[i][j]; | |
41 | register union ww_char *ns = &wwns[i][j]; | |
42 | register union ww_char *buf = &w1->ww_buf[i][j]; | |
7c1c9e39 | 43 | |
f2a77fe1 | 44 | for (; j < w1->ww_i.r; j++) { |
7c1c9e39 | 45 | if ((*win & (WWM_GLS|WWM_COV)) == 0) { |
861cd1ed | 46 | *touched = 1; |
7c1c9e39 EW |
47 | *smap++ = w1->ww_index; |
48 | ns++->c_w = buf++->c_w | |
49 | ^ *win++ << WWC_MSHIFT; | |
50 | } else { | |
51 | smap++; | |
52 | ns++; | |
53 | win++; | |
54 | buf++; | |
55 | } | |
56 | } | |
57 | } | |
58 | } | |
59 | } |