xref: /csrg-svn/sys/tahoe/stand/vdformat/cons.c (revision 34621)
1*34621Skarels /*	cons.c	1.1	88/06/02	*/
2*34621Skarels 
3*34621Skarels /*
4*34621Skarels  * Asynchronous versions of getchar and gets
5*34621Skarels  * for use in disk formatter.
6*34621Skarels  */
7*34621Skarels #include "../machine/mtpr.h"
8*34621Skarels 
9*34621Skarels #include "param.h"
10*34621Skarels #include "../tahoe/cp.h"
11*34621Skarels 
12*34621Skarels int	wait_for_char = 1;		/* synchronous by default */
13*34621Skarels extern	struct	cpdcb_i cpin;		/* in ../prf.c */
14*34621Skarels 
15*34621Skarels agetchar()
16*34621Skarels {
17*34621Skarels 	static	char_read = 0;		/* read operation pending */
18*34621Skarels 	char	c;
19*34621Skarels 
20*34621Skarels 	if (!char_read) {
21*34621Skarels 		char_read = 1;
22*34621Skarels 		cpin.cp_hdr.cp_unit = CPCONS;	/* Resets done bit */
23*34621Skarels 		cpin.cp_hdr.cp_comm = CPREAD;
24*34621Skarels 		cpin.cp_hdr.cp_count = 1;
25*34621Skarels 		mtpr(CPMDCB, &cpin);
26*34621Skarels 	}
27*34621Skarels 	uncache(&cpin.cp_hdr.cp_unit);
28*34621Skarels 	if (wait_for_char) {
29*34621Skarels 		while ((cpin.cp_hdr.cp_unit & CPDONE) == 0)
30*34621Skarels 			uncache(&cpin.cp_hdr.cp_unit);
31*34621Skarels 	} else
32*34621Skarels 		if ((cpin.cp_hdr.cp_unit & CPDONE) == 0)
33*34621Skarels 			return (0);
34*34621Skarels 	uncache(&cpin.cpi_buf[0]);
35*34621Skarels 	c = cpin.cpi_buf[0] & 0x7f;
36*34621Skarels 	char_read = 0;
37*34621Skarels 	if (c == '\r')
38*34621Skarels 		c = '\n';
39*34621Skarels 	if (c != '\b' && c != '\177')
40*34621Skarels 		putchar(c);
41*34621Skarels 	return (c);
42*34621Skarels }
43*34621Skarels 
44*34621Skarels agets(buf)
45*34621Skarels 	char *buf;
46*34621Skarels {
47*34621Skarels 	static char	line[256];
48*34621Skarels 	static char	*lp = line;
49*34621Skarels 	register	c;
50*34621Skarels 
51*34621Skarels 	*buf = '\0';
52*34621Skarels 	for (;;) {
53*34621Skarels 		c = agetchar() & 0177;
54*34621Skarels 		switch(c) {
55*34621Skarels 		case '\0' :
56*34621Skarels 			if (!wait_for_char)
57*34621Skarels 				return;
58*34621Skarels 			break;
59*34621Skarels 		case '\n':
60*34621Skarels 		case '\r':
61*34621Skarels 			c = '\n';
62*34621Skarels 			*lp = '\0';
63*34621Skarels 			strcpy(buf, line);
64*34621Skarels 			lp = line;
65*34621Skarels 			return;
66*34621Skarels 		case '\b':
67*34621Skarels 		case '\177':
68*34621Skarels 			if (lp > line) {
69*34621Skarels 				lp--;
70*34621Skarels 				putchar('\b');
71*34621Skarels 				putchar(' ');
72*34621Skarels 				putchar('\b');
73*34621Skarels 			}
74*34621Skarels 			continue;
75*34621Skarels 		case '#':
76*34621Skarels 			lp--;
77*34621Skarels 			if (lp < line)
78*34621Skarels 				lp = line;
79*34621Skarels 			continue;
80*34621Skarels 		case '@':
81*34621Skarels 		case 'u'&037:
82*34621Skarels 			lp = line;
83*34621Skarels 			putchar('\n');
84*34621Skarels 			continue;
85*34621Skarels 		default:
86*34621Skarels 			if ((lp - line) < 256)
87*34621Skarels 				*lp++ = c;
88*34621Skarels 		}
89*34621Skarels 	}
90*34621Skarels }
91