(no message)
[unix-history] / usr / src / usr.bin / systat / cmds.c
CommitLineData
612f3023 1#ifndef lint
acaaf0c4 2static char sccsid[] = "@(#)cmds.c 1.3 (Lucasfilm) %G%";
612f3023
SL
3#endif
4
5/*
6 * Command support.
7 */
8
9#include "systat.h"
10
11command(cmd)
12 char *cmd;
13{
14 register char *cp;
15 register struct cmdtab *p;
16 char *arg;
17
18 for (cp = cmd; *cp && !isspace(*cp); cp++)
19 ;
20 if (*cp)
21 *cp++ = '\0';
acaaf0c4
SL
22 if (*cmd == '\0')
23 return;
4fefc2e5 24 if (strcmp(cmd, "quit") == 0 || strcmp(cmd, "q") == 0)
612f3023 25 die();
612f3023
SL
26 if (strcmp(cmd, "load") == 0) {
27 load();
28 return;
29 }
612f3023
SL
30 if (strcmp(cmd, "stop") == 0) {
31 alarm(0);
32 mvaddstr(22, 0, "Refresh disabled.");
33 clrtoeol();
34 return;
35 }
4fefc2e5 36 if (strcmp(cmd, "start") == 0 || strcmp(cmd, "interval") == 0) {
612f3023
SL
37 int x;
38
acaaf0c4
SL
39 for (; *cp && isspace(*cp); cp++)
40 ;
41 x = *cp ? atoi(cp) : naptime;
612f3023
SL
42 if (x <= 0) {
43 mvprintw(22, 0, "%d: bad interval.", x);
44 clrtoeol();
45 return;
46 }
47 alarm(0);
48 naptime = x;
49 display();
50 status();
51 return;
52 }
acaaf0c4
SL
53 p = lookup(cmd);
54 if (p == (struct cmdtab *)-1) {
55 error("%s: Ambiguous command.", cmd);
56 return;
612f3023 57 }
acaaf0c4
SL
58 if (p) {
59 if (curcmd == p)
60 return;
61 alarm(0);
62 (*curcmd->c_close)(wnd);
63 wnd = (*p->c_open)();
64 curcmd = p;
65 if (p->c_flags == 0) {
66 (*p->c_init)();
67 p->c_flags = 1;
68 }
69 labels();
70 display();
71 status();
72 return;
73 }
74 mvprintw(22, 0, "%s: Unknown command.", cmd);
75 clrtoeol();
612f3023
SL
76}
77
78struct cmdtab *
4fefc2e5 79lookup(name)
612f3023
SL
80 register char *name;
81{
82 register char *p, *q;
83 register struct cmdtab *c, *found;
84 register int nmatches, longest;
85
86 longest = 0;
87 nmatches = 0;
88 found = 0;
89 for (c = cmdtab; p = c->c_name; c++) {
90 for (q = name; *q == *p++; q++)
91 if (*q == 0) /* exact match? */
92 return (c);
93 if (!*q) { /* the name was a prefix */
94 if (q - name > longest) {
95 longest = q - name;
96 nmatches = 1;
97 found = c;
98 } else if (q - name == longest)
99 nmatches++;
100 }
101 }
102 if (nmatches > 1)
103 return ((struct cmdtab *)-1);
104 return (found);
105}
106
107status()
108{
109
110 mvprintw(22, 0, "Showing %s, refresh every %d seconds.",
111 curcmd->c_name, naptime);
112 clrtoeol();
113}
114
115suspend()
116{
117 int oldmask;
118
119 alarm(0);
120 move(22, 0);
121 refresh();
122 echo();
123 nocrmode();
124 signal(SIGTSTP, SIG_DFL);
125 oldmask = sigsetmask(0);
126 kill(getpid(), SIGTSTP);
127 sigsetmask(oldmask);
128 signal(SIGTSTP, suspend);
129 crmode();
130 noecho();
131 move(22, col);
132 wrefresh(curscr);
133 alarm(naptime);
134}