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