db_input.c revision 1.2
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 * $Id: db_input.c,v 1.2 1993/05/20 03:39:15 cgd Exp $
28 *
29 * HISTORY
30 * $Log: db_input.c,v $
31 * Revision 1.2  1993/05/20 03:39:15  cgd
32 * add explicit rcs id
33 *
34 * Revision 1.1.1.1  1993/03/21  09:46:26  cgd
35 * initial import of 386bsd-0.1 sources
36 *
37 * Revision 1.1  1992/03/25  21:45:10  pace
38 * Initial revision
39 *
40 * Revision 2.4  91/02/14  14:41:53  mrt
41 * 	Add input line editing.
42 * 	[90/11/11            dbg]
43 *
44 * Revision 2.3  91/02/05  17:06:32  mrt
45 * 	Changed to new Mach copyright
46 * 	[91/01/31  16:18:13  mrt]
47 *
48 * Revision 2.2  90/08/27  21:51:03  dbg
49 * 	Reduce lint.
50 * 	[90/08/07            dbg]
51 * 	Created.
52 * 	[90/07/25            dbg]
53 *
54 */
55/*
56 *	Author: David B. Golub, Carnegie Mellon University
57 *	Date:	7/90
58 */
59
60#include "param.h"
61#include "proc.h"
62#include <ddb/db_output.h>
63
64/*
65 * Character input and editing.
66 */
67
68/*
69 * We don't track output position while editing input,
70 * since input always ends with a new-line.  We just
71 * reset the line position at the end.
72 */
73char *	db_lbuf_start;	/* start of input line buffer */
74char *	db_lbuf_end;	/* end of input line buffer */
75char *	db_lc;		/* current character */
76char *	db_le;		/* one past last character */
77
78#define	CTRL(c)		((c) & 0x1f)
79#define	isspace(c)	((c) == ' ' || (c) == '\t')
80#define	BLANK		' '
81#define	BACKUP		'\b'
82
83void
84db_putstring(s, count)
85	char	*s;
86	int	count;
87{
88	while (--count >= 0)
89	    cnputc(*s++);
90}
91
92void
93db_putnchars(c, count)
94	int	c;
95	int	count;
96{
97	while (--count >= 0)
98	    cnputc(c);
99}
100
101/*
102 * Delete N characters, forward or backward
103 */
104#define	DEL_FWD		0
105#define	DEL_BWD		1
106void
107db_delete(n, bwd)
108	int	n;
109	int	bwd;
110{
111	register char *p;
112
113	if (bwd) {
114	    db_lc -= n;
115	    db_putnchars(BACKUP, n);
116	}
117	for (p = db_lc; p < db_le-n; p++) {
118	    *p = *(p+n);
119	    cnputc(*p);
120	}
121	db_putnchars(BLANK, n);
122	db_putnchars(BACKUP, db_le - db_lc);
123	db_le -= n;
124}
125
126/* returns TRUE at end-of-line */
127int
128db_inputchar(c)
129	int	c;
130{
131	switch (c) {
132	    case CTRL('b'):
133		/* back up one character */
134		if (db_lc > db_lbuf_start) {
135		    cnputc(BACKUP);
136		    db_lc--;
137		}
138		break;
139	    case CTRL('f'):
140		/* forward one character */
141		if (db_lc < db_le) {
142		    cnputc(*db_lc);
143		    db_lc++;
144		}
145		break;
146	    case CTRL('a'):
147		/* beginning of line */
148		while (db_lc > db_lbuf_start) {
149		    cnputc(BACKUP);
150		    db_lc--;
151		}
152		break;
153	    case CTRL('e'):
154		/* end of line */
155		while (db_lc < db_le) {
156		    cnputc(*db_lc);
157		    db_lc++;
158		}
159		break;
160	    case CTRL('h'):
161	    case 0177:
162		/* erase previous character */
163		if (db_lc > db_lbuf_start)
164		    db_delete(1, DEL_BWD);
165		break;
166	    case CTRL('d'):
167		/* erase next character */
168		if (db_lc < db_le)
169		    db_delete(1, DEL_FWD);
170		break;
171	    case CTRL('k'):
172		/* delete to end of line */
173		if (db_lc < db_le)
174		    db_delete(db_le - db_lc, DEL_FWD);
175		break;
176	    case CTRL('t'):
177		/* twiddle last 2 characters */
178		if (db_lc >= db_lbuf_start + 2) {
179		    c = db_lc[-2];
180		    db_lc[-2] = db_lc[-1];
181		    db_lc[-1] = c;
182		    cnputc(BACKUP);
183		    cnputc(BACKUP);
184		    cnputc(db_lc[-2]);
185		    cnputc(db_lc[-1]);
186		}
187		break;
188	    case CTRL('r'):
189		db_putstring("^R\n", 3);
190		if (db_le > db_lbuf_start) {
191		    db_putstring(db_lbuf_start, db_le - db_lbuf_start);
192		    db_putnchars(BACKUP, db_le - db_lc);
193		}
194		break;
195	    case '\n':
196	    case '\r':
197		*db_le++ = c;
198		return (1);
199	    default:
200		if (db_le == db_lbuf_end) {
201		    cnputc('\007');
202		}
203		else if (c >= ' ' && c <= '~') {
204		    register char *p;
205
206		    for (p = db_le; p > db_lc; p--)
207			*p = *(p-1);
208		    *db_lc++ = c;
209		    db_le++;
210		    cnputc(c);
211		    db_putstring(db_lc, db_le - db_lc);
212		    db_putnchars(BACKUP, db_le - db_lc);
213		}
214		break;
215	}
216	return (0);
217}
218
219int
220db_readline(lstart, lsize)
221	char *	lstart;
222	int	lsize;
223{
224	db_force_whitespace();	/* synch output position */
225
226	db_lbuf_start = lstart;
227	db_lbuf_end   = lstart + lsize;
228	db_lc = lstart;
229	db_le = lstart;
230
231	while (!db_inputchar(cngetc()))
232	    continue;
233
234	db_putchar('\n');	/* synch output position */
235
236	*db_le = 0;
237	return (db_le - db_lbuf_start);
238}
239
240void
241db_check_interrupt()
242{
243	register int	c;
244
245	c = cnmaygetc();
246	switch (c) {
247	    case -1:		/* no character */
248		return;
249
250	    case CTRL('c'):
251		db_error((char *)0);
252		/*NOTREACHED*/
253
254	    case CTRL('s'):
255		do {
256		    c = cnmaygetc();
257		    if (c == CTRL('c'))
258			db_error((char *)0);
259		} while (c != CTRL('q'));
260		break;
261
262	    default:
263		/* drop on floor */
264		break;
265	}
266}
267
268cnmaygetc ()
269{
270	return (-1);
271}
272
273/* called from kdb_trap in db_interface.c */
274cnpollc (flag)
275{
276}
277