1*37506Smckusick /* cons.c 1.2 89/04/25 */ 234621Skarels 334621Skarels /* 434621Skarels * Asynchronous versions of getchar and gets 534621Skarels * for use in disk formatter. 634621Skarels */ 7*37506Smckusick #include "machine/mtpr.h" 834621Skarels 934621Skarels #include "param.h" 1034621Skarels #include "../tahoe/cp.h" 1134621Skarels 1234621Skarels int wait_for_char = 1; /* synchronous by default */ 1334621Skarels extern struct cpdcb_i cpin; /* in ../prf.c */ 1434621Skarels agetchar()1534621Skarelsagetchar() 1634621Skarels { 1734621Skarels static char_read = 0; /* read operation pending */ 1834621Skarels char c; 1934621Skarels 2034621Skarels if (!char_read) { 2134621Skarels char_read = 1; 2234621Skarels cpin.cp_hdr.cp_unit = CPCONS; /* Resets done bit */ 2334621Skarels cpin.cp_hdr.cp_comm = CPREAD; 2434621Skarels cpin.cp_hdr.cp_count = 1; 2534621Skarels mtpr(CPMDCB, &cpin); 2634621Skarels } 2734621Skarels uncache(&cpin.cp_hdr.cp_unit); 2834621Skarels if (wait_for_char) { 2934621Skarels while ((cpin.cp_hdr.cp_unit & CPDONE) == 0) 3034621Skarels uncache(&cpin.cp_hdr.cp_unit); 3134621Skarels } else 3234621Skarels if ((cpin.cp_hdr.cp_unit & CPDONE) == 0) 3334621Skarels return (0); 3434621Skarels uncache(&cpin.cpi_buf[0]); 3534621Skarels c = cpin.cpi_buf[0] & 0x7f; 3634621Skarels char_read = 0; 3734621Skarels if (c == '\r') 3834621Skarels c = '\n'; 3934621Skarels if (c != '\b' && c != '\177') 4034621Skarels putchar(c); 4134621Skarels return (c); 4234621Skarels } 4334621Skarels agets(buf)4434621Skarelsagets(buf) 4534621Skarels char *buf; 4634621Skarels { 4734621Skarels static char line[256]; 4834621Skarels static char *lp = line; 4934621Skarels register c; 5034621Skarels 5134621Skarels *buf = '\0'; 5234621Skarels for (;;) { 5334621Skarels c = agetchar() & 0177; 5434621Skarels switch(c) { 5534621Skarels case '\0' : 5634621Skarels if (!wait_for_char) 5734621Skarels return; 5834621Skarels break; 5934621Skarels case '\n': 6034621Skarels case '\r': 6134621Skarels c = '\n'; 6234621Skarels *lp = '\0'; 6334621Skarels strcpy(buf, line); 6434621Skarels lp = line; 6534621Skarels return; 6634621Skarels case '\b': 6734621Skarels case '\177': 6834621Skarels if (lp > line) { 6934621Skarels lp--; 7034621Skarels putchar('\b'); 7134621Skarels putchar(' '); 7234621Skarels putchar('\b'); 7334621Skarels } 7434621Skarels continue; 7534621Skarels case '#': 7634621Skarels lp--; 7734621Skarels if (lp < line) 7834621Skarels lp = line; 7934621Skarels continue; 8034621Skarels case '@': 8134621Skarels case 'u'&037: 8234621Skarels lp = line; 8334621Skarels putchar('\n'); 8434621Skarels continue; 8534621Skarels default: 8634621Skarels if ((lp - line) < 256) 8734621Skarels *lp++ = c; 8834621Skarels } 8934621Skarels } 9034621Skarels } 91