xref: /csrg-svn/sys/deprecated/kdb/kdb_input.c (revision 30109)
1*30109Ssam /*	kdb_input.c	7.1	86/11/20	*/
2*30109Ssam 
3*30109Ssam #include "../kdb/defs.h"
4*30109Ssam 
5*30109Ssam char	line[LINSIZ];
6*30109Ssam char	*lp;
7*30109Ssam char	peekc,lastc = EOR;
8*30109Ssam int	eof;
9*30109Ssam 
10*30109Ssam /* input routines */
11*30109Ssam 
12*30109Ssam eol(c)
13*30109Ssam 	char c;
14*30109Ssam {
15*30109Ssam 	return (c==EOR || c==';');
16*30109Ssam }
17*30109Ssam 
18*30109Ssam rdc()
19*30109Ssam {
20*30109Ssam 	do
21*30109Ssam 		readchar();
22*30109Ssam 	while (lastc==SP || lastc==TB);
23*30109Ssam 	return (lastc);
24*30109Ssam }
25*30109Ssam 
26*30109Ssam readchar()
27*30109Ssam {
28*30109Ssam 	static char *erase = "\b \b";
29*30109Ssam 
30*30109Ssam 	if (lp==0) {
31*30109Ssam 		lp=line;
32*30109Ssam 		do {
33*30109Ssam 			(void) kdbreadc(lp);
34*30109Ssam 			if (mkfault)
35*30109Ssam 				error(0);
36*30109Ssam 			switch (*lp) {
37*30109Ssam 			case CTRL(h): case 0177:
38*30109Ssam 				if (lp > line)
39*30109Ssam 					kdbwrite(erase, 3), lp--;
40*30109Ssam 				break;
41*30109Ssam 			case CTRL(u):
42*30109Ssam 				while (lp > line)
43*30109Ssam 					kdbwrite(erase, 3), lp--;
44*30109Ssam 				break;
45*30109Ssam 			case CTRL(r):
46*30109Ssam 				kdbwrite("^R\n", 3);
47*30109Ssam 				if (lp > line)
48*30109Ssam 					kdbwrite(line, lp-line);
49*30109Ssam 				break;
50*30109Ssam 			case CTRL(w):
51*30109Ssam 				if (lp <= line)
52*30109Ssam 					break;
53*30109Ssam 				do {
54*30109Ssam 					if (!isspace(*lp))
55*30109Ssam 						goto erasenb;
56*30109Ssam 					kdbwrite(erase, 3);
57*30109Ssam 				} while (--lp > line);
58*30109Ssam 				break;
59*30109Ssam 			erasenb:
60*30109Ssam 				do
61*30109Ssam 					kdbwrite(erase, 3);
62*30109Ssam 				while (--lp > line && !isspace(*lp));
63*30109Ssam 				break;
64*30109Ssam 			default:
65*30109Ssam 				echo(*lp++);
66*30109Ssam 				break;
67*30109Ssam 			}
68*30109Ssam 		} while (lp == line || lp[-1] != EOR);
69*30109Ssam 		*lp=0; lp=line;
70*30109Ssam 	}
71*30109Ssam 	if (lastc = peekc)
72*30109Ssam 		peekc=0;
73*30109Ssam 	else  if (lastc = *lp)
74*30109Ssam 		lp++;
75*30109Ssam 	return (lastc);
76*30109Ssam }
77*30109Ssam 
78*30109Ssam static
79*30109Ssam echo(c)
80*30109Ssam 	char c;
81*30109Ssam {
82*30109Ssam 	char buf[2];
83*30109Ssam 
84*30109Ssam 	if (c==0177 || (c<SP && c != TB && c != EOR)) {
85*30109Ssam 		buf[0] = '^';
86*30109Ssam 		buf[1] = c ^ 0100;
87*30109Ssam 		kdbwrite(buf, 2);
88*30109Ssam 	} else
89*30109Ssam 		kdbwrite(&c, 1);
90*30109Ssam }
91*30109Ssam 
92*30109Ssam nextchar()
93*30109Ssam {
94*30109Ssam 
95*30109Ssam 	if (eol(rdc())) {
96*30109Ssam 		lp--;
97*30109Ssam 		return (0);
98*30109Ssam 	}
99*30109Ssam 	return (lastc);
100*30109Ssam }
101*30109Ssam 
102*30109Ssam quotchar()
103*30109Ssam {
104*30109Ssam 
105*30109Ssam 	if (readchar()=='\\')
106*30109Ssam 		return (readchar());
107*30109Ssam 	if (lastc=='\'')
108*30109Ssam 		return (0);
109*30109Ssam 	return (lastc);
110*30109Ssam }
111*30109Ssam 
112*30109Ssam getformat(deformat)
113*30109Ssam 	char *deformat;
114*30109Ssam {
115*30109Ssam 	register char *fptr;
116*30109Ssam 	register int quote;
117*30109Ssam 
118*30109Ssam 	fptr=deformat; quote=FALSE;
119*30109Ssam 	while ((quote ? readchar()!=EOR : !eol(readchar())))
120*30109Ssam 		if ((*fptr++ = lastc)=='"')
121*30109Ssam 			quote = ~quote;
122*30109Ssam 	lp--;
123*30109Ssam 	if (fptr!=deformat)
124*30109Ssam 		*fptr++ = '\0';
125*30109Ssam }
126