mile stone
authorEdward Wang <edward@ucbvax.Berkeley.EDU>
Wed, 10 Aug 1983 09:35:56 +0000 (01:35 -0800)
committerEdward Wang <edward@ucbvax.Berkeley.EDU>
Wed, 10 Aug 1983 09:35:56 +0000 (01:35 -0800)
SCCS-vsn: usr.bin/window/wwprintf.c 2.1.1.1
SCCS-vsn: usr.bin/window/cmd3.c 2.1.1.1
SCCS-vsn: usr.bin/window/wwgets.c 2.1.1.1
SCCS-vsn: usr.bin/window/wwclose.c 2.1.1.1
SCCS-vsn: usr.bin/window/wwframe.c 2.1.1.1
SCCS-vsn: usr.bin/window/wwlabel.c 2.1.1.1
SCCS-vsn: usr.bin/window/defs.h 2.1.1.1
SCCS-vsn: usr.bin/window/cmd4.c 2.1.1.1
SCCS-vsn: usr.bin/window/cmd5.c 2.1.1.1

usr/src/usr.bin/window/cmd3.c
usr/src/usr.bin/window/cmd4.c
usr/src/usr.bin/window/cmd5.c
usr/src/usr.bin/window/defs.h
usr/src/usr.bin/window/wwclose.c
usr/src/usr.bin/window/wwframe.c
usr/src/usr.bin/window/wwgets.c
usr/src/usr.bin/window/wwlabel.c
usr/src/usr.bin/window/wwprintf.c

index a7d818b..36c46cf 100644 (file)
@@ -1,65 +1,48 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)cmd3.c      2.1 83/07/30";
+static char *sccsid = "@(#)cmd3.c      2.1.1.1 83/08/09";
 #endif
 
 #include "defs.h"
 
 #endif
 
 #include "defs.h"
 
-struct ww *getwin();
-struct ww *openwin();
-char *strtime();
-
-doclose(w)
+c_close(w)
 register struct ww *w;
 {
        char didit = 0;
 register struct ww *w;
 {
        char didit = 0;
-       struct ww *w1;
+       register i;
 
        if (w != 0) {
 
        if (w != 0) {
-               if (w == selwin)
-                       setselwin(0);
-               wwclose(w);
+               closewin(w);
                didit++;
        } else {
                didit++;
        } else {
-               for (w = wwhead; w;) {
-                       if (w == cmdwin) {
-                               w = w->ww_next;
+               for (i = 0; i < NWINDOW; i++) {
+                       if ((w = window[i]) == 0)
                                continue;
                                continue;
-                       }
-                       w = (w1 = w)->ww_next;
-                       if (w1 == selwin)
-                               setselwin(0);
-                       if (w->ww_state == WW_HASPROC && w->ww_pid == 0) {
-                               wwprintf(cmdwin, "%d: pid == 0.  ",
-                                       w->ww_ident);
-                       } else {
-                               wwclose(w1);
-                               didit++;
-                       }
+                       closewin(w);            /* GROT */
+                       didit++;
                }
        }
        if (selwin == 0) {
                }
        }
        if (selwin == 0) {
-               for (w = wwhead; w && w == cmdwin; w = w->ww_next)
+               for (i = 0; i < NWINDOW && window[i] != 0; i++)
                        ;
                        ;
-               setselwin(w);
+               if (i < NWINDOW)
+                       setselwin(window[i]);
        }
        if (didit)
                reframe();
 }
 
        }
        if (didit)
                reframe();
 }
 
-/*
-doescape()
+closewin(w)
+register struct ww *w;
 {
 {
-       char buf[2];
-
-       wwputs("New escape character? ", cmdwin);
-       wwsetcursor(WCurRow(cmdwin->ww_win), WCurCol(cmdwin->ww_win));
-       while ((*buf = bgetc()) < 0)
-               bread();
-       buf[1] = 0;
-       setescape(buf);
-       wwputs("\r\n", cmdwin);
+       if (w == selwin)
+               setselwin((struct ww *)0);
+       if (w->ww_id >= 0 && w->ww_id < NWINDOW)
+               window[w->ww_id] = 0;
+       if (w->ww_label)
+               free(w->ww_label);
+       wwdelete(w);
+       wwclose(w);
 }
 }
-*/
 
 setescape(esc)
 register char *esc;
 
 setescape(esc)
 register char *esc;
@@ -73,22 +56,6 @@ register char *esc;
                escapec = *esc;
 }
 
                escapec = *esc;
 }
 
-/*
-dolabel()
-{
-       register struct ww *w;
-       char buf[30];
-       char *malloc();
-
-       if ((w = getwin()) == 0)
-               return;
-       wwprintf(cmdwin, "Label for window %d? ", w->ww_ident);
-       bgets(buf, sizeof buf, cmdwin);
-       setlabel(w, buf);
-       wwputs("\r\n", cmdwin);
-}
-*/
-
 setlabel(w, label)
 register struct ww *w;
 char *label;
 setlabel(w, label)
 register struct ww *w;
 char *label;
