1*30109Ssam /* kdb_input.c 7.1 86/11/20 */ 2*30109Ssam 3*30109Ssam #include "../kdb/defs.h" 4*30109Ssam 5*30109Ssam char line[LINSIZ]; 6*30109Ssam char *lp; 7*30109Ssam char peekc,lastc = EOR; 8*30109Ssam int eof; 9*30109Ssam 10*30109Ssam /* input routines */ 11*30109Ssam 12*30109Ssam eol(c) 13*30109Ssam char c; 14*30109Ssam { 15*30109Ssam return (c==EOR || c==';'); 16*30109Ssam } 17*30109Ssam 18*30109Ssam rdc() 19*30109Ssam { 20*30109Ssam do 21*30109Ssam readchar(); 22*30109Ssam while (lastc==SP || lastc==TB); 23*30109Ssam return (lastc); 24*30109Ssam } 25*30109Ssam 26*30109Ssam readchar() 27*30109Ssam { 28*30109Ssam static char *erase = "\b \b"; 29*30109Ssam 30*30109Ssam if (lp==0) { 31*30109Ssam lp=line; 32*30109Ssam do { 33*30109Ssam (void) kdbreadc(lp); 34*30109Ssam if (mkfault) 35*30109Ssam error(0); 36*30109Ssam switch (*lp) { 37*30109Ssam case CTRL(h): case 0177: 38*30109Ssam if (lp > line) 39*30109Ssam kdbwrite(erase, 3), lp--; 40*30109Ssam break; 41*30109Ssam case CTRL(u): 42*30109Ssam while (lp > line) 43*30109Ssam kdbwrite(erase, 3), lp--; 44*30109Ssam break; 45*30109Ssam case CTRL(r): 46*30109Ssam kdbwrite("^R\n", 3); 47*30109Ssam if (lp > line) 48*30109Ssam kdbwrite(line, lp-line); 49*30109Ssam break; 50*30109Ssam case CTRL(w): 51*30109Ssam if (lp <= line) 52*30109Ssam break; 53*30109Ssam do { 54*30109Ssam if (!isspace(*lp)) 55*30109Ssam goto erasenb; 56*30109Ssam kdbwrite(erase, 3); 57*30109Ssam } while (--lp > line); 58*30109Ssam break; 59*30109Ssam erasenb: 60*30109Ssam do 61*30109Ssam kdbwrite(erase, 3); 62*30109Ssam while (--lp > line && !isspace(*lp)); 63*30109Ssam break; 64*30109Ssam default: 65*30109Ssam echo(*lp++); 66*30109Ssam break; 67*30109Ssam } 68*30109Ssam } while (lp == line || lp[-1] != EOR); 69*30109Ssam *lp=0; lp=line; 70*30109Ssam } 71*30109Ssam if (lastc = peekc) 72*30109Ssam peekc=0; 73*30109Ssam else if (lastc = *lp) 74*30109Ssam lp++; 75*30109Ssam return (lastc); 76*30109Ssam } 77*30109Ssam 78*30109Ssam static 79*30109Ssam echo(c) 80*30109Ssam char c; 81*30109Ssam { 82*30109Ssam char buf[2]; 83*30109Ssam 84*30109Ssam if (c==0177 || (c<SP && c != TB && c != EOR)) { 85*30109Ssam buf[0] = '^'; 86*30109Ssam buf[1] = c ^ 0100; 87*30109Ssam kdbwrite(buf, 2); 88*30109Ssam } else 89*30109Ssam kdbwrite(&c, 1); 90*30109Ssam } 91*30109Ssam 92*30109Ssam nextchar() 93*30109Ssam { 94*30109Ssam 95*30109Ssam if (eol(rdc())) { 96*30109Ssam lp--; 97*30109Ssam return (0); 98*30109Ssam } 99*30109Ssam return (lastc); 100*30109Ssam } 101*30109Ssam 102*30109Ssam quotchar() 103*30109Ssam { 104*30109Ssam 105*30109Ssam if (readchar()=='\\') 106*30109Ssam return (readchar()); 107*30109Ssam if (lastc=='\'') 108*30109Ssam return (0); 109*30109Ssam return (lastc); 110*30109Ssam } 111*30109Ssam 112*30109Ssam getformat(deformat) 113*30109Ssam char *deformat; 114*30109Ssam { 115*30109Ssam register char *fptr; 116*30109Ssam register int quote; 117*30109Ssam 118*30109Ssam fptr=deformat; quote=FALSE; 119*30109Ssam while ((quote ? readchar()!=EOR : !eol(readchar()))) 120*30109Ssam if ((*fptr++ = lastc)=='"') 121*30109Ssam quote = ~quote; 122*30109Ssam lp--; 123*30109Ssam if (fptr!=deformat) 124*30109Ssam *fptr++ = '\0'; 125*30109Ssam } 126