- for (;;) {
- col = 0;
- move(22, 0);
- do {
- refresh();
- ch = getch() & 0177;
- if (ch == 0177 && ferror(stdin)) {
- clearerr(stdin);
- continue;
- }
- if (ch >= 'A' && ch <= 'Z')
- ch += 'a' - 'A';
- if (col == 0) {
- if (ch == CTRL(l)) {
- wrefresh(curscr);
- continue;
- }
- if (ch != ':')
- continue;
- move(22, 0);
- clrtoeol();
- }
- if (ch == _tty.sg_erase && col > 0) {
- if (col == 1 && line[0] == ':')
- continue;
- col--;
- goto doerase;
- }
- if (ch == CTRL(w) && col > 0) {
- while (--col >= 0 && isspace(line[col]))
- ;
- col++;
- while (--col >= 0 && !isspace(line[col]))
- if (col == 0 && line[0] == ':')
- break;
- col++;
- goto doerase;
- }
- if (ch == _tty.sg_kill && col > 0) {
- col = 0;
- if (line[0] == ':')
- col++;
- doerase:
- move(22, col);
- clrtoeol();
- continue;
- }
- if (isprint(ch)) {
- line[col] = ch;
- mvaddch(22, col, ch);
- col++;
- }
- } while (col == 0 || (ch != '\r' && ch != '\n'));
- line[col] = '\0';
- command(line + 1);
- }
-}
-
-command(cmd)
- char *cmd;
-{
- register char *cp;
- register struct cmdtab *p;
- char *arg;
-
- for (cp = cmd; *cp && !isspace(*cp); cp++)
- ;
- if (*cp)
- *cp++ = '\0';
- if (strcmp(cmd, "quit") == 0)
- die();
- if (strcmp(cmd, "status") == 0 || strcmp(cmd, "help") == 0) {
- status();
- return;
- }
- for (p = cmdtab; *p->c_name; p++)
- if (strcmp(cmd, p->c_name) == 0)
- break;
- if (*p->c_name) {
- if (curcmd == p)
- return;
- alarm(0);
- curcmd = p;
- wclear(wnd);
- (*p->c_label)();
- display();
- status();
- return;
- }
- if (strcmp(cmd, "stop") == 0) {
- alarm(0);
- mvaddstr(22, 0, "Refresh disabled.");
- clrtoeol();
- return;
- }
- /* commands with arguments */
- for (; *cp && isspace(*cp); cp++)
- ;
- if (strcmp(cmd, "start") == 0) {
- int x;
-
- if (*cp == '\0')
- x = naptime;
- else
- x = atoi(cp);
- if (x <= 0) {
- mvprintw(22, 0, "%d: bad interval.", x);
- clrtoeol();
- return;
- }
- alarm(0);
- naptime = x;
- display();
- status();
- return;
- }
- mvprintw(22, 0, "%s: Unknown command.", cmd);
- clrtoeol();
-}
-
-status()
-{
-
- mvprintw(22, 0, "Showing %s, refresh every %d seconds.",
- curcmd->c_name, naptime);
- clrtoeol();
-}
-
-suspend()
-{
- int oldmask;
-
- move(22, 0);
- refresh();
- echo();
- nocrmode();
- signal(SIGTSTP, SIG_DFL);
- oldmask = sigsetmask(0);
- kill(getpid(), SIGTSTP);
- sigsetmask(oldmask);
- signal(SIGTSTP, suspend);
- crmode();
- noecho();
- move(22, col);
- wrefresh(curscr);