@@ -97,9 +64,8 @@ char *label;
 
        if (w->ww_label != 0)
                free(w->ww_label);
 
        if (w->ww_label != 0)
                free(w->ww_label);
-       w->ww_label = malloc(strlen(label) + 1);
-       strcpy(w->ww_label, label);
-       wwunframe(w);           /* cover up the old label */
-       wwframe(w);
-       labelwin(w);
+       if ((w->ww_label = malloc((unsigned)strlen(label) + 1)) == 0)
+               return -1;
+       (void) strcpy(w->ww_label, label);
+       return 0;
 }
 }
index 4e01586..9fbd986 100644 (file)
@@ -1,25 +1,27 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)cmd4.c      2.1 83/07/30";
+static char *sccsid = "@(#)cmd4.c      2.1.1.1 83/08/09";
 #endif
 
 #include "defs.h"
 
 #endif
 
 #include "defs.h"
 
-struct ww *getwin();
-struct ww *openwin();
-char *strtime();
-
-doshow()
+c_show()
 {
        register i;
        register struct ww *w = 0;
        char done_it = 0;
 
 {
        register i;
        register struct ww *w = 0;
        char done_it = 0;
 
-       for (i = 1; i < 10; i++) {
-               if ((w = wwfind(i)) == 0)
+       for (i = 0; i < NWINDOW; i++) {
+               if ((w = window[i]) == 0)
                        continue;
                done_it++;
                        continue;
                done_it++;
-               wwsetcurwin(w);
-               wwsetcursor(w->ww_o.row, w->ww_o.col + 1);
+               if (!terse && cmdwin->ww_order < framewin->ww_order) {
+                       wwdelete(cmdwin);
+                       wwadd(cmdwin, framewin);
+               }
+               wwdelete(w);
+               wwadd(w, framewin);
+               reframe();
+               wwsetcursor(w->ww_w.t - 1, w->ww_w.l + 2);
                for (;;) {
                        switch (bgetc()) {
                        case '\r':
                for (;;) {
                        switch (bgetc()) {
                        case '\r':
@@ -32,12 +34,12 @@ doshow()
                                bread();
                                continue;
                        default:
                                bread();
                                continue;
                        default:
-                               if (terse)
-                                       Ding();
-                               else
-                                       wwputs("\rType return to continue, escape to select.", cmdwin);
-                               wwsetcurwin(cmdwin);
-                               Ding();
+                               wwbell();
+                               if (!terse) {
+                                       (void) wwputs("\rType return to continue, escape to select.", cmdwin);
+                                       wwdelete(cmdwin);
+                                       wwadd(cmdwin, &wwhead);
+                               }
                                continue;
                        }
                        break;
                                continue;
                        }
                        break;
@@ -45,27 +47,26 @@ doshow()
        }
 out:
        if (!done_it) {
        }
 out:
        if (!done_it) {
-               if (terse)
-                       Ding();
-               else
-                       wwputs("No windows.  ", cmdwin);
+               error("No windows.");
        } else {
        } else {
-               wwsetcurwin(cmdwin);
-               if (!terse)
-                       wwputs("\r\n", cmdwin);
+               if (!terse) {
+                       wwdelete(cmdwin);
+                       wwadd(cmdwin, &wwhead);
+                       (void) wwputs("\r\n", cmdwin);
+               }
        }
 }
 
        }
 }
 
-docolon()
+c_colon()
 {
        char buf[512];
 
        if (terse)
 {
        char buf[512];
 
        if (terse)
-               Wunhide(cmdwin->ww_win);
-       wwputc(':', cmdwin);
+               wwadd(cmdwin, &wwhead);
+       (void) wwputc(':', cmdwin);
        bgets(buf, wwncol - 3, cmdwin);
        bgets(buf, wwncol - 3, cmdwin);
-       wwputs("\r\n", cmdwin);
+       (void) wwputs("\r\n", cmdwin);
        if (terse)
        if (terse)
-               Whide(cmdwin->ww_win);
+               wwdelete(cmdwin);
        dolongcmd(buf);
 }
        dolongcmd(buf);
 }
index 3f5ae71..dd600d8 100644 (file)
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)cmd5.c      2.1 83/07/30";
+static char *sccsid = "@(#)cmd5.c      2.1.1.1 83/08/09";
 #endif
 
 #include "defs.h"
 
 #endif
 
 #include "defs.h"
 
-struct ww *doopen();
-struct ww *idtowin();
-
-int lineno;                            /* current line number in source file */
-static char *argv[100];                        /* one line broken up into words */
-static int argc;
-static char insource;
-
-int s_window();
-int s_select();
-int s_escape();
-int s_label();
-int s_terse();
-int s_refresh();
-int s_source();
-int s_write();
-
-struct scmd {
-       char *s_name;                   /* name of command */
-       int s_lmin;                     /* minimum length to check */
-       int s_lmax;                     /* maximum length to check */
-       int s_amin;                     /* minimum argument */
-       int s_amax;                     /* maximum argument */
-       int (*s_func)();                /* the function */
-};
-static struct scmd scmd[] = {
-       "%",            1, 1, 0, 0, s_select,
-       "escape",       1, 0, 1, 1, s_escape,
-       "label",        1, 0, 2, 2, s_label,
-       "refresh",      1, 0, 1, 2, s_refresh,
-       "source",       1, 0, 1, 1, s_source,
-       "terse",        1, 0, 0, 1, s_terse,
-       "window",       1, 0, 4, 4, s_window,
-       "write",        2, 0, 2, 2, s_write,
-       0
-};
-
-dosource(filename)
-char *filename;
-{
-       register FILE *f;
-       char buf[BUFSIZ];
-
-       if ((f = fopen(filename, "r")) == 0)
-               return -1;
-       insource++;
-       beginerror(filename);
-       for (lineno = 1; fgets(buf, sizeof buf, f) != 0; lineno++)
-               dolongcmd(buf);
-       enderror();
-       insource = 0;
-       return 0;
-}
-
-dolongcmd(line)
-char *line;
-{
-       register struct scmd *sp;
-       register len;
-
-       makeargv(line);
-       if (argc == 0)
-               return;
-       for (sp = scmd; sp->s_name; sp++) {
-               len = strlen(*argv);
-               if (len < sp->s_lmin)
-                       continue;
-               if (!strncmp(*argv, sp->s_name, sp->s_lmax ? sp->s_lmax : len))
-                       break;
-       }
-       if (sp->s_name) {
-               if (sp->s_amin > argc - 1)
-                       error("Too few arguments.");
-               else if (sp->s_amax < argc - 1)
-                       error("Too many arguments.");
-               else
-                       (*sp->s_func)();
-       } else
-               error("%s: Unknown command.", *argv);
-}
-
-makeargv(p)
-register char *p;
-{
-       static char buf[BUFSIZ];
-       register char *q = buf, **pp = argv;
-       char quote = 0, escape = 0;
-       int i;
-
-       for (; *p == ' ' || *p == '\t'; p++)
-               ;
-       while (*p && *p != '\n' && *p != '#'
-              && pp < &argv[sizeof argv/sizeof *argv - 1]) {
-               *pp++ = q;
-               while (*p && *p != '\n') {
-                       if (escape) {
-                               switch (*p) {
-                               case 'n':
-                                       *q++ = '\n';
-                                       p++;
-                                       break;
-                               case 'r':
-                                       *q++ = '\r';
-                                       p++;
-                                       break;
-                               case '0': case '1': case '2': case '3':
-                               case '4': case '5': case '6': case '7':
-                                       *q = 0;
-                                       for (i = 3; --i >= 0
-                                            && *p >= '0' && *p <= '9';)
-                                               *q = *q << 3 | *p++ - '0';
-                                       q++;
-                                       break;
-                               default:
-                                       *q++ = *p++;
-                                       break;
-                               }
-                               escape = 0;
-                       } else if (*p == '\\') {
-                               escape = 1;
-                               p++;
-                       } else if (quote) {
-                               if (*p == quote) {
-                                       quote = 0;
-                                       p++;
-                               } else
-                                       *q++ = *p++;
-                       } else {
-                               if (*p == '"' || *p == '\'')
-                                       quote = *p++;
-                               else if (*p == ' ' || *p == '\t')
-                                       break;
-                               else
-                                       *q++ = *p++;
-                       }
-               }
-               *q++ = 0;
-               for (; *p == ' ' || *p == '\t'; p++)
-                       ;
-       }
-       *pp = 0;
-       argc = pp - argv;
-}
-
-s_window()
-{
-       register char **pp = argv;
-       register struct ww *w;
-       int col, row, ncol, nrow, id;
-
-       if ((id = findid()) < 0) {
-               error("Too many windows.");
-               return;
-       }
-       if (**++pp == '*')
-               row = 0;
-       else
-               row = atoi(*pp);
-       if (**++pp == '*')
-               col = 0;
-       else
-               col = atoi(*pp);
-       if (**++pp == '*')
-               nrow = wwnrow - row;
-       else
-               nrow = atoi(*pp);
-       if (**++pp == '*')
-               ncol = wwncol - col;
-       else
-               ncol = atoi(*pp);
-       w = doopen(id, nrow, ncol, row, col);
-       if (w == 0)
-               error("Can't open window: row %d col %d, %d rows %d cols.",
-                       row, col, nrow, ncol);
-}
-
-s_select()
-{
-       struct ww *w;
-
-       if ((w = idtowin(*argv + 1)) == 0)
-               return;
-       setselwin(w);
-}
-
-s_escape()
-{
-       setescape(argv[1]);
-}
-
-s_label()
-{
-       struct ww *w;
-
-       if ((w = idtowin(argv[1])) == 0)
-               return;
-       setlabel(w, argv[2]);
-}
-
-s_terse()
-{
-       if (argc < 2)
-               terse = 1;
-       else if (strcmp(argv[1], "off") == 0)
-               terse = 0;
-       else
-               terse = 1;
-       if (terse)
-               Whide(cmdwin->ww_win);
-       else
-               Wunhide(cmdwin->ww_win);
-}
-
-s_refresh()
+/*
+c_scroll(dir)
+int dir;
 {
 {
-       struct ww *w;
-
-       if ((w = idtowin(argv[1])) == 0)
-               return;
-       if (argc < 3)
-               w->ww_refresh = 1;
-       else if (strcmp(argv[2], "off") == 0)
-               w->ww_refresh = 0;
-       else
-               w->ww_refresh = 1;
-}
+       register brow = selwin->ww_scroll;
 
 
-s_source()
-{
-       if (insource) {
-               error("Recursive source.");
-               return;
+       brow += dir * selwin->ww_w.nrow / 2;
+       if (brow < 0)
+               brow = 0;
+       else if (brow + selwin->ww_w.nrow > selwin->ww_nline)
+               brow = selwin->ww_nline - selwin->ww_w.nrow;
+       if (brow != selwin->ww_scroll) {
+               selwin->ww_scroll = brow;
+               wwredrawwin(selwin);
        }
        }
-       if (dosource(argv[1]) < 0)
-               error("Can't open %s.", argv[1]);
-}
-
-s_write()
-{
-       struct ww *w;
-
-       if ((w = idtowin(argv[1])) == 0)
-               return;
-       write(w->ww_pty, argv[2], strlen(argv[2]));
-}
-
-struct ww *
-idtowin(idstr)
-char *idstr;
-{
-       int id;
-       struct ww *w = 0;
-
-       id = atoi(idstr);
-       if (id < 1 || id > 9 || (w = wwfind(id)) == 0)
-               error("%d: No such window.", id);
-       return w;
 }
 }
+*/
index 26feeed..5e676e4 100644 (file)
@@ -1,4 +1,6 @@
-/*     @(#)defs.h      2.1 83/07/30            */
+/*
+ *     @(#)defs.h      2.1.1.1 83/08/09        
+ */
 
 #include "ww.h"
 #include <signal.h>
 
 #include "ww.h"
 #include <signal.h>
@@ -12,8 +14,8 @@ int nreade;
 int nreadz;
 int nreadc;
 struct timeval starttime;
 int nreadz;
 int nreadc;
 struct timeval starttime;
-struct timezone timezone;
 
 
+       /* things for handling input */
 char ibuf[512];
 char *ibufp;
 int ibufc;
 char ibuf[512];
 char *ibufp;
 int ibufc;
@@ -21,8 +23,11 @@ int ibufc;
 #define bpeekc()       (ibufc ? *ibufp&0x7f : -1)
 #define bungetc(c)     (ibufp > ibuf ? ibufc++, *--ibufp = (c) : -1)
 
 #define bpeekc()       (ibufc ? *ibufp&0x7f : -1)
 #define bungetc(c)     (ibufp > ibuf ? ibufc++, *--ibufp = (c) : -1)
 
-struct ww *selwin;
-struct ww *cmdwin;
+struct ww *window[NWINDOW];    /* the windows */
+struct ww *selwin;             /* the selected window */
+struct ww *cmdwin;             /* the command window */
+struct ww *framewin;           /* the window for framing */
+struct ww *curwin;
 
 char *shell;
 char *shellname;
 
 char *shell;
 char *shellname;
@@ -31,3 +36,14 @@ char quit;
 char terse;
 char debug;
 char escapec;
 char terse;
 char debug;
 char escapec;
+
+struct ww *getwin();
+struct ww *openwin();
+struct ww *idtowin();
+struct ww *openiwin();
+
+       /* stuff for long commands */
+int argc;
+char *argv[100];
+int lineno;                    /* line number in the source file */
+char insource;                 /* we're in a source */
index 8307ff3..2d82288 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwclose.c   2.1 83/07/30";
+static char *sccsid = "@(#)wwclose.c   2.1.1.1 83/08/09";
 #endif
 
 #include "ww.h"
 #endif
 
 #include "ww.h"
@@ -8,20 +8,13 @@ static        char *sccsid = "@(#)wwclose.c   2.1 83/07/30";
 wwclose(w)
 register struct ww *w;
 {
 wwclose(w)
 register struct ww *w;
 {
-       register struct ww **p;
-
-       for (p = &wwhead; *p && *p != w; p = &(*p)->ww_next)
-               ;
-       if (*p == 0)
-               return -1;
-       *p = w->ww_next;
-       if (curwin == w)
-               curwin = wwhead;
-       if (w->ww_state == WW_HASPROC)
-               kill(w->ww_pid, SIGHUP);
-       close(w->ww_tty);
-       close(w->ww_pty);
-       Wclose(w->ww_win);
-       cfree(w);
-       return 0;
+       wwindex[w->ww_index] = 0;
+       if (w->ww_state == WWS_HASPROC)
+               (void) kill(w->ww_pid, SIGHUP);
+       (void) close(w->ww_tty);
+       (void) close(w->ww_pty);
+       wwfree((char **)w->ww_win, w->ww_w.nr);
+       wwfree((char **)w->ww_cov, w->ww_w.nr);
+       wwfree((char **)w->ww_buf, w->ww_nline);
+       free((char *)w);
 }
 }
index 73c35e7..90a225f 100644 (file)
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwframe.c   2.1 83/07/30";
+static char *sccsid = "@(#)wwframe.c   2.1.1.1 83/08/09";
 #endif
 
 #include "ww.h"
 
 #endif
 
 #include "ww.h"
 
-#define TOP    0
-#define BOTTOM 1
-#define LEFT   2
-#define RIGHT  3
+char **wwfmap;
+#define U 1
+#define R 2
+#define D 4
+#define L 8
 
 
-wwframe(w)
-register struct ww *w;
+wwframe(w, wframe)
+register struct ww *w, *wframe;
 {
        register i;
        char noleft, noright, notop, nobot;
 {
        register i;
        char noleft, noright, notop, nobot;
-       char ulc, top, urc, left, right, llc, bottom, lrc;
-       struct ww_dim oldsize;
-       Pos bstart;
-
-       oldsize = w->ww_w;
-       w->ww_w = w->ww_i = w->ww_o;
-
-       if (w->ww_o.col == 0)
-               noleft = 1;
-       else {
-               noleft = 0;
-               w->ww_i.ncol--;
-               w->ww_i.col++;
-       }
-       /*
-       if (w->ww_o.row == 0)
-               notop++;
-       else
-       */
-       {
-               notop = 0;
-               w->ww_i.nrow--;
-               w->ww_i.row++;
-       }
-       if (w->ww_o.col + w->ww_o.ncol == wwncol) {
-               noright = 1;
-       /*
-       } else if (wwcheckframe(LEFT, w->ww_o.col + w->ww_o.ncol - 1,
-                       w->ww_o.row, w->ww_o.row + w->ww_o.nrow - 1, wwhead)) {
-               noright = 1;
-               w->ww_w.ncol--;
-               w->ww_i.ncol--;
-       } else if (wwcheckframe(LEFT, w->ww_o.col + w->ww_o.ncol,
-                       w->ww_o.row, w->ww_o.row + w->ww_o.nrow - 1, wwhead)) {
-               XXXXX
-               w->ww_w.ncol--;
-       */
-       } else {
-               noright = 0;
-               w->ww_i.ncol--;
-       }
-       if (w->ww_o.row + w->ww_o.nrow == wwnrow) {
-               nobot = 1;
-       } else if (wwcheckframe(TOP, w->ww_o.row + w->ww_o.nrow - 1,
-                       w->ww_o.col, w->ww_o.col + w->ww_o.ncol - 1, wwhead)) {
-               nobot = 1;
-               w->ww_w.nrow--;
-               w->ww_i.nrow--;
-       /*
-       } else if (wwcheckframe(TOP, w->ww_o.row + w->ww_o.nrow,
-                       w->ww_o.col, w->ww_o.col + w->ww_o.ncol - 1, wwhead)) {
-               XXXXX
-               ww->ww_i.nrow--;
-       */
-       } else {
-               nobot = 0;
-               w->ww_i.nrow--;
-       }
-
-       if (oldsize.nrow != w->ww_w.nrow || oldsize.ncol != w->ww_w.ncol) {
-               bstart = w->ww_win->w_bstart;
-               if (Wsize(w->ww_win, w->ww_w.ncol, w->ww_w.nrow) != 0) {
-                       wwprintf(w, "wwframe: Wsize(%d, %d) failed.\r\n",
-                               w->ww_w.ncol, w->ww_w.nrow);
-                       return -1;
-               }
-               w->ww_win->w_bstart = bstart;
-       }
-       Wsetmargins(w->ww_win, noleft ? 0 : 1, notop ? 0 : 1,
-               w->ww_i.ncol, w->ww_i.nrow);
-       /* scroll to the old position */
 
 
-       Wgetframe(&ulc, &top, &urc, &left, &right, &llc, &bottom, &lrc);
+       if (wwfmap == 0
+           && (wwfmap = wwalloc(wwnrow, wwncol, sizeof (char))) == 0)
+               return -1;
+       noleft = w->ww_w.l == 0;
+       noright = w->ww_w.r >= wwncol;
+       notop = w->ww_w.t == 0;
+       nobot = w->ww_w.b >= wwnrow;
 
        if (!notop) {
 
        if (!notop) {
-               Wauxcursor(w->ww_win, 0, 0);
-               if (noleft)
-                       Waputc(top, 0, w->ww_win);
-               else
-                       Waputc(ulc, 0, w->ww_win);
-               for (i = w->ww_o.ncol - 2; i > 0; i--)
-                       Waputc(top, 0, w->ww_win);
-               if (noright)
-                       Waputc(top, 0, w->ww_win);
-               else
-                       Waputc(urc, 0, w->ww_win);
+               for (i = w->ww_w.l; i < w->ww_w.r; i++)
+                       wwframex(w, w->ww_w.t, i, wframe);
        }
 
        if (!nobot) {
        }
 
        if (!nobot) {
-               Wauxcursor(w->ww_win, w->ww_o.nrow - 1, 0);
-               if (noleft)
-                       Waputc(bottom, 0, w->ww_win);
-               else
-                       Waputc(llc, 0, w->ww_win);
-               for (i = w->ww_o.ncol - 2; i > 0; i--)
-                       Waputc(bottom, 0, w->ww_win);
-               if (noright)
-                       Waputc(bottom, 0, w->ww_win);
-               else
-                       Waputc(lrc, 0, w->ww_win);
+               for (i = w->ww_w.l; i < w->ww_w.r; i++)
+                       wwframex(w, w->ww_w.b - 1, i, wframe);
        }
 
        if (!noleft) {
        }
 
        if (!noleft) {
-               Wauxcursor(w->ww_win, 0, 0);
-               if (notop)
-                       Waputc(left, 0, w->ww_win);
-               else
-                       Waputc(ulc, 0, w->ww_win);
-               for (i = 1; i < w->ww_o.nrow - 1; i++) {
-                       Wauxcursor(w->ww_win, i, 0);
-                       Waputc(left, 0, w->ww_win);
-               }
-               Wauxcursor(w->ww_win, w->ww_o.nrow - 1, 0);
-               if (nobot)
-                       Waputc(left, 0, w->ww_win);
-               else
-                       Waputc(llc, 0, w->ww_win);
+               for (i = w->ww_w.t; i < w->ww_w.b; i++)
+                       wwframex(w, i, w->ww_w.l, wframe);
        }
 
        if (!noright) {
        }
 
        if (!noright) {
-               Wauxcursor(w->ww_win, 0, w->ww_o.ncol - 1);
-               if (notop)
-                       Waputc(right, 0, w->ww_win);
-               else
-                       Waputc(urc, 0, w->ww_win);
-               for (i = 1; i < w->ww_o.nrow - 1; i++) {
-                       Wauxcursor(w->ww_win, i, w->ww_o.ncol - 1);
-                       Waputc(left, 0, w->ww_win);
-               }
-               Wauxcursor(w->ww_win, w->ww_o.nrow - 1, w->ww_o.ncol - 1);
-               if (nobot)
-                       Waputc(right, 0, w->ww_win);
-               else
-                       Waputc(lrc, 0, w->ww_win);
+               for (i = w->ww_w.t; i < w->ww_w.b; i++)
+                       wwframex(w, i, w->ww_w.r - 1, wframe);
        }
        }
-
-       return 0;
 }
 
 }
 
-wwcheckframe(flag, x, a, b, w)
-register struct ww *w;
+wwframex(w, r, c, wframe)
+register struct ww *w, *wframe;
+register r, c;
 {
 {
-       int xx, aa, bb;
-
-       if (a >= b)
-               return 1;
-       for (; w; w = w->ww_next) {
-               switch (flag) {
-               case TOP:
-                       xx = w->ww_o.row;
-                       aa = w->ww_o.col;
-                       bb = w->ww_o.col + w->ww_o.ncol - 1;
-                       break;
-               case BOTTOM:
-                       xx = w->ww_o.row + w->ww_o.nrow - 1;
-                       aa = w->ww_o.col;
-                       bb = w->ww_o.col + w->ww_o.ncol - 1;
-                       break;
-               case LEFT:
-                       xx = w->ww_o.col;
-                       aa = w->ww_o.row;
-                       bb = w->ww_o.row + w->ww_o.nrow - 1;
-                       break;
-               case RIGHT:
-                       xx = w->ww_o.col + w->ww_o.ncol - 1;
-                       aa = w->ww_o.row;
-                       bb = w->ww_o.row + w->ww_o.nrow - 1;
-                       break;
-               }
-               if (xx != x || aa > b || bb < a)
-                       continue;
-               return wwcheckframe(flag, x, a, aa, w->ww_next)
-                       && wwcheckframe(flag, x, bb, b, w->ww_next);
+       char ul, top, ur, right, lr, bottom, ll, left;
+
+       if (w->ww_index != wwsmap[r][c])
+               return;
+       ul = wwframeok(w, r - 1, c - 1);
+       top = wwframeok(w, r - 1, c);
+       ur = wwframeok(w, r - 1, c + 1);
+       right = wwframeok(w, r, c + 1);
+       lr = wwframeok(w, r + 1, c + 1);
+       bottom = wwframeok(w, r + 1, c);
+       ll = wwframeok(w, r + 1, c - 1);
+       left = wwframeok(w, r, c - 1);
+       if (top && ul) {
+               wwframec(r - 1, c - 1, wframe, R);
+               wwframec(r - 1, c, wframe, L);
+       }
+       if (top && ur) {
+               wwframec(r - 1, c, wframe, R);
+               wwframec(r - 1, c + 1, wframe, L);
+       }
+       if (right && ur) {
+               wwframec(r - 1, c + 1, wframe, D);
+               wwframec(r, c + 1, wframe, U);
+       }
+       if (right && lr) {
+               wwframec(r, c + 1, wframe, D);
+               wwframec(r + 1, c + 1, wframe, U);
+       }
+       if (bottom && lr) {
+               wwframec(r + 1, c + 1, wframe, L);
+               wwframec(r + 1, c, wframe, R);
+       }
+       if (bottom && ll) {
+               wwframec(r + 1, c, wframe, L);
+               wwframec(r + 1, c - 1, wframe, R);
+       }
+       if (left && ll) {
+               wwframec(r + 1, c - 1, wframe, U);
+               wwframec(r, c - 1, wframe, D);
+       }
+       if (left && ul) {
+               wwframec(r, c - 1, wframe, U);
+               wwframec(r - 1, c - 1, wframe, D);
        }
        }
-       return 0;
 }
 
 }
 
-wwunframe(w)
+wwframeok(w, r, c)
 register struct ww *w;
 {
 register struct ww *w;
 {
-       char hasbot, hastop, hasright, hasleft;
-       register i;
+       register struct ww *w1;
 
 
-       hastop = w->ww_o.row < w->ww_i.row;
-       hasbot = w->ww_o.row + w->ww_o.nrow > w->ww_i.row + w->ww_i.nrow;
-       hasleft = w->ww_o.col < w->ww_i.col;
-       hasright = w->ww_o.col + w->ww_o.ncol > w->ww_i.col + w->ww_i.ncol;
+       if (r < 0 || r >= wwnrow || c < 0 || c >= wwncol)
+               return 1;
+       w1 = wwindex[wwsmap[r][c]];
+       if (w1->ww_hasframe && w1->ww_order <= w->ww_order)
+               return 0;
+       return 1;
+}
 
 
-       if (hastop) {
-               Wauxcursor(w->ww_win, 0, 0);
-               for (i = 0; i < w->ww_o.ncol; i++)
-                       Waputc(' ', WBUF, w->ww_win);
-       }
-       if (hasbot) {
-               Wauxcursor(w->ww_win, w->ww_o.nrow - 1, 0);
-               for (i = 0; i < w->ww_o.ncol; i++)
-                       Waputc(' ', WBUF, w->ww_win);
-       }
-       if (hasleft)
-               for (i = 0; i < w->ww_o.nrow; i++) {
-                       Wauxcursor(w->ww_win, i, 0);
-                       Waputc(' ', WBUF, w->ww_win);
-               }
-       if (hasright)
-               for (i = 0; i < w->ww_o.nrow; i++) {
-                       Wauxcursor(w->ww_win, i, w->ww_o.ncol - 1);
-                       Waputc(' ', WBUF, w->ww_win);
+wwframec(rr, cc, f, code)
+register struct ww *f;
+register rr, cc;
+{
+       register struct ww *w2;
+       register r, c;
+
+       if (rr < 0 || rr >= wwnrow || cc < 0 || cc >= wwncol)
+               return;
+       w2 = wwindex[wwsmap[rr][cc]];
+       if (w2->ww_order > f->ww_order) {
+               if (w2 != &wwnobody) {
+                       r = rr - w2->ww_w.t;
+                       c = cc - w2->ww_w.l;
+                       if ((w2->ww_win[r][c] |= WWM_COV) == WWM_COV)
+                               w2->ww_nvis[r]--;
+                       w2->ww_cov[r][c] = f->ww_index;
                }
                }
-       w->ww_i.row = w->ww_o.row;
-       w->ww_i.nrow = w->ww_o.nrow;
-       w->ww_i.col = w->ww_o.col;
-       w->ww_i.ncol = w->ww_o.ncol;
-       Wsetmargins(w->ww_win, 0, 0, w->ww_o.ncol, w->ww_o.nrow);
+               wwsmap[rr][cc] = f->ww_index;
+       }
+       code = wwfmap[rr][cc] |= code;
+       r = rr - f->ww_w.t;
+       c = cc - f->ww_w.l;
+       if (f->ww_win[r][c] == WWM_GLS)
+               f->ww_nvis[r]++;
+       f->ww_win[r][c] &= ~WWM_GLS;
+       f->ww_buf[f->ww_scroll + r][c].c_w = tt.tt_frame[code] & WWC_CMASK;
+       if (wwsmap[rr][cc] == f->ww_index)
+               wwns[rr][cc].c_w = tt.tt_frame[code] & WWC_CMASK;
 }
 }
index 7c84a5a..17de9ec 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwgets.c    2.1 83/07/30";
+static char *sccsid = "@(#)wwgets.c    2.1.1.1 83/08/09";
 #endif
 
 #include "defs.h"
 #endif
 
 #include "defs.h"
@@ -13,6 +13,7 @@ bread()
        int imask;
 
        while (ibufc == 0) {
        int imask;
 
        while (ibufc == 0) {
+               wwupdate();
                wwflush();
                imask = 1 << 0;
                while (wwforce(&imask) < 0)
                wwflush();
                imask = 1 << 0;
                while (wwforce(&imask) < 0)
@@ -46,14 +47,14 @@ register struct ww *w;
        register char c;
 
        for (;;) {
        register char c;
 
        for (;;) {
-               wwsetcursor(WCurRow(w->ww_win), WCurCol(w->ww_win));
+               wwcurtowin(w);
                while ((c = bgetc()) < 0)
                        bread();
                if (c == wwoldtty.ww_sgttyb.sg_erase) {
                        if (p > buf)
                                rub(*--p, w);
                        else
                while ((c = bgetc()) < 0)
                        bread();
                if (c == wwoldtty.ww_sgttyb.sg_erase) {
                        if (p > buf)
                                rub(*--p, w);
                        else
-                               Ding();
+                               wwbell();
                } else if (c == wwoldtty.ww_sgttyb.sg_kill) {
                        while (p > buf)
                                rub(*--p, w);
                } else if (c == wwoldtty.ww_sgttyb.sg_kill) {
                        while (p > buf)
                                rub(*--p, w);
@@ -67,9 +68,9 @@ register struct ww *w;
                        break;
                } else {
                        if (p >= buf + n - 1)
                        break;
                } else {
                        if (p >= buf + n - 1)
-                               Ding();
+                               wwbell();
                        else
                        else
-                               wwputs(unctrl(*p++ = c), w);
+                               (void) wwputs(unctrl(*p++ = c), w);
                }
        }
        *p = 0;
                }
        }
        *p = 0;
@@ -81,5 +82,5 @@ struct ww *w;
        register i;
 
        for (i = strlen(unctrl(c)); --i >= 0;)
        register i;
 
        for (i = strlen(unctrl(c)); --i >= 0;)
-               wwputs("\b \b", w);
+               (void) wwputs("\b \b", w);
 }
 }
index f8e0c33..d7e4c97 100644 (file)
@@ -1,21 +1,61 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwlabel.c   2.1 83/07/30";
+static char *sccsid = "@(#)wwlabel.c   2.1.1.1 83/08/09";
 #endif
 
 #include "ww.h"
 
 #endif
 
 #include "ww.h"
 
-wwlabel(w, where, l, mode)
+char **wwfmap;
+#define U 1
+#define R 2
+#define D 4
+#define L 8
+
+/*
+ * 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)
 register struct ww *w;
 register struct ww *w;
-register char *l;
+struct ww *f;
+char *l;
 {
 {
-       register i;
+       int i;
+       register j;
        register char *p;
        register char *p;
-       char ulc, top, urc, left, right, llc, bottom, lrc;
+       register char *win;
+       register union ww_char *buf;
+       register union ww_char *ns;
+       char *fmap;
 
 
-       if (w->ww_i.nrow == w->ww_w.nrow)       /* not framed */
+       if ((i = w->ww_w.t - 1 - f->ww_w.t) < 0)
                return -1;
                return -1;
-       Wauxcursor(w->ww_win, 0, where);
-       for (i = w->ww_o.ncol - where - 1; i > 0 && *l; l++)
-               for (p = unctrl(*l); *p; p++, i--)
-                       Waputc(*p, mode, w->ww_win);
+       j = w->ww_w.l + where;
+       j = MAX(j, f->ww_w.l);
+       win = &f->ww_win[i][j - f->ww_w.l];
+       buf = &f->ww_buf[w->ww_scroll + i][j - f->ww_w.l];
+       i += f->ww_w.t;
+       ns = &wwns[i][j];
+       fmap = &wwfmap[i][j];
+       j = MIN(w->ww_w.r, f->ww_w.r) - j;
+
+       for (; j > 0 && *l;)
+               for (p = unctrl(*l++); j > 0 && *p; j--, fmap++) {
+                       /* can't label if not already framed */
+                       if (*win & WWM_GLS || (*fmap & (U|D)) == (U|D)) {
+                               p++;
+                               buf++;
+                               ns++;
+                               win++;
+                       } else if (*win & WWM_COV) {
+                               buf++->c_w = mode << WWC_MSHIFT | *p++;
+                               ns++;
+                               win++;
+                       } else
+                               ns++->c_w = (buf++->c_w
+                                       = mode << WWC_MSHIFT | *p++)
+                                               ^ *win++ << WWC_MSHIFT;
+               }
+
+       return 0;
 }
 }
