/* ARGSUSED */ int itegetchar(dev_t dev) { #ifdef SMALL return (0); #else return (kbdgetc()); #endif }
void kbd_handler(regs_pt *regs) { static int max_len; static int cur_len; if(input.s == 1) { max_len = 0; cur_len = 0; input.s = 2; } if(input.s != 2) return; int ch = kbdgetc(); if(!ch) return; switch(ch) { case KEY_LF: if(cur_len > 0) { cursor_left(); cur_len--; } return; case KEY_RT: if(cur_len < max_len) { cursor_right(); cur_len++; } return; case '\b': if(cur_len <= 0) return; cur_len--; max_len--; for(int i = (input.r+cur_len)%256; i != input.w; i=(i+1)%256) { input.buf[i] = input.buf[(i+1)%256]; } input.w=(input.w-1)%256; for(int i = cur_len; i < max_len; i++) cursor_right(); flush_input(max_len+1, max_len, &input.buf[input.r]); for(int i = cur_len; i < max_len; i++) cursor_left(); return; case '\n': input.w=(input.w+1)%256; for(int i = cur_len; i < max_len; i++) cursor_right(); putchar_normal('\n'); wakeup(&input.r); return; } // queue is full. if((input.w + 1)%256 == input.r) { wakeup(&input.r); return; } int i; for(i = input.w; i != (input.r+cur_len)%256; i=(i-1)%256) input.buf[i] = input.buf[(i-1)%256]; input.buf[i] = ch; max_len++; cur_len++; for(i = cur_len-1; i < max_len-1; i++) cursor_right(); flush_input(max_len-1, max_len, &input.buf[input.r]); for(i = cur_len; i < max_len; i++) cursor_left(); input.w=(input.w+1)%256; input.w%=256; }