From ef5c6a6edaf3dcf2cddd46841dc0dd8fce2bf967 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Fri, 3 Sep 2010 10:21:16 -0400 Subject: 9term, win: better echo cancellation Also just drop \r from output. It's a losing battle to keep turning it off. R=rsc http://codereview.appspot.com/2128042 --- src/cmd/9term/rcstart.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 2 deletions(-) (limited to 'src/cmd/9term/rcstart.c') diff --git a/src/cmd/9term/rcstart.c b/src/cmd/9term/rcstart.c index 4d64349c..6b91c869 100644 --- a/src/cmd/9term/rcstart.c +++ b/src/cmd/9term/rcstart.c @@ -87,8 +87,6 @@ rcstart(int argc, char **argv, int *pfd, int *tfd) dup(sfd, 2); sys("stty tabs -onlcr icanon echo erase '^h' intr '^?'", 0); sys("stty onocr", 1); /* not available on mac */ - if(noecho) - sys("stty -echo", 0); for(i=3; i<100; i++) close(i); signal(SIGINT, SIG_DFL); @@ -111,3 +109,73 @@ rcstart(int argc, char **argv, int *pfd, int *tfd) return pid; } +struct { + Lock l; + char buf[1<<20]; + int r, w; +} echo; + +void +echoed(char *p, int n) +{ + lock(&echo.l); + if(echo.r > 0) { + memmove(echo.buf, echo.buf+echo.r, echo.w-echo.r); + echo.w -= echo.r; + echo.r = 0; + } + if(echo.w+n > sizeof echo.buf) + echo.r = echo.w = 0; + if(echo.w+n > sizeof echo.buf) + n = 0; + memmove(echo.buf+echo.w, p, n); + echo.w += n; + unlock(&echo.l); +} + +int +echocancel(char *p, int n) +{ + int i; + + lock(&echo.l); + for(i=0; i 0) + memmove(p, p+i, n-i); + return n-i; +} + +int +dropcrnl(char *p, int n) +{ + char *r, *w; + + for(r=w=p; r