xref: /original-bsd/sys/deprecated/kdb/kdb_input.c (revision 4493598c)
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.5 (Berkeley) 05/03/90
7  */
8 
9 #include "../kdb/defs.h"
10 
11 char	line[LINSIZ];
12 char	*kdblp;
13 char	kdbpeekc,kdblastc = EOR;
14 
15 /* input routines */
16 
kdbeol(c)17 kdbeol(c)
18 	char c;
19 {
20 	return (c==EOR || c==';');
21 }
22 
kdbrdc()23 kdbrdc()
24 {
25 	do
26 		(void) kdbreadchar();
27 	while (kdblastc==SP || kdblastc==TB);
28 	return (kdblastc);
29 }
30 
kdbreadchar()31 kdbreadchar()
32 {
33 	static char *erase = "\b \b";
34 
35 	if (kdblp==0) {
36 		kdblp=line;
37 		do {
38 			(void) kdbreadc(kdblp);
39 			if (kdbmkfault)
40 				kdberror((char *)0);
41 			switch (*kdblp) {
42 			case CTRL('h'): case 0177:
43 				if (kdblp > line)
44 					kdbwrite(erase, 3), kdblp--;
45 				break;
46 			case CTRL('u'):
47 				while (kdblp > line)
48 					kdbwrite(erase, 3), kdblp--;
49 				break;
50 			case CTRL('r'):
51 				kdbwrite("^R\n", 3);
52 				if (kdblp > line)
53 					kdbwrite(line, kdblp-line);
54 				break;
55 			case CTRL('w'):
56 				if (kdblp <= line)
57 					break;
58 				do {
59 					if (!isspace(*kdblp))
60 						goto erasenb;
61 					kdbwrite(erase, 3);
62 				} while (--kdblp > line);
63 				break;
64 			erasenb:
65 				do
66 					kdbwrite(erase, 3);
67 				while (--kdblp > line && !isspace(*kdblp));
68 				break;
69 			default:
70 				kdbecho(*kdblp++);
71 				break;
72 			}
73 		} while (kdblp == line || kdblp[-1] != EOR);
74 		*kdblp=0; kdblp=line;
75 	}
76 	if (kdblastc = kdbpeekc)
77 		kdbpeekc=0;
78 	else  if (kdblastc = *kdblp)
79 		kdblp++;
80 	return (kdblastc);
81 }
82 
83 static
kdbecho(c)84 kdbecho(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 
kdbnextchar()97 kdbnextchar()
98 {
99 
100 	if (kdbeol(kdbrdc())) {
101 		kdblp--;
102 		return (0);
103 	}
104 	return (kdblastc);
105 }
106 
kdbquotchar()107 kdbquotchar()
108 {
109 
110 	if (kdbreadchar()=='\\')
111 		return (kdbreadchar());
112 	if (kdblastc=='\'')
113 		return (0);
114 	return (kdblastc);
115 }
116 
kdbgetformat(deformat)117 kdbgetformat(deformat)
118 	char *deformat;
119 {
120 	register char *fptr;
121 	register int quote;
122 
123 	fptr=deformat; quote=0;
124 	while ((quote ? kdbreadchar()!=EOR : !kdbeol(kdbreadchar())))
125 		if ((*fptr++ = kdblastc)=='"')
126 			quote = ~quote;
127 	kdblp--;
128 	if (fptr!=deformat)
129 		*fptr++ = '\0';
130 }
131