- 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);