xref: /csrg-svn/sys/deprecated/kdb/kdb_input.c (revision 39060)
130296Ssam /*
230296Ssam  * Copyright (c) 1986 Regents of the University of California.
330296Ssam  * All rights reserved.  The Berkeley software License Agreement
430296Ssam  * specifies the terms and conditions for redistribution.
530296Ssam  *
6*39060Smarc  *	@(#)kdb_input.c	7.4 (Berkeley) 09/06/89
730296Ssam  */
830109Ssam 
930109Ssam #include "../kdb/defs.h"
1030109Ssam 
1130109Ssam char	line[LINSIZ];
1230109Ssam char	*lp;
1330109Ssam char	peekc,lastc = EOR;
1430109Ssam 
1530109Ssam /* input routines */
1630109Ssam 
1730109Ssam eol(c)
1830109Ssam 	char c;
1930109Ssam {
2030109Ssam 	return (c==EOR || c==';');
2130109Ssam }
2230109Ssam 
2330109Ssam rdc()
2430109Ssam {
2530109Ssam 	do
2630296Ssam 		(void) readchar();
2730109Ssam 	while (lastc==SP || lastc==TB);
2830109Ssam 	return (lastc);
2930109Ssam }
3030109Ssam 
3130109Ssam readchar()
3230109Ssam {
3330109Ssam 	static char *erase = "\b \b";
3430109Ssam 
3530109Ssam 	if (lp==0) {
3630109Ssam 		lp=line;
3730109Ssam 		do {
3830109Ssam 			(void) kdbreadc(lp);
3930109Ssam 			if (mkfault)
4030296Ssam 				error((char *)0);
4130109Ssam 			switch (*lp) {
42*39060Smarc 			case CTRL('h'): case 0177:
4330109Ssam 				if (lp > line)
4430109Ssam 					kdbwrite(erase, 3), lp--;
4530109Ssam 				break;
46*39060Smarc 			case CTRL('u'):
4730109Ssam 				while (lp > line)
4830109Ssam 					kdbwrite(erase, 3), lp--;
4930109Ssam 				break;
50*39060Smarc 			case CTRL('r'):
5130109Ssam 				kdbwrite("^R\n", 3);
5230109Ssam 				if (lp > line)
5330109Ssam 					kdbwrite(line, lp-line);
5430109Ssam 				break;
55*39060Smarc 			case CTRL('w'):
5630109Ssam 				if (lp <= line)
5730109Ssam 					break;
5830109Ssam 				do {
5930109Ssam 					if (!isspace(*lp))
6030109Ssam 						goto erasenb;
6130109Ssam 					kdbwrite(erase, 3);
6230109Ssam 				} while (--lp > line);
6330109Ssam 				break;
6430109Ssam 			erasenb:
6530109Ssam 				do
6630109Ssam 					kdbwrite(erase, 3);
6730109Ssam 				while (--lp > line && !isspace(*lp));
6830109Ssam 				break;
6930109Ssam 			default:
7030109Ssam 				echo(*lp++);
7130109Ssam 				break;
7230109Ssam 			}
7330109Ssam 		} while (lp == line || lp[-1] != EOR);
7430109Ssam 		*lp=0; lp=line;
7530109Ssam 	}
7630109Ssam 	if (lastc = peekc)
7730109Ssam 		peekc=0;
7830109Ssam 	else  if (lastc = *lp)
7930109Ssam 		lp++;
8030109Ssam 	return (lastc);
8130109Ssam }
8230109Ssam 
8330109Ssam static
8430109Ssam echo(c)
8530109Ssam 	char c;
8630109Ssam {
8730109Ssam 	char buf[2];
8830109Ssam 
8930109Ssam 	if (c==0177 || (c<SP && c != TB && c != EOR)) {
9030109Ssam 		buf[0] = '^';
9130109Ssam 		buf[1] = c ^ 0100;
9230109Ssam 		kdbwrite(buf, 2);
9330109Ssam 	} else
9430109Ssam 		kdbwrite(&c, 1);
9530109Ssam }
9630109Ssam 
9730109Ssam nextchar()
9830109Ssam {
9930109Ssam 
10030109Ssam 	if (eol(rdc())) {
10130109Ssam 		lp--;
10230109Ssam 		return (0);
10330109Ssam 	}
10430109Ssam 	return (lastc);
10530109Ssam }
10630109Ssam 
10730109Ssam quotchar()
10830109Ssam {
10930109Ssam 
11030109Ssam 	if (readchar()=='\\')
11130109Ssam 		return (readchar());
11230109Ssam 	if (lastc=='\'')
11330109Ssam 		return (0);
11430109Ssam 	return (lastc);
11530109Ssam }
11630109Ssam 
11730109Ssam getformat(deformat)
11830109Ssam 	char *deformat;
11930109Ssam {
12030109Ssam 	register char *fptr;
12130109Ssam 	register int quote;
12230109Ssam 
12330120Ssam 	fptr=deformat; quote=0;
12430109Ssam 	while ((quote ? readchar()!=EOR : !eol(readchar())))
12530109Ssam 		if ((*fptr++ = lastc)=='"')
12630109Ssam 			quote = ~quote;
12730109Ssam 	lp--;
12830109Ssam 	if (fptr!=deformat)
12930109Ssam 		*fptr++ = '\0';
13030109Ssam }
131