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