130296Ssam /* 230296Ssam * Copyright (c) 1986 Regents of the University of California. 330296Ssam * All rights reserved. The Berkeley software License Agreement 430296Ssam * specifies the terms and conditions for redistribution. 530296Ssam * 6*39060Smarc * @(#)kdb_input.c 7.4 (Berkeley) 09/06/89 730296Ssam */ 830109Ssam 930109Ssam #include "../kdb/defs.h" 1030109Ssam 1130109Ssam char line[LINSIZ]; 1230109Ssam char *lp; 1330109Ssam char peekc,lastc = EOR; 1430109Ssam 1530109Ssam /* input routines */ 1630109Ssam 1730109Ssam eol(c) 1830109Ssam char c; 1930109Ssam { 2030109Ssam return (c==EOR || c==';'); 2130109Ssam } 2230109Ssam 2330109Ssam rdc() 2430109Ssam { 2530109Ssam do 2630296Ssam (void) readchar(); 2730109Ssam while (lastc==SP || lastc==TB); 2830109Ssam return (lastc); 2930109Ssam } 3030109Ssam 3130109Ssam readchar() 3230109Ssam { 3330109Ssam static char *erase = "\b \b"; 3430109Ssam 3530109Ssam if (lp==0) { 3630109Ssam lp=line; 3730109Ssam do { 3830109Ssam (void) kdbreadc(lp); 3930109Ssam if (mkfault) 4030296Ssam error((char *)0); 4130109Ssam switch (*lp) { 42*39060Smarc case CTRL('h'): case 0177: 4330109Ssam if (lp > line) 4430109Ssam kdbwrite(erase, 3), lp--; 4530109Ssam break; 46*39060Smarc case CTRL('u'): 4730109Ssam while (lp > line) 4830109Ssam kdbwrite(erase, 3), lp--; 4930109Ssam break; 50*39060Smarc case CTRL('r'): 5130109Ssam kdbwrite("^R\n", 3); 5230109Ssam if (lp > line) 5330109Ssam kdbwrite(line, lp-line); 5430109Ssam break; 55*39060Smarc case CTRL('w'): 5630109Ssam if (lp <= line) 5730109Ssam break; 5830109Ssam do { 5930109Ssam if (!isspace(*lp)) 6030109Ssam goto erasenb; 6130109Ssam kdbwrite(erase, 3); 6230109Ssam } while (--lp > line); 6330109Ssam break; 6430109Ssam erasenb: 6530109Ssam do 6630109Ssam kdbwrite(erase, 3); 6730109Ssam while (--lp > line && !isspace(*lp)); 6830109Ssam break; 6930109Ssam default: 7030109Ssam echo(*lp++); 7130109Ssam break; 7230109Ssam } 7330109Ssam } while (lp == line || lp[-1] != EOR); 7430109Ssam *lp=0; lp=line; 7530109Ssam } 7630109Ssam if (lastc = peekc) 7730109Ssam peekc=0; 7830109Ssam else if (lastc = *lp) 7930109Ssam lp++; 8030109Ssam return (lastc); 8130109Ssam } 8230109Ssam 8330109Ssam static 8430109Ssam echo(c) 8530109Ssam char c; 8630109Ssam { 8730109Ssam char buf[2]; 8830109Ssam 8930109Ssam if (c==0177 || (c<SP && c != TB && c != EOR)) { 9030109Ssam buf[0] = '^'; 9130109Ssam buf[1] = c ^ 0100; 9230109Ssam kdbwrite(buf, 2); 9330109Ssam } else 9430109Ssam kdbwrite(&c, 1); 9530109Ssam } 9630109Ssam 9730109Ssam nextchar() 9830109Ssam { 9930109Ssam 10030109Ssam if (eol(rdc())) { 10130109Ssam lp--; 10230109Ssam return (0); 10330109Ssam } 10430109Ssam return (lastc); 10530109Ssam } 10630109Ssam 10730109Ssam quotchar() 10830109Ssam { 10930109Ssam 11030109Ssam if (readchar()=='\\') 11130109Ssam return (readchar()); 11230109Ssam if (lastc=='\'') 11330109Ssam return (0); 11430109Ssam return (lastc); 11530109Ssam } 11630109Ssam 11730109Ssam getformat(deformat) 11830109Ssam char *deformat; 11930109Ssam { 12030109Ssam register char *fptr; 12130109Ssam register int quote; 12230109Ssam 12330120Ssam fptr=deformat; quote=0; 12430109Ssam while ((quote ? readchar()!=EOR : !eol(readchar()))) 12530109Ssam if ((*fptr++ = lastc)=='"') 12630109Ssam quote = ~quote; 12730109Ssam lp--; 12830109Ssam if (fptr!=deformat) 12930109Ssam *fptr++ = '\0'; 13030109Ssam } 131