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