113984Sedward #ifndef lint 2*14987Sedward static char *sccsid = "@(#)wwlabel.c 3.7 83/09/15"; 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 { 1714415Sedward int i; 1814415Sedward register j; 1914172Sedward register char *p; 2014415Sedward register char *win; 2114415Sedward register union ww_char *buf; 2214415Sedward register union ww_char *ns; 2314591Sedward register char *fmap; 2414663Sedward char *touched; 2513984Sedward 2614773Sedward if (f->ww_fmap == 0) 2714858Sedward return; 2814773Sedward 29*14987Sedward i = w->ww_w.t - 1; 30*14987Sedward if (i < f->ww_i.t || i >= f->ww_i.b) 3114858Sedward return; 32*14987Sedward j = w->ww_i.l + where; 3314773Sedward win = &f->ww_win[i][j]; 34*14987Sedward buf = &f->ww_buf[i][j]; 3514773Sedward fmap = &f->ww_fmap[i][j]; 3614773Sedward 3714415Sedward ns = &wwns[i][j]; 3814663Sedward touched = &wwtouched[i]; 3914773Sedward 40*14987Sedward j = MIN(w->ww_i.r, f->ww_i.r) - j; 4114415Sedward for (; j > 0 && *l;) 4214591Sedward for (p = unctrl(*l++); j > 0 && *p; j--) { 4314415Sedward /* can't label if not already framed */ 4414591Sedward if (*win & WWM_GLS) { 4514415Sedward p++; 4614415Sedward buf++; 4714415Sedward ns++; 4814415Sedward win++; 4914591Sedward fmap++; 5014415Sedward } else if (*win & WWM_COV) { 5114415Sedward buf++->c_w = mode << WWC_MSHIFT | *p++; 5214591Sedward *fmap++ |= WWF_LABEL; 5314415Sedward ns++; 5414415Sedward win++; 5514591Sedward } else { 5614663Sedward *touched = 1; 5714415Sedward ns++->c_w = (buf++->c_w 5814415Sedward = mode << WWC_MSHIFT | *p++) 5914415Sedward ^ *win++ << WWC_MSHIFT; 6014591Sedward *fmap++ |= WWF_LABEL; 6114591Sedward } 6214415Sedward } 6313984Sedward } 64