1*30120Ssam /* kdb_input.c 7.2 86/11/20 */ 230109Ssam 330109Ssam #include "../kdb/defs.h" 430109Ssam 530109Ssam char line[LINSIZ]; 630109Ssam char *lp; 730109Ssam char peekc,lastc = EOR; 830109Ssam int eof; 930109Ssam 1030109Ssam /* input routines */ 1130109Ssam 1230109Ssam eol(c) 1330109Ssam char c; 1430109Ssam { 1530109Ssam return (c==EOR || c==';'); 1630109Ssam } 1730109Ssam 1830109Ssam rdc() 1930109Ssam { 2030109Ssam do 2130109Ssam readchar(); 2230109Ssam while (lastc==SP || lastc==TB); 2330109Ssam return (lastc); 2430109Ssam } 2530109Ssam 2630109Ssam readchar() 2730109Ssam { 2830109Ssam static char *erase = "\b \b"; 2930109Ssam 3030109Ssam if (lp==0) { 3130109Ssam lp=line; 3230109Ssam do { 3330109Ssam (void) kdbreadc(lp); 3430109Ssam if (mkfault) 3530109Ssam error(0); 3630109Ssam switch (*lp) { 3730109Ssam case CTRL(h): case 0177: 3830109Ssam if (lp > line) 3930109Ssam kdbwrite(erase, 3), lp--; 4030109Ssam break; 4130109Ssam case CTRL(u): 4230109Ssam while (lp > line) 4330109Ssam kdbwrite(erase, 3), lp--; 4430109Ssam break; 4530109Ssam case CTRL(r): 4630109Ssam kdbwrite("^R\n", 3); 4730109Ssam if (lp > line) 4830109Ssam kdbwrite(line, lp-line); 4930109Ssam break; 5030109Ssam case CTRL(w): 5130109Ssam if (lp <= line) 5230109Ssam break; 5330109Ssam do { 5430109Ssam if (!isspace(*lp)) 5530109Ssam goto erasenb; 5630109Ssam kdbwrite(erase, 3); 5730109Ssam } while (--lp > line); 5830109Ssam break; 5930109Ssam erasenb: 6030109Ssam do 6130109Ssam kdbwrite(erase, 3); 6230109Ssam while (--lp > line && !isspace(*lp)); 6330109Ssam break; 6430109Ssam default: 6530109Ssam echo(*lp++); 6630109Ssam break; 6730109Ssam } 6830109Ssam } while (lp == line || lp[-1] != EOR); 6930109Ssam *lp=0; lp=line; 7030109Ssam } 7130109Ssam if (lastc = peekc) 7230109Ssam peekc=0; 7330109Ssam else if (lastc = *lp) 7430109Ssam lp++; 7530109Ssam return (lastc); 7630109Ssam } 7730109Ssam 7830109Ssam static 7930109Ssam echo(c) 8030109Ssam char c; 8130109Ssam { 8230109Ssam char buf[2]; 8330109Ssam 8430109Ssam if (c==0177 || (c<SP && c != TB && c != EOR)) { 8530109Ssam buf[0] = '^'; 8630109Ssam buf[1] = c ^ 0100; 8730109Ssam kdbwrite(buf, 2); 8830109Ssam } else 8930109Ssam kdbwrite(&c, 1); 9030109Ssam } 9130109Ssam 9230109Ssam nextchar() 9330109Ssam { 9430109Ssam 9530109Ssam if (eol(rdc())) { 9630109Ssam lp--; 9730109Ssam return (0); 9830109Ssam } 9930109Ssam return (lastc); 10030109Ssam } 10130109Ssam 10230109Ssam quotchar() 10330109Ssam { 10430109Ssam 10530109Ssam if (readchar()=='\\') 10630109Ssam return (readchar()); 10730109Ssam if (lastc=='\'') 10830109Ssam return (0); 10930109Ssam return (lastc); 11030109Ssam } 11130109Ssam 11230109Ssam getformat(deformat) 11330109Ssam char *deformat; 11430109Ssam { 11530109Ssam register char *fptr; 11630109Ssam register int quote; 11730109Ssam 118*30120Ssam fptr=deformat; quote=0; 11930109Ssam while ((quote ? readchar()!=EOR : !eol(readchar()))) 12030109Ssam if ((*fptr++ = lastc)=='"') 12130109Ssam quote = ~quote; 12230109Ssam lp--; 12330109Ssam if (fptr!=deformat) 12430109Ssam *fptr++ = '\0'; 12530109Ssam } 126