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