1: /* 2: * Copyright (c) 1980 Regents of the University of California. 3: * All rights reserved. The Berkeley software License Agreement 4: * specifies the terms and conditions for redistribution. 5: */ 6: 7: #ifndef lint 8: static char sccsid[] = "@(#)keyboard.c 5.1 (Berkeley) 5/30/85"; 9: #endif not lint 10: 11: /* 12: * Keyboard input support. 13: */ 14: 15: #include "systat.h" 16: #include <ctype.h> 17: 18: keyboard() 19: { 20: char ch, line[80]; 21: int oldmask; 22: 23: for (;;) { 24: col = 0; 25: move(CMDLINE, 0); 26: do { 27: refresh(); 28: ch = getch() & 0177; 29: if (ch == 0177 && ferror(stdin)) { 30: clearerr(stdin); 31: continue; 32: } 33: if (ch >= 'A' && ch <= 'Z') 34: ch += 'a' - 'A'; 35: if (col == 0) { 36: #define mask(s) (1 << ((s) - 1)) 37: if (ch == CTRL(l)) { 38: oldmask = sigblock(mask(SIGALRM)); 39: wrefresh(curscr); 40: sigsetmask(oldmask); 41: continue; 42: } 43: if (ch == CTRL(g)) { 44: oldmask = sigblock(mask(SIGALRM)); 45: status(); 46: sigsetmask(oldmask); 47: continue; 48: } 49: if (ch != ':') 50: continue; 51: move(CMDLINE, 0); 52: clrtoeol(); 53: } 54: if (ch == _tty.sg_erase && col > 0) { 55: if (col == 1 && line[0] == ':') 56: continue; 57: col--; 58: goto doerase; 59: } 60: if (ch == CTRL(w) && col > 0) { 61: while (--col >= 0 && isspace(line[col])) 62: ; 63: col++; 64: while (--col >= 0 && !isspace(line[col])) 65: if (col == 0 && line[0] == ':') 66: break; 67: col++; 68: goto doerase; 69: } 70: if (ch == _tty.sg_kill && col > 0) { 71: col = 0; 72: if (line[0] == ':') 73: col++; 74: doerase: 75: move(CMDLINE, col); 76: clrtoeol(); 77: continue; 78: } 79: if (isprint(ch) || ch == ' ') { 80: line[col] = ch; 81: mvaddch(CMDLINE, col, ch); 82: col++; 83: } 84: } while (col == 0 || (ch != '\r' && ch != '\n')); 85: line[col] = '\0'; 86: oldmask = sigblock(mask(SIGALRM)); 87: command(line + 1); 88: sigsetmask(oldmask); 89: } 90: /*NOTREACHED*/ 91: }