118736Sedward /* 2*62479Sbostic * Copyright (c) 1983, 1993 3*62479Sbostic * The Regents of the University of California. All rights reserved. 433514Sbostic * 542954Sbostic * This code is derived from software contributed to Berkeley by 642954Sbostic * Edward Wang at The University of California, Berkeley. 742954Sbostic * 842835Sbostic * %sccs.include.redist.c% 918736Sedward */ 1018736Sedward 1133514Sbostic #ifndef lint 12*62479Sbostic static char sccsid[] = "@(#)wwlabel.c 8.1 (Berkeley) 06/06/93"; 1333514Sbostic #endif /* not lint */ 1433514Sbostic 1513984Sedward #include "ww.h" 1616309Sedward #include "char.h" 1713984Sedward 1814415Sedward /* 1914415Sedward * Label window w on f, 2014415Sedward * at 1 line above w and 'where' columns from it's left edge. 2114415Sedward * Gross, but it works. 2214415Sedward */ 2314415Sedward wwlabel(w, f, where, l, mode) 2414591Sedward struct ww *w; 2514415Sedward struct ww *f; 2614415Sedward char *l; 2713984Sedward { 2815635Sedward int row; 2914415Sedward register j; 3015635Sedward int jj; 3114415Sedward register char *win; 3214415Sedward register union ww_char *buf; 3314415Sedward register union ww_char *ns; 3414591Sedward register char *fmap; 3515635Sedward register char *smap; 3615635Sedward char touched; 3715635Sedward char *p; 3813984Sedward 3914773Sedward if (f->ww_fmap == 0) 4014858Sedward return; 4114773Sedward 4215635Sedward row = w->ww_w.t - 1; 4315635Sedward if (row < f->ww_i.t || row >= f->ww_i.b) 4414858Sedward return; 4515635Sedward win = f->ww_win[row]; 4615635Sedward buf = f->ww_buf[row]; 4715635Sedward fmap = f->ww_fmap[row]; 4815635Sedward ns = wwns[row]; 4915635Sedward smap = wwsmap[row]; 5015635Sedward touched = wwtouched[row]; 5115635Sedward mode <<= WWC_MSHIFT; 5215635Sedward 5315635Sedward jj = MIN(w->ww_i.r, f->ww_i.r); 5414987Sedward j = w->ww_i.l + where; 5515635Sedward while (j < jj && *l) 5615635Sedward for (p = unctrl(*l++); j < jj && *p; j++, p++) { 5714415Sedward /* can't label if not already framed */ 5815635Sedward if (win[j] & WWM_GLS) 5915635Sedward continue; 6015635Sedward if (smap[j] != f->ww_index) 6115635Sedward buf[j].c_w = mode | *p; 6215635Sedward else { 6315635Sedward ns[j].c_w = (buf[j].c_w = mode | *p) 6415635Sedward ^ win[j] << WWC_MSHIFT; 6515654Sedward touched |= WWU_TOUCHED; 6614591Sedward } 6715635Sedward fmap[j] |= WWF_LABEL; 6814415Sedward } 6915635Sedward wwtouched[row] = touched; 7013984Sedward } 71