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