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.2 (Berkeley) 12/22/87"; 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 } 92