xref: /csrg-svn/sys/tahoe/stand/vdformat/cons.c (revision 37506)
1*37506Smckusick /*	cons.c	1.2	89/04/25	*/
234621Skarels 
334621Skarels /*
434621Skarels  * Asynchronous versions of getchar and gets
534621Skarels  * for use in disk formatter.
634621Skarels  */
7*37506Smckusick #include "machine/mtpr.h"
834621Skarels 
934621Skarels #include "param.h"
1034621Skarels #include "../tahoe/cp.h"
1134621Skarels 
1234621Skarels int	wait_for_char = 1;		/* synchronous by default */
1334621Skarels extern	struct	cpdcb_i cpin;		/* in ../prf.c */
1434621Skarels 
agetchar()1534621Skarels agetchar()
1634621Skarels {
1734621Skarels 	static	char_read = 0;		/* read operation pending */
1834621Skarels 	char	c;
1934621Skarels 
2034621Skarels 	if (!char_read) {
2134621Skarels 		char_read = 1;
2234621Skarels 		cpin.cp_hdr.cp_unit = CPCONS;	/* Resets done bit */
2334621Skarels 		cpin.cp_hdr.cp_comm = CPREAD;
2434621Skarels 		cpin.cp_hdr.cp_count = 1;
2534621Skarels 		mtpr(CPMDCB, &cpin);
2634621Skarels 	}
2734621Skarels 	uncache(&cpin.cp_hdr.cp_unit);
2834621Skarels 	if (wait_for_char) {
2934621Skarels 		while ((cpin.cp_hdr.cp_unit & CPDONE) == 0)
3034621Skarels 			uncache(&cpin.cp_hdr.cp_unit);
3134621Skarels 	} else
3234621Skarels 		if ((cpin.cp_hdr.cp_unit & CPDONE) == 0)
3334621Skarels 			return (0);
3434621Skarels 	uncache(&cpin.cpi_buf[0]);
3534621Skarels 	c = cpin.cpi_buf[0] & 0x7f;
3634621Skarels 	char_read = 0;
3734621Skarels 	if (c == '\r')
3834621Skarels 		c = '\n';
3934621Skarels 	if (c != '\b' && c != '\177')
4034621Skarels 		putchar(c);
4134621Skarels 	return (c);
4234621Skarels }
4334621Skarels 
agets(buf)4434621Skarels agets(buf)
4534621Skarels 	char *buf;
4634621Skarels {
4734621Skarels 	static char	line[256];
4834621Skarels 	static char	*lp = line;
4934621Skarels 	register	c;
5034621Skarels 
5134621Skarels 	*buf = '\0';
5234621Skarels 	for (;;) {
5334621Skarels 		c = agetchar() & 0177;
5434621Skarels 		switch(c) {
5534621Skarels 		case '\0' :
5634621Skarels 			if (!wait_for_char)
5734621Skarels 				return;
5834621Skarels 			break;
5934621Skarels 		case '\n':
6034621Skarels 		case '\r':
6134621Skarels 			c = '\n';
6234621Skarels 			*lp = '\0';
6334621Skarels 			strcpy(buf, line);
6434621Skarels 			lp = line;
6534621Skarels 			return;
6634621Skarels 		case '\b':
6734621Skarels 		case '\177':
6834621Skarels 			if (lp > line) {
6934621Skarels 				lp--;
7034621Skarels 				putchar('\b');
7134621Skarels 				putchar(' ');
7234621Skarels 				putchar('\b');
7334621Skarels 			}
7434621Skarels 			continue;
7534621Skarels 		case '#':
7634621Skarels 			lp--;
7734621Skarels 			if (lp < line)
7834621Skarels 				lp = line;
7934621Skarels 			continue;
8034621Skarels 		case '@':
8134621Skarels 		case 'u'&037:
8234621Skarels 			lp = line;
8334621Skarels 			putchar('\n');
8434621Skarels 			continue;
8534621Skarels 		default:
8634621Skarels 			if ((lp - line) < 256)
8734621Skarels 				*lp++ = c;
8834621Skarels 		}
8934621Skarels 	}
9034621Skarels }
91