Commit | Line | Data |
---|---|---|
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 | ||
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 | } |