This commit was generated by cvs2svn to track changes on a CVS vendor
[unix-history] / sys / ddb / db_input.c
CommitLineData
15637ed4
RG
1/*
2 * Mach Operating System
3 * Copyright (c) 1991,1990 Carnegie Mellon University
4 * All Rights Reserved.
5 *
6 * Permission to use, copy, modify and distribute this software and its
7 * documentation is hereby granted, provided that both the copyright
8 * notice and this permission notice appear in all copies of the
9 * software, derivative works or modified versions, and any portions
10 * thereof, and that both notices appear in supporting documentation.
11 *
12 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
13 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
14 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
15 *
16 * Carnegie Mellon requests users of this software to return to
17 *
18 * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
19 * School of Computer Science
20 * Carnegie Mellon University
21 * Pittsburgh PA 15213-3890
22 *
23 * any improvements or extensions that they make and grant Carnegie the
24 * rights to redistribute these changes.
25 */
26/*
27 * HISTORY
28 * $Log: db_input.c,v $
29 * Revision 1.1 1992/03/25 21:45:10 pace
30 * Initial revision
31 *
32 * Revision 2.4 91/02/14 14:41:53 mrt
33 * Add input line editing.
34 * [90/11/11 dbg]
35 *
36 * Revision 2.3 91/02/05 17:06:32 mrt
37 * Changed to new Mach copyright
38 * [91/01/31 16:18:13 mrt]
39 *
40 * Revision 2.2 90/08/27 21:51:03 dbg
41 * Reduce lint.
42 * [90/08/07 dbg]
43 * Created.
44 * [90/07/25 dbg]
45 *
46 */
47/*
48 * Author: David B. Golub, Carnegie Mellon University
49 * Date: 7/90
50 */
51
52#include "param.h"
53#include "proc.h"
54#include <ddb/db_output.h>
55
56/*
57 * Character input and editing.
58 */
59
60/*
61 * We don't track output position while editing input,
62 * since input always ends with a new-line. We just
63 * reset the line position at the end.
64 */
65char * db_lbuf_start; /* start of input line buffer */
66char * db_lbuf_end; /* end of input line buffer */
67char * db_lc; /* current character */
68char * db_le; /* one past last character */
69
70#define CTRL(c) ((c) & 0x1f)
71#define isspace(c) ((c) == ' ' || (c) == '\t')
72#define BLANK ' '
73#define BACKUP '\b'
74
75void
76db_putstring(s, count)
77 char *s;
78 int count;
79{
80 while (--count >= 0)
81 cnputc(*s++);
82}
83
84void
85db_putnchars(c, count)
86 int c;
87 int count;
88{
89 while (--count >= 0)
90 cnputc(c);
91}
92
93/*
94 * Delete N characters, forward or backward
95 */
96#define DEL_FWD 0
97#define DEL_BWD 1
98void
99db_delete(n, bwd)
100 int n;
101 int bwd;
102{
103 register char *p;
104
105 if (bwd) {
106 db_lc -= n;
107 db_putnchars(BACKUP, n);
108 }
109 for (p = db_lc; p < db_le-n; p++) {
110 *p = *(p+n);
111 cnputc(*p);
112 }
113 db_putnchars(BLANK, n);
114 db_putnchars(BACKUP, db_le - db_lc);
115 db_le -= n;
116}
117
118/* returns TRUE at end-of-line */
119int
120db_inputchar(c)
121 int c;
122{
123 switch (c) {
124 case CTRL('b'):
125 /* back up one character */
126 if (db_lc > db_lbuf_start) {
127 cnputc(BACKUP);
128 db_lc--;
129 }
130 break;
131 case CTRL('f'):
132 /* forward one character */
133 if (db_lc < db_le) {
134 cnputc(*db_lc);
135 db_lc++;
136 }
137 break;
138 case CTRL('a'):
139 /* beginning of line */
140 while (db_lc > db_lbuf_start) {
141 cnputc(BACKUP);
142 db_lc--;
143 }
144 break;
145 case CTRL('e'):
146 /* end of line */
147 while (db_lc < db_le) {
148 cnputc(*db_lc);
149 db_lc++;
150 }
151 break;
152 case CTRL('h'):
153 case 0177:
154 /* erase previous character */
155 if (db_lc > db_lbuf_start)
156 db_delete(1, DEL_BWD);
157 break;
158 case CTRL('d'):
159 /* erase next character */
160 if (db_lc < db_le)
161 db_delete(1, DEL_FWD);
162 break;
163 case CTRL('k'):
164 /* delete to end of line */
165 if (db_lc < db_le)
166 db_delete(db_le - db_lc, DEL_FWD);
167 break;
168 case CTRL('t'):
169 /* twiddle last 2 characters */
170 if (db_lc >= db_lbuf_start + 2) {
171 c = db_lc[-2];
172 db_lc[-2] = db_lc[-1];
173 db_lc[-1] = c;
174 cnputc(BACKUP);
175 cnputc(BACKUP);
176 cnputc(db_lc[-2]);
177 cnputc(db_lc[-1]);
178 }
179 break;
180 case CTRL('r'):
181 db_putstring("^R\n", 3);
182 if (db_le > db_lbuf_start) {
183 db_putstring(db_lbuf_start, db_le - db_lbuf_start);
184 db_putnchars(BACKUP, db_le - db_lc);
185 }
186 break;
187 case '\n':
188 case '\r':
189 *db_le++ = c;
190 return (1);
191 default:
192 if (db_le == db_lbuf_end) {
193 cnputc('\007');
194 }
195 else if (c >= ' ' && c <= '~') {
196 register char *p;
197
198 for (p = db_le; p > db_lc; p--)
199 *p = *(p-1);
200 *db_lc++ = c;
201 db_le++;
202 cnputc(c);
203 db_putstring(db_lc, db_le - db_lc);
204 db_putnchars(BACKUP, db_le - db_lc);
205 }
206 break;
207 }
208 return (0);
209}
210
211int
212db_readline(lstart, lsize)
213 char * lstart;
214 int lsize;
215{
216 db_force_whitespace(); /* synch output position */
217
218 db_lbuf_start = lstart;
219 db_lbuf_end = lstart + lsize;
220 db_lc = lstart;
221 db_le = lstart;
222
223 while (!db_inputchar(cngetc()))
224 continue;
225
226 db_putchar('\n'); /* synch output position */
227
228 *db_le = 0;
229 return (db_le - db_lbuf_start);
230}
231
232void
233db_check_interrupt()
234{
235 register int c;
236
237 c = cnmaygetc();
238 switch (c) {
239 case -1: /* no character */
240 return;
241
242 case CTRL('c'):
243 db_error((char *)0);
244 /*NOTREACHED*/
245
246 case CTRL('s'):
247 do {
248 c = cnmaygetc();
249 if (c == CTRL('c'))
250 db_error((char *)0);
251 } while (c != CTRL('q'));
252 break;
253
254 default:
255 /* drop on floor */
256 break;
257 }
258}
259
260cnmaygetc ()
261{
262 return (-1);
263}
264
265/* called from kdb_trap in db_interface.c */
266cnpollc (flag)
267{
268}