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