diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-10-21 03:42:24 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2018-10-21 03:42:24 +0200 |
commit | 2fd35e9bf8077c6a4d2b86d9b456711b18d5f332 (patch) | |
tree | d2535fea58effdbdf3dd60e9b83dcd6e0db6b95c /sys | |
parent | b4eb667f02c32f007290b68adc95c8fbd9a2c3cd (diff) |
kbdfs: don't get confused by broken utf8
Diffstat (limited to 'sys')
-rw-r--r-- | sys/src/cmd/aux/kbdfs/kbdfs.c | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/sys/src/cmd/aux/kbdfs/kbdfs.c b/sys/src/cmd/aux/kbdfs/kbdfs.c index b68e52250..6adbece2c 100644 --- a/sys/src/cmd/aux/kbdfs/kbdfs.c +++ b/sys/src/cmd/aux/kbdfs/kbdfs.c @@ -625,23 +625,29 @@ consproc(void *) p = buf; e = buf + sizeof(buf); while((n = read(consfd, p, e - p)) > 0){ - x = buf + n; - while(p < x && fullrune(p, x - p)){ + x = p + n; + p = buf; + while((n = x - p) > 0){ + if(!fullrune(p, n)){ + memmove(buf, p, n); + break; + } p += chartorune(&r, p); - if(r){ - if(r == 021 || r == 023) /* XON/XOFF */ - continue; - if(r == '\n' && cr){ - cr = 0; - continue; - } - if(cr = (r == '\r')) - r = '\n'; - send(runechan, &r); + if(r == 021 || r == 023) /* XON/XOFF */ + continue; + if(r == 0 || r == Runeerror){ + cr = 0; + continue; } + if(r == '\n' && cr){ + cr = 0; + continue; + } + if(cr = (r == '\r')) + r = '\n'; + send(runechan, &r); } - n = x - p; - memmove(buf, p, n); + if(n < 0) n = 0; p = buf + n; } |