113984Sedward #ifndef lint 2*15635Sedward static char *sccsid = "@(#)wwlabel.c 3.9 83/12/02"; 313984Sedward #endif 413984Sedward 513984Sedward #include "ww.h" 613984Sedward 714415Sedward /* 814415Sedward * Label window w on f, 914415Sedward * at 1 line above w and 'where' columns from it's left edge. 1014415Sedward * Gross, but it works. 1114415Sedward */ 1214415Sedward wwlabel(w, f, where, l, mode) 1314591Sedward struct ww *w; 1414415Sedward struct ww *f; 1514415Sedward char *l; 1613984Sedward { 17*15635Sedward int row; 1814415Sedward register j; 19*15635Sedward int jj; 2014415Sedward register char *win; 2114415Sedward register union ww_char *buf; 2214415Sedward register union ww_char *ns; 2314591Sedward register char *fmap; 24*15635Sedward register char *smap; 25*15635Sedward char touched; 26*15635Sedward char *p; 2713984Sedward 2814773Sedward if (f->ww_fmap == 0) 2914858Sedward return; 3014773Sedward 31*15635Sedward row = w->ww_w.t - 1; 32*15635Sedward if (row < f->ww_i.t || row >= f->ww_i.b) 3314858Sedward return; 34*15635Sedward win = f->ww_win[row]; 35*15635Sedward buf = f->ww_buf[row]; 36*15635Sedward fmap = f->ww_fmap[row]; 37*15635Sedward ns = wwns[row]; 38*15635Sedward smap = wwsmap[row]; 39*15635Sedward touched = wwtouched[row]; 40*15635Sedward mode <<= WWC_MSHIFT; 41*15635Sedward 42*15635Sedward jj = MIN(w->ww_i.r, f->ww_i.r); 4314987Sedward j = w->ww_i.l + where; 44*15635Sedward while (j < jj && *l) 45*15635Sedward for (p = unctrl(*l++); j < jj && *p; j++, p++) { 4614415Sedward /* can't label if not already framed */ 47*15635Sedward if (win[j] & WWM_GLS) 48*15635Sedward continue; 49*15635Sedward if (smap[j] != f->ww_index) 50*15635Sedward buf[j].c_w = mode | *p; 51*15635Sedward else { 52*15635Sedward ns[j].c_w = (buf[j].c_w = mode | *p) 53*15635Sedward ^ win[j] << WWC_MSHIFT; 54*15635Sedward touched = 1; 5514591Sedward } 56*15635Sedward fmap[j] |= WWF_LABEL; 5714415Sedward } 58*15635Sedward wwtouched[row] = touched; 5913984Sedward } 60