xref: /csrg-svn/usr.bin/window/wwlabel.c (revision 14415)
113984Sedward #ifndef lint
2*14415Sedward static	char *sccsid = "@(#)wwlabel.c	2.1.1.1 83/08/09";
313984Sedward #endif
413984Sedward 
513984Sedward #include "ww.h"
613984Sedward 
7*14415Sedward char **wwfmap;
8*14415Sedward #define U 1
9*14415Sedward #define R 2
10*14415Sedward #define D 4
11*14415Sedward #define L 8
12*14415Sedward 
13*14415Sedward /*
14*14415Sedward  * Label window w on f,
15*14415Sedward  * at 1 line above w and 'where' columns from it's left edge.
16*14415Sedward  * Gross, but it works.
17*14415Sedward  */
18*14415Sedward wwlabel(w, f, where, l, mode)
1913984Sedward register struct ww *w;
20*14415Sedward struct ww *f;
21*14415Sedward char *l;
2213984Sedward {
23*14415Sedward 	int i;
24*14415Sedward 	register j;
2514172Sedward 	register char *p;
26*14415Sedward 	register char *win;
27*14415Sedward 	register union ww_char *buf;
28*14415Sedward 	register union ww_char *ns;
29*14415Sedward 	char *fmap;
3013984Sedward 
31*14415Sedward 	if ((i = w->ww_w.t - 1 - f->ww_w.t) < 0)
3214172Sedward 		return -1;
33*14415Sedward 	j = w->ww_w.l + where;
34*14415Sedward 	j = MAX(j, f->ww_w.l);
35*14415Sedward 	win = &f->ww_win[i][j - f->ww_w.l];
36*14415Sedward 	buf = &f->ww_buf[w->ww_scroll + i][j - f->ww_w.l];
37*14415Sedward 	i += f->ww_w.t;
38*14415Sedward 	ns = &wwns[i][j];
39*14415Sedward 	fmap = &wwfmap[i][j];
40*14415Sedward 	j = MIN(w->ww_w.r, f->ww_w.r) - j;
41*14415Sedward 
42*14415Sedward 	for (; j > 0 && *l;)
43*14415Sedward 		for (p = unctrl(*l++); j > 0 && *p; j--, fmap++) {
44*14415Sedward 			/* can't label if not already framed */
45*14415Sedward 			if (*win & WWM_GLS || (*fmap & (U|D)) == (U|D)) {
46*14415Sedward 				p++;
47*14415Sedward 				buf++;
48*14415Sedward 				ns++;
49*14415Sedward 				win++;
50*14415Sedward 			} else if (*win & WWM_COV) {
51*14415Sedward 				buf++->c_w = mode << WWC_MSHIFT | *p++;
52*14415Sedward 				ns++;
53*14415Sedward 				win++;
54*14415Sedward 			} else
55*14415Sedward 				ns++->c_w = (buf++->c_w
56*14415Sedward 					= mode << WWC_MSHIFT | *p++)
57*14415Sedward 						^ *win++ << WWC_MSHIFT;
58*14415Sedward 		}
59*14415Sedward 
60*14415Sedward 	return 0;
6113984Sedward }
62