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