113984Sedward #ifndef lint 2*16309Sedward static char *sccsid = "@(#)wwlabel.c 3.11 84/04/08"; 313984Sedward #endif 413984Sedward 513984Sedward #include "ww.h" 6*16309Sedward #include "char.h" 713984Sedward 814415Sedward /* 914415Sedward * Label window w on f, 1014415Sedward * at 1 line above w and 'where' columns from it's left edge. 1114415Sedward * Gross, but it works. 1214415Sedward */ 1314415Sedward wwlabel(w, f, where, l, mode) 1414591Sedward struct ww *w; 1514415Sedward struct ww *f; 1614415Sedward char *l; 1713984Sedward { 1815635Sedward int row; 1914415Sedward register j; 2015635Sedward int jj; 2114415Sedward register char *win; 2214415Sedward register union ww_char *buf; 2314415Sedward register union ww_char *ns; 2414591Sedward register char *fmap; 2515635Sedward register char *smap; 2615635Sedward char touched; 2715635Sedward char *p; 2813984Sedward 2914773Sedward if (f->ww_fmap == 0) 3014858Sedward return; 3114773Sedward 3215635Sedward row = w->ww_w.t - 1; 3315635Sedward if (row < f->ww_i.t || row >= f->ww_i.b) 3414858Sedward return; 3515635Sedward win = f->ww_win[row]; 3615635Sedward buf = f->ww_buf[row]; 3715635Sedward fmap = f->ww_fmap[row]; 3815635Sedward ns = wwns[row]; 3915635Sedward smap = wwsmap[row]; 4015635Sedward touched = wwtouched[row]; 4115635Sedward mode <<= WWC_MSHIFT; 4215635Sedward 4315635Sedward jj = MIN(w->ww_i.r, f->ww_i.r); 4414987Sedward j = w->ww_i.l + where; 4515635Sedward while (j < jj && *l) 4615635Sedward for (p = unctrl(*l++); j < jj && *p; j++, p++) { 4714415Sedward /* can't label if not already framed */ 4815635Sedward if (win[j] & WWM_GLS) 4915635Sedward continue; 5015635Sedward if (smap[j] != f->ww_index) 5115635Sedward buf[j].c_w = mode | *p; 5215635Sedward else { 5315635Sedward ns[j].c_w = (buf[j].c_w = mode | *p) 5415635Sedward ^ win[j] << WWC_MSHIFT; 5515654Sedward touched |= WWU_TOUCHED; 5614591Sedward } 5715635Sedward fmap[j] |= WWF_LABEL; 5814415Sedward } 5915635Sedward wwtouched[row] = touched; 6013984Sedward } 61