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