xref: /freebsd/sys/ddb/db_input.c (revision 5b81b6b301437eb9a6df491c829475bd29ae5d6c)
15b81b6b3SRodney W. Grimes /*
25b81b6b3SRodney W. Grimes  * Mach Operating System
35b81b6b3SRodney W. Grimes  * Copyright (c) 1991,1990 Carnegie Mellon University
45b81b6b3SRodney W. Grimes  * All Rights Reserved.
55b81b6b3SRodney W. Grimes  *
65b81b6b3SRodney W. Grimes  * Permission to use, copy, modify and distribute this software and its
75b81b6b3SRodney W. Grimes  * documentation is hereby granted, provided that both the copyright
85b81b6b3SRodney W. Grimes  * notice and this permission notice appear in all copies of the
95b81b6b3SRodney W. Grimes  * software, derivative works or modified versions, and any portions
105b81b6b3SRodney W. Grimes  * thereof, and that both notices appear in supporting documentation.
115b81b6b3SRodney W. Grimes  *
125b81b6b3SRodney W. Grimes  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
135b81b6b3SRodney W. Grimes  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
145b81b6b3SRodney W. Grimes  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
155b81b6b3SRodney W. Grimes  *
165b81b6b3SRodney W. Grimes  * Carnegie Mellon requests users of this software to return to
175b81b6b3SRodney W. Grimes  *
185b81b6b3SRodney W. Grimes  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
195b81b6b3SRodney W. Grimes  *  School of Computer Science
205b81b6b3SRodney W. Grimes  *  Carnegie Mellon University
215b81b6b3SRodney W. Grimes  *  Pittsburgh PA 15213-3890
225b81b6b3SRodney W. Grimes  *
235b81b6b3SRodney W. Grimes  * any improvements or extensions that they make and grant Carnegie the
245b81b6b3SRodney W. Grimes  * rights to redistribute these changes.
255b81b6b3SRodney W. Grimes  */
265b81b6b3SRodney W. Grimes /*
275b81b6b3SRodney W. Grimes  * HISTORY
285b81b6b3SRodney W. Grimes  * $Log: db_input.c,v $
295b81b6b3SRodney W. Grimes  * Revision 1.1  1992/03/25  21:45:10  pace
305b81b6b3SRodney W. Grimes  * Initial revision
315b81b6b3SRodney W. Grimes  *
325b81b6b3SRodney W. Grimes  * Revision 2.4  91/02/14  14:41:53  mrt
335b81b6b3SRodney W. Grimes  * 	Add input line editing.
345b81b6b3SRodney W. Grimes  * 	[90/11/11            dbg]
355b81b6b3SRodney W. Grimes  *
365b81b6b3SRodney W. Grimes  * Revision 2.3  91/02/05  17:06:32  mrt
375b81b6b3SRodney W. Grimes  * 	Changed to new Mach copyright
385b81b6b3SRodney W. Grimes  * 	[91/01/31  16:18:13  mrt]
395b81b6b3SRodney W. Grimes  *
405b81b6b3SRodney W. Grimes  * Revision 2.2  90/08/27  21:51:03  dbg
415b81b6b3SRodney W. Grimes  * 	Reduce lint.
425b81b6b3SRodney W. Grimes  * 	[90/08/07            dbg]
435b81b6b3SRodney W. Grimes  * 	Created.
445b81b6b3SRodney W. Grimes  * 	[90/07/25            dbg]
455b81b6b3SRodney W. Grimes  *
465b81b6b3SRodney W. Grimes  */
475b81b6b3SRodney W. Grimes /*
485b81b6b3SRodney W. Grimes  *	Author: David B. Golub, Carnegie Mellon University
495b81b6b3SRodney W. Grimes  *	Date:	7/90
505b81b6b3SRodney W. Grimes  */
515b81b6b3SRodney W. Grimes 
525b81b6b3SRodney W. Grimes #include "param.h"
535b81b6b3SRodney W. Grimes #include "proc.h"
545b81b6b3SRodney W. Grimes #include <ddb/db_output.h>
555b81b6b3SRodney W. Grimes 
565b81b6b3SRodney W. Grimes /*
575b81b6b3SRodney W. Grimes  * Character input and editing.
585b81b6b3SRodney W. Grimes  */
595b81b6b3SRodney W. Grimes 
605b81b6b3SRodney W. Grimes /*
615b81b6b3SRodney W. Grimes  * We don't track output position while editing input,
625b81b6b3SRodney W. Grimes  * since input always ends with a new-line.  We just
635b81b6b3SRodney W. Grimes  * reset the line position at the end.
645b81b6b3SRodney W. Grimes  */
655b81b6b3SRodney W. Grimes char *	db_lbuf_start;	/* start of input line buffer */
665b81b6b3SRodney W. Grimes char *	db_lbuf_end;	/* end of input line buffer */
675b81b6b3SRodney W. Grimes char *	db_lc;		/* current character */
685b81b6b3SRodney W. Grimes char *	db_le;		/* one past last character */
695b81b6b3SRodney W. Grimes 
705b81b6b3SRodney W. Grimes #define	CTRL(c)		((c) & 0x1f)
715b81b6b3SRodney W. Grimes #define	isspace(c)	((c) == ' ' || (c) == '\t')
725b81b6b3SRodney W. Grimes #define	BLANK		' '
735b81b6b3SRodney W. Grimes #define	BACKUP		'\b'
745b81b6b3SRodney W. Grimes 
755b81b6b3SRodney W. Grimes void
765b81b6b3SRodney W. Grimes db_putstring(s, count)
775b81b6b3SRodney W. Grimes 	char	*s;
785b81b6b3SRodney W. Grimes 	int	count;
795b81b6b3SRodney W. Grimes {
805b81b6b3SRodney W. Grimes 	while (--count >= 0)
815b81b6b3SRodney W. Grimes 	    cnputc(*s++);
825b81b6b3SRodney W. Grimes }
835b81b6b3SRodney W. Grimes 
845b81b6b3SRodney W. Grimes void
855b81b6b3SRodney W. Grimes db_putnchars(c, count)
865b81b6b3SRodney W. Grimes 	int	c;
875b81b6b3SRodney W. Grimes 	int	count;
885b81b6b3SRodney W. Grimes {
895b81b6b3SRodney W. Grimes 	while (--count >= 0)
905b81b6b3SRodney W. Grimes 	    cnputc(c);
915b81b6b3SRodney W. Grimes }
925b81b6b3SRodney W. Grimes 
935b81b6b3SRodney W. Grimes /*
945b81b6b3SRodney W. Grimes  * Delete N characters, forward or backward
955b81b6b3SRodney W. Grimes  */
965b81b6b3SRodney W. Grimes #define	DEL_FWD		0
975b81b6b3SRodney W. Grimes #define	DEL_BWD		1
985b81b6b3SRodney W. Grimes void
995b81b6b3SRodney W. Grimes db_delete(n, bwd)
1005b81b6b3SRodney W. Grimes 	int	n;
1015b81b6b3SRodney W. Grimes 	int	bwd;
1025b81b6b3SRodney W. Grimes {
1035b81b6b3SRodney W. Grimes 	register char *p;
1045b81b6b3SRodney W. Grimes 
1055b81b6b3SRodney W. Grimes 	if (bwd) {
1065b81b6b3SRodney W. Grimes 	    db_lc -= n;
1075b81b6b3SRodney W. Grimes 	    db_putnchars(BACKUP, n);
1085b81b6b3SRodney W. Grimes 	}
1095b81b6b3SRodney W. Grimes 	for (p = db_lc; p < db_le-n; p++) {
1105b81b6b3SRodney W. Grimes 	    *p = *(p+n);
1115b81b6b3SRodney W. Grimes 	    cnputc(*p);
1125b81b6b3SRodney W. Grimes 	}
1135b81b6b3SRodney W. Grimes 	db_putnchars(BLANK, n);
1145b81b6b3SRodney W. Grimes 	db_putnchars(BACKUP, db_le - db_lc);
1155b81b6b3SRodney W. Grimes 	db_le -= n;
1165b81b6b3SRodney W. Grimes }
1175b81b6b3SRodney W. Grimes 
1185b81b6b3SRodney W. Grimes /* returns TRUE at end-of-line */
1195b81b6b3SRodney W. Grimes int
1205b81b6b3SRodney W. Grimes db_inputchar(c)
1215b81b6b3SRodney W. Grimes 	int	c;
1225b81b6b3SRodney W. Grimes {
1235b81b6b3SRodney W. Grimes 	switch (c) {
1245b81b6b3SRodney W. Grimes 	    case CTRL('b'):
1255b81b6b3SRodney W. Grimes 		/* back up one character */
1265b81b6b3SRodney W. Grimes 		if (db_lc > db_lbuf_start) {
1275b81b6b3SRodney W. Grimes 		    cnputc(BACKUP);
1285b81b6b3SRodney W. Grimes 		    db_lc--;
1295b81b6b3SRodney W. Grimes 		}
1305b81b6b3SRodney W. Grimes 		break;
1315b81b6b3SRodney W. Grimes 	    case CTRL('f'):
1325b81b6b3SRodney W. Grimes 		/* forward one character */
1335b81b6b3SRodney W. Grimes 		if (db_lc < db_le) {
1345b81b6b3SRodney W. Grimes 		    cnputc(*db_lc);
1355b81b6b3SRodney W. Grimes 		    db_lc++;
1365b81b6b3SRodney W. Grimes 		}
1375b81b6b3SRodney W. Grimes 		break;
1385b81b6b3SRodney W. Grimes 	    case CTRL('a'):
1395b81b6b3SRodney W. Grimes 		/* beginning of line */
1405b81b6b3SRodney W. Grimes 		while (db_lc > db_lbuf_start) {
1415b81b6b3SRodney W. Grimes 		    cnputc(BACKUP);
1425b81b6b3SRodney W. Grimes 		    db_lc--;
1435b81b6b3SRodney W. Grimes 		}
1445b81b6b3SRodney W. Grimes 		break;
1455b81b6b3SRodney W. Grimes 	    case CTRL('e'):
1465b81b6b3SRodney W. Grimes 		/* end of line */
1475b81b6b3SRodney W. Grimes 		while (db_lc < db_le) {
1485b81b6b3SRodney W. Grimes 		    cnputc(*db_lc);
1495b81b6b3SRodney W. Grimes 		    db_lc++;
1505b81b6b3SRodney W. Grimes 		}
1515b81b6b3SRodney W. Grimes 		break;
1525b81b6b3SRodney W. Grimes 	    case CTRL('h'):
1535b81b6b3SRodney W. Grimes 	    case 0177:
1545b81b6b3SRodney W. Grimes 		/* erase previous character */
1555b81b6b3SRodney W. Grimes 		if (db_lc > db_lbuf_start)
1565b81b6b3SRodney W. Grimes 		    db_delete(1, DEL_BWD);
1575b81b6b3SRodney W. Grimes 		break;
1585b81b6b3SRodney W. Grimes 	    case CTRL('d'):
1595b81b6b3SRodney W. Grimes 		/* erase next character */
1605b81b6b3SRodney W. Grimes 		if (db_lc < db_le)
1615b81b6b3SRodney W. Grimes 		    db_delete(1, DEL_FWD);
1625b81b6b3SRodney W. Grimes 		break;
1635b81b6b3SRodney W. Grimes 	    case CTRL('k'):
1645b81b6b3SRodney W. Grimes 		/* delete to end of line */
1655b81b6b3SRodney W. Grimes 		if (db_lc < db_le)
1665b81b6b3SRodney W. Grimes 		    db_delete(db_le - db_lc, DEL_FWD);
1675b81b6b3SRodney W. Grimes 		break;
1685b81b6b3SRodney W. Grimes 	    case CTRL('t'):
1695b81b6b3SRodney W. Grimes 		/* twiddle last 2 characters */
1705b81b6b3SRodney W. Grimes 		if (db_lc >= db_lbuf_start + 2) {
1715b81b6b3SRodney W. Grimes 		    c = db_lc[-2];
1725b81b6b3SRodney W. Grimes 		    db_lc[-2] = db_lc[-1];
1735b81b6b3SRodney W. Grimes 		    db_lc[-1] = c;
1745b81b6b3SRodney W. Grimes 		    cnputc(BACKUP);
1755b81b6b3SRodney W. Grimes 		    cnputc(BACKUP);
1765b81b6b3SRodney W. Grimes 		    cnputc(db_lc[-2]);
1775b81b6b3SRodney W. Grimes 		    cnputc(db_lc[-1]);
1785b81b6b3SRodney W. Grimes 		}
1795b81b6b3SRodney W. Grimes 		break;
1805b81b6b3SRodney W. Grimes 	    case CTRL('r'):
1815b81b6b3SRodney W. Grimes 		db_putstring("^R\n", 3);
1825b81b6b3SRodney W. Grimes 		if (db_le > db_lbuf_start) {
1835b81b6b3SRodney W. Grimes 		    db_putstring(db_lbuf_start, db_le - db_lbuf_start);
1845b81b6b3SRodney W. Grimes 		    db_putnchars(BACKUP, db_le - db_lc);
1855b81b6b3SRodney W. Grimes 		}
1865b81b6b3SRodney W. Grimes 		break;
1875b81b6b3SRodney W. Grimes 	    case '\n':
1885b81b6b3SRodney W. Grimes 	    case '\r':
1895b81b6b3SRodney W. Grimes 		*db_le++ = c;
1905b81b6b3SRodney W. Grimes 		return (1);
1915b81b6b3SRodney W. Grimes 	    default:
1925b81b6b3SRodney W. Grimes 		if (db_le == db_lbuf_end) {
1935b81b6b3SRodney W. Grimes 		    cnputc('\007');
1945b81b6b3SRodney W. Grimes 		}
1955b81b6b3SRodney W. Grimes 		else if (c >= ' ' && c <= '~') {
1965b81b6b3SRodney W. Grimes 		    register char *p;
1975b81b6b3SRodney W. Grimes 
1985b81b6b3SRodney W. Grimes 		    for (p = db_le; p > db_lc; p--)
1995b81b6b3SRodney W. Grimes 			*p = *(p-1);
2005b81b6b3SRodney W. Grimes 		    *db_lc++ = c;
2015b81b6b3SRodney W. Grimes 		    db_le++;
2025b81b6b3SRodney W. Grimes 		    cnputc(c);
2035b81b6b3SRodney W. Grimes 		    db_putstring(db_lc, db_le - db_lc);
2045b81b6b3SRodney W. Grimes 		    db_putnchars(BACKUP, db_le - db_lc);
2055b81b6b3SRodney W. Grimes 		}
2065b81b6b3SRodney W. Grimes 		break;
2075b81b6b3SRodney W. Grimes 	}
2085b81b6b3SRodney W. Grimes 	return (0);
2095b81b6b3SRodney W. Grimes }
2105b81b6b3SRodney W. Grimes 
2115b81b6b3SRodney W. Grimes int
2125b81b6b3SRodney W. Grimes db_readline(lstart, lsize)
2135b81b6b3SRodney W. Grimes 	char *	lstart;
2145b81b6b3SRodney W. Grimes 	int	lsize;
2155b81b6b3SRodney W. Grimes {
2165b81b6b3SRodney W. Grimes 	db_force_whitespace();	/* synch output position */
2175b81b6b3SRodney W. Grimes 
2185b81b6b3SRodney W. Grimes 	db_lbuf_start = lstart;
2195b81b6b3SRodney W. Grimes 	db_lbuf_end   = lstart + lsize;
2205b81b6b3SRodney W. Grimes 	db_lc = lstart;
2215b81b6b3SRodney W. Grimes 	db_le = lstart;
2225b81b6b3SRodney W. Grimes 
2235b81b6b3SRodney W. Grimes 	while (!db_inputchar(cngetc()))
2245b81b6b3SRodney W. Grimes 	    continue;
2255b81b6b3SRodney W. Grimes 
2265b81b6b3SRodney W. Grimes 	db_putchar('\n');	/* synch output position */
2275b81b6b3SRodney W. Grimes 
2285b81b6b3SRodney W. Grimes 	*db_le = 0;
2295b81b6b3SRodney W. Grimes 	return (db_le - db_lbuf_start);
2305b81b6b3SRodney W. Grimes }
2315b81b6b3SRodney W. Grimes 
2325b81b6b3SRodney W. Grimes void
2335b81b6b3SRodney W. Grimes db_check_interrupt()
2345b81b6b3SRodney W. Grimes {
2355b81b6b3SRodney W. Grimes 	register int	c;
2365b81b6b3SRodney W. Grimes 
2375b81b6b3SRodney W. Grimes 	c = cnmaygetc();
2385b81b6b3SRodney W. Grimes 	switch (c) {
2395b81b6b3SRodney W. Grimes 	    case -1:		/* no character */
2405b81b6b3SRodney W. Grimes 		return;
2415b81b6b3SRodney W. Grimes 
2425b81b6b3SRodney W. Grimes 	    case CTRL('c'):
2435b81b6b3SRodney W. Grimes 		db_error((char *)0);
2445b81b6b3SRodney W. Grimes 		/*NOTREACHED*/
2455b81b6b3SRodney W. Grimes 
2465b81b6b3SRodney W. Grimes 	    case CTRL('s'):
2475b81b6b3SRodney W. Grimes 		do {
2485b81b6b3SRodney W. Grimes 		    c = cnmaygetc();
2495b81b6b3SRodney W. Grimes 		    if (c == CTRL('c'))
2505b81b6b3SRodney W. Grimes 			db_error((char *)0);
2515b81b6b3SRodney W. Grimes 		} while (c != CTRL('q'));
2525b81b6b3SRodney W. Grimes 		break;
2535b81b6b3SRodney W. Grimes 
2545b81b6b3SRodney W. Grimes 	    default:
2555b81b6b3SRodney W. Grimes 		/* drop on floor */
2565b81b6b3SRodney W. Grimes 		break;
2575b81b6b3SRodney W. Grimes 	}
2585b81b6b3SRodney W. Grimes }
2595b81b6b3SRodney W. Grimes 
2605b81b6b3SRodney W. Grimes cnmaygetc ()
2615b81b6b3SRodney W. Grimes {
2625b81b6b3SRodney W. Grimes 	return (-1);
2635b81b6b3SRodney W. Grimes }
2645b81b6b3SRodney W. Grimes 
2655b81b6b3SRodney W. Grimes /* called from kdb_trap in db_interface.c */
2665b81b6b3SRodney W. Grimes cnpollc (flag)
2675b81b6b3SRodney W. Grimes {
2685b81b6b3SRodney W. Grimes }
269