fix sccsid to use keywords and modern initialization syntax
[unix-history] / usr / src / usr.bin / window / wwgets.c
index c2b8c22..0a5c086 100644 (file)
@@ -1,23 +1,61 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)wwgets.c    1.1 83/07/18";
+static char sccsid[] = "@(#)wwgets.c   3.9 %G%";
 #endif
 
 #endif
 
-#include "defs.h"
+/*
+ * Copyright (c) 1983 Regents of the University of California,
+ * All rights reserved.  Redistribution permitted subject to
+ * the terms of the Berkeley Software License Agreement.
+ */
 
 
-char *ibufp = ibuf;
+#include "ww.h"
+#include "char.h"
 
 
-bread()
+wwgets(buf, n, w)
+char *buf;
+int n;
+register struct ww *w;
 {
 {
-       register n;
-       int imask;
+       register char *p = buf;
+       register char c;
+       char uc = w->ww_unctrl;
 
 
-       imask = 1 << 0;
-       wwforce(&imask);
-       if ((imask & 1<<0) == 0)
-               return;
-       if (ibufc == 0)
-               ibufp = ibuf;
-       n = read(0, ibufp + ibufc, ibuf + sizeof ibuf - ibufp - ibufc);
-       if (n > 0)
-               ibufc += n;
+       w->ww_unctrl = 0;
+       for (;;) {
+               wwcurtowin(w);
+               while ((c = wwgetc()) < 0)
+                       wwiomux();
+               if (c == wwoldtty.ww_sgttyb.sg_erase) {
+                       if (p > buf)
+                               rub(*--p, w);
+               } else if (c == wwoldtty.ww_sgttyb.sg_kill) {
+                       while (p > buf)
+                               rub(*--p, w);
+               } else if (c == wwoldtty.ww_ltchars.t_werasc) {
+                       while (--p >= buf && (*p == ' ' || *p == '\t'))
+                               rub(*p, w);
+                       while (p >= buf && *p != ' ' && *p != '\t')
+                               rub(*p--, w);
+                       p++;
+               } else if (c == '\r' || c == '\n') {
+                       break;
+               } else {
+                       if (p >= buf + n - 1)
+                               wwputc(ctrl(g), w);
+                       else
+                               wwputs(unctrl(*p++ = c), w);
+               }
+       }
+       *p = 0;
+       w->ww_unctrl = uc;
+}
+
+static
+rub(c, w)
+struct ww *w;
+{
+       register i;
+
+       for (i = strlen(unctrl(c)); --i >= 0;)
+               (void) wwwrite(w, "\b \b", 3);
 }
 }