BSD 4_3_Reno development
[unix-history] / usr / src / sys / tahoestand / vdformat / cons.c
CommitLineData
92b4044d
C
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
12int wait_for_char = 1; /* synchronous by default */
13extern struct cpdcb_i cpin; /* in ../prf.c */
14
15agetchar()
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
44agets(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}