keyboard.c revision 1590
11590Srgrimes/*- 21590Srgrimes * Copyright (c) 1980, 1992, 1993 31590Srgrimes * The Regents of the University of California. All rights reserved. 41590Srgrimes * 51590Srgrimes * Redistribution and use in source and binary forms, with or without 61590Srgrimes * modification, are permitted provided that the following conditions 71590Srgrimes * are met: 81590Srgrimes * 1. Redistributions of source code must retain the above copyright 91590Srgrimes * notice, this list of conditions and the following disclaimer. 101590Srgrimes * 2. Redistributions in binary form must reproduce the above copyright 111590Srgrimes * notice, this list of conditions and the following disclaimer in the 121590Srgrimes * documentation and/or other materials provided with the distribution. 131590Srgrimes * 3. All advertising materials mentioning features or use of this software 141590Srgrimes * must display the following acknowledgement: 151590Srgrimes * This product includes software developed by the University of 161590Srgrimes * California, Berkeley and its contributors. 171590Srgrimes * 4. Neither the name of the University nor the names of its contributors 181590Srgrimes * may be used to endorse or promote products derived from this software 191590Srgrimes * without specific prior written permission. 201590Srgrimes * 211590Srgrimes * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 221590Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 231590Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 241590Srgrimes * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 251590Srgrimes * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 261590Srgrimes * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 271590Srgrimes * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 281590Srgrimes * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 291590Srgrimes * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 301590Srgrimes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 311590Srgrimes * SUCH DAMAGE. 321590Srgrimes */ 331590Srgrimes 341590Srgrimes#ifndef lint 351590Srgrimesstatic char sccsid[] = "@(#)keyboard.c 8.1 (Berkeley) 6/6/93"; 361590Srgrimes#endif /* not lint */ 371590Srgrimes 381590Srgrimes#include <ctype.h> 391590Srgrimes#include <signal.h> 401590Srgrimes#include <termios.h> 411590Srgrimes 421590Srgrimes#include "systat.h" 431590Srgrimes#include "extern.h" 441590Srgrimes 451590Srgrimesint 461590Srgrimeskeyboard() 471590Srgrimes{ 481590Srgrimes char ch, line[80]; 491590Srgrimes int oldmask; 501590Srgrimes 511590Srgrimes for (;;) { 521590Srgrimes col = 0; 531590Srgrimes move(CMDLINE, 0); 541590Srgrimes do { 551590Srgrimes refresh(); 561590Srgrimes ch = getch() & 0177; 571590Srgrimes if (ch == 0177 && ferror(stdin)) { 581590Srgrimes clearerr(stdin); 591590Srgrimes continue; 601590Srgrimes } 611590Srgrimes if (ch >= 'A' && ch <= 'Z') 621590Srgrimes ch += 'a' - 'A'; 631590Srgrimes if (col == 0) { 641590Srgrimes#define mask(s) (1 << ((s) - 1)) 651590Srgrimes if (ch == CTRL('l')) { 661590Srgrimes oldmask = sigblock(mask(SIGALRM)); 671590Srgrimes wrefresh(curscr); 681590Srgrimes sigsetmask(oldmask); 691590Srgrimes continue; 701590Srgrimes } 711590Srgrimes if (ch == CTRL('g')) { 721590Srgrimes oldmask = sigblock(mask(SIGALRM)); 731590Srgrimes status(); 741590Srgrimes sigsetmask(oldmask); 751590Srgrimes continue; 761590Srgrimes } 771590Srgrimes if (ch != ':') 781590Srgrimes continue; 791590Srgrimes move(CMDLINE, 0); 801590Srgrimes clrtoeol(); 811590Srgrimes } 821590Srgrimes if (ch == erasechar() && col > 0) { 831590Srgrimes if (col == 1 && line[0] == ':') 841590Srgrimes continue; 851590Srgrimes col--; 861590Srgrimes goto doerase; 871590Srgrimes } 881590Srgrimes if (ch == CTRL('w') && col > 0) { 891590Srgrimes while (--col >= 0 && isspace(line[col])) 901590Srgrimes ; 911590Srgrimes col++; 921590Srgrimes while (--col >= 0 && !isspace(line[col])) 931590Srgrimes if (col == 0 && line[0] == ':') 941590Srgrimes break; 951590Srgrimes col++; 961590Srgrimes goto doerase; 971590Srgrimes } 981590Srgrimes if (ch == killchar() && col > 0) { 991590Srgrimes col = 0; 1001590Srgrimes if (line[0] == ':') 1011590Srgrimes col++; 1021590Srgrimes doerase: 1031590Srgrimes move(CMDLINE, col); 1041590Srgrimes clrtoeol(); 1051590Srgrimes continue; 1061590Srgrimes } 1071590Srgrimes if (isprint(ch) || ch == ' ') { 1081590Srgrimes line[col] = ch; 1091590Srgrimes mvaddch(CMDLINE, col, ch); 1101590Srgrimes col++; 1111590Srgrimes } 1121590Srgrimes } while (col == 0 || (ch != '\r' && ch != '\n')); 1131590Srgrimes line[col] = '\0'; 1141590Srgrimes oldmask = sigblock(mask(SIGALRM)); 1151590Srgrimes command(line + 1); 1161590Srgrimes sigsetmask(oldmask); 1171590Srgrimes } 1181590Srgrimes /*NOTREACHED*/ 1191590Srgrimes} 120