index 06b2c17..ced540e 100644 (file)
@@ -1,9 +1,10 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwprintf.c  2.1 83/07/30";
+static char *sccsid = "@(#)wwprintf.c  2.1.1.1 83/08/09";
 #endif
 
 #include "ww.h"
 
 #endif
 
 #include "ww.h"
 
+/*VARARGS2*/
 wwprintf(w, fmt, args)
 struct ww *w;
 char *fmt;
 wwprintf(w, fmt, args)
 struct ww *w;
 char *fmt;
@@ -23,35 +24,3 @@ char *fmt;
        _doprnt(fmt, &args, &_wwbuf);
        return wwwrite(w, buf, _wwbuf._ptr - buf);
 }
        _doprnt(fmt, &args, &_wwbuf);
        return wwwrite(w, buf, _wwbuf._ptr - buf);
 }
-
-/*
-wwprintf(w, fmt, args)
-struct ww *w;
-char *fmt;
-{
-       _doprnt(fmt, &args, w);
-       return 0;
-}
-
-_strout(count, string, adjust, file, fillch)
-register char *string;
-register count;
-int adjust;
-register struct ww *file;
-{
-       while (adjust < 0) {
-               if (*string=='-' && fillch=='0') {
-                       wputc(*string++, file);
-                       count--;
-               }
-               wputc(fillch, file);
-               adjust++;
-       }
-       while (--count>=0)
-               wputc(*string++, file);
-       while (adjust) {
-               wputc(fillch, file);
-               adjust--;
-       }
-}
-*/