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