From ee408a1fda67a3cb13966a801740a4abc110f1f8 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 20 Aug 1997 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1997-08-20 --- port/devcons.c | 66 ++++++++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/port/devcons.c b/port/devcons.c index d053c99ecb3a21eb7f85be6e93a1cdf956ebc421..e8e6072feb73331f6cd7ad1e0cb469c629adc5c8 100644 --- a/port/devcons.c +++ b/port/devcons.c @@ -522,37 +522,45 @@ consread(Chan *c, void *buf, long n, ulong offset) qunlock(&kbd); nexterror(); } - while(!qcanread(lineq)) { - qread(kbdq, &kbd.line[kbd.x], 1); - ch = kbd.line[kbd.x]; - if(kbd.raw){ - qiwrite(lineq, &kbd.line[kbd.x], 1); - continue; - } - eol = 0; - switch(ch){ - case '\b': - if(kbd.x) - kbd.x--; - break; - case 0x15: - kbd.x = 0; - break; - case '\n': - case 0x04: - eol = 1; - default: - kbd.line[kbd.x++] = ch; - break; - } - if(kbd.x == sizeof(kbd.line) || eol){ - if(ch == 0x04) - kbd.x--; - qwrite(lineq, kbd.line, kbd.x); - kbd.x = 0; + if(kbd.raw) { + if(qcanread(lineq)) + n = qread(lineq, buf, n); + else + n = qread(kbdq, buf, n); + } else { + while(!qcanread(lineq)) { + qread(kbdq, &kbd.line[kbd.x], 1); + ch = kbd.line[kbd.x]; + if(kbd.raw){ + qiwrite(lineq, kbd.line, kbd.x+1); + kbd.x = 0; + continue; + } + eol = 0; + switch(ch){ + case '\b': + if(kbd.x) + kbd.x--; + break; + case 0x15: + kbd.x = 0; + break; + case '\n': + case 0x04: + eol = 1; + default: + kbd.line[kbd.x++] = ch; + break; + } + if(kbd.x == sizeof(kbd.line) || eol){ + if(ch == 0x04) + kbd.x--; + qwrite(lineq, kbd.line, kbd.x); + kbd.x = 0; + } } + n = qread(lineq, buf, n); } - n = qread(lineq, buf, n); qunlock(&kbd); poperror(); return n;