redo contrib notice
[unix-history] / usr / src / usr.bin / window / wwlabel.c
index 381b17f..bbf5301 100644 (file)
@@ -1,26 +1,67 @@
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved.
+ *
+ * %sccs.include.redist.c%
+ */
+
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwlabel.c   1.3 83/07/22";
-#endif
+static char sccsid[] = "@(#)wwlabel.c  3.16 (Berkeley) %G%";
+#endif /* not lint */
 
 #include "ww.h"
 
 #include "ww.h"
+#include "char.h"
 
 
-wwlabel(w, l, mode)
-register struct ww *w;
-register char *l;
+/*
+ * Label window w on f,
+ * at 1 line above w and 'where' columns from it's left edge.
+ * Gross, but it works.
+ */
+wwlabel(w, f, where, l, mode)
+struct ww *w;
+struct ww *f;
+char *l;
 {
 {
-       register i;
-       char ulc, top, urc, left, right, llc, bottom, lrc;
-       char framed;
+       int row;
+       register j;
+       int jj;
+       register char *win;
+       register union ww_char *buf;
+       register union ww_char *ns;
+       register char *fmap;
+       register char *smap;
+       char touched;
+       char *p;
+
+       if (f->ww_fmap == 0)
+               return;
+
+       row = w->ww_w.t - 1;
+       if (row < f->ww_i.t || row >= f->ww_i.b)
+               return;
+       win = f->ww_win[row];
+       buf = f->ww_buf[row];
+       fmap = f->ww_fmap[row];
+       ns = wwns[row];
+       smap = wwsmap[row];
+       touched = wwtouched[row];
+       mode <<= WWC_MSHIFT;
 
 
-       if (!(framed = w->ww_i.nrow < w->ww_o.nrow)) {
-               Wgetframe(&ulc, &top, &urc, &left, &right, &llc, &bottom, &lrc);
-               w->ww_i.nrow--;
-               w->ww_i.row++;
-       }
-       Wauxcursor(w->ww_win, 0, 1);
-       for (i = w->ww_o.ncol - 2; i > 0 && *l; i--, l++)
-               Waputc(*l, mode, w->ww_win);
-       if (!framed)
-               for (; i > 0; i--)
-                       Waputc(top, 0, w->ww_win);
+       jj = MIN(w->ww_i.r, f->ww_i.r);
+       j = w->ww_i.l + where;
+       while (j < jj && *l)
+               for (p = unctrl(*l++); j < jj && *p; j++, p++) {
+                       /* can't label if not already framed */
+                       if (win[j] & WWM_GLS)
+                               continue;
+                       if (smap[j] != f->ww_index)
+                               buf[j].c_w = mode | *p;
+                       else {
+                               ns[j].c_w = (buf[j].c_w = mode | *p)
+                                               ^ win[j] << WWC_MSHIFT;
+                               touched |= WWU_TOUCHED;
+                       }
+                       fmap[j] |= WWF_LABEL;
+               }
+       wwtouched[row] = touched;
 }
 }