xref: /original-bsd/usr.bin/systat/keyboard.c (revision 0fc6f013)
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) 05/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 }
92