xref: /csrg-svn/sys/deprecated/kdb/kdb_input.c (revision 30120)
1*30120Ssam /*	kdb_input.c	7.2	86/11/20	*/
230109Ssam 
330109Ssam #include "../kdb/defs.h"
430109Ssam 
530109Ssam char	line[LINSIZ];
630109Ssam char	*lp;
730109Ssam char	peekc,lastc = EOR;
830109Ssam int	eof;
930109Ssam 
1030109Ssam /* input routines */
1130109Ssam 
1230109Ssam eol(c)
1330109Ssam 	char c;
1430109Ssam {
1530109Ssam 	return (c==EOR || c==';');
1630109Ssam }
1730109Ssam 
1830109Ssam rdc()
1930109Ssam {
2030109Ssam 	do
2130109Ssam 		readchar();
2230109Ssam 	while (lastc==SP || lastc==TB);
2330109Ssam 	return (lastc);
2430109Ssam }
2530109Ssam 
2630109Ssam readchar()
2730109Ssam {
2830109Ssam 	static char *erase = "\b \b";
2930109Ssam 
3030109Ssam 	if (lp==0) {
3130109Ssam 		lp=line;
3230109Ssam 		do {
3330109Ssam 			(void) kdbreadc(lp);
3430109Ssam 			if (mkfault)
3530109Ssam 				error(0);
3630109Ssam 			switch (*lp) {
3730109Ssam 			case CTRL(h): case 0177:
3830109Ssam 				if (lp > line)
3930109Ssam 					kdbwrite(erase, 3), lp--;
4030109Ssam 				break;
4130109Ssam 			case CTRL(u):
4230109Ssam 				while (lp > line)
4330109Ssam 					kdbwrite(erase, 3), lp--;
4430109Ssam 				break;
4530109Ssam 			case CTRL(r):
4630109Ssam 				kdbwrite("^R\n", 3);
4730109Ssam 				if (lp > line)
4830109Ssam 					kdbwrite(line, lp-line);
4930109Ssam 				break;
5030109Ssam 			case CTRL(w):
5130109Ssam 				if (lp <= line)
5230109Ssam 					break;
5330109Ssam 				do {
5430109Ssam 					if (!isspace(*lp))
5530109Ssam 						goto erasenb;
5630109Ssam 					kdbwrite(erase, 3);
5730109Ssam 				} while (--lp > line);
5830109Ssam 				break;
5930109Ssam 			erasenb:
6030109Ssam 				do
6130109Ssam 					kdbwrite(erase, 3);
6230109Ssam 				while (--lp > line && !isspace(*lp));
6330109Ssam 				break;
6430109Ssam 			default:
6530109Ssam 				echo(*lp++);
6630109Ssam 				break;
6730109Ssam 			}
6830109Ssam 		} while (lp == line || lp[-1] != EOR);
6930109Ssam 		*lp=0; lp=line;
7030109Ssam 	}
7130109Ssam 	if (lastc = peekc)
7230109Ssam 		peekc=0;
7330109Ssam 	else  if (lastc = *lp)
7430109Ssam 		lp++;
7530109Ssam 	return (lastc);
7630109Ssam }
7730109Ssam 
7830109Ssam static
7930109Ssam echo(c)
8030109Ssam 	char c;
8130109Ssam {
8230109Ssam 	char buf[2];
8330109Ssam 
8430109Ssam 	if (c==0177 || (c<SP && c != TB && c != EOR)) {
8530109Ssam 		buf[0] = '^';
8630109Ssam 		buf[1] = c ^ 0100;
8730109Ssam 		kdbwrite(buf, 2);
8830109Ssam 	} else
8930109Ssam 		kdbwrite(&c, 1);
9030109Ssam }
9130109Ssam 
9230109Ssam nextchar()
9330109Ssam {
9430109Ssam 
9530109Ssam 	if (eol(rdc())) {
9630109Ssam 		lp--;
9730109Ssam 		return (0);
9830109Ssam 	}
9930109Ssam 	return (lastc);
10030109Ssam }
10130109Ssam 
10230109Ssam quotchar()
10330109Ssam {
10430109Ssam 
10530109Ssam 	if (readchar()=='\\')
10630109Ssam 		return (readchar());
10730109Ssam 	if (lastc=='\'')
10830109Ssam 		return (0);
10930109Ssam 	return (lastc);
11030109Ssam }
11130109Ssam 
11230109Ssam getformat(deformat)
11330109Ssam 	char *deformat;
11430109Ssam {
11530109Ssam 	register char *fptr;
11630109Ssam 	register int quote;
11730109Ssam 
118*30120Ssam 	fptr=deformat; quote=0;
11930109Ssam 	while ((quote ? readchar()!=EOR : !eol(readchar())))
12030109Ssam 		if ((*fptr++ = lastc)=='"')
12130109Ssam 			quote = ~quote;
12230109Ssam 	lp--;
12330109Ssam 	if (fptr!=deformat)
12430109Ssam 		*fptr++ = '\0';
12530109Ssam }
126