1 /* 2 * 3 * debugger 4 * 5 */ 6 7 #include "defs.h" 8 #include "fns.h" 9 10 Rune line[LINSIZ]; 11 extern int infile; 12 Rune *lp; 13 int peekc,lastc = EOR; 14 int eof; 15 16 /* input routines */ 17 18 eol(int c) 19 { 20 return(c==EOR || c==';'); 21 } 22 23 int 24 rdc(void) 25 { 26 do { 27 readchar(); 28 } while (lastc==SPC || lastc==TB); 29 return(lastc); 30 } 31 32 void 33 reread(void) 34 { 35 peekc = lastc; 36 } 37 38 void 39 clrinp(void) 40 { 41 flush(); 42 lp = 0; 43 peekc = 0; 44 } 45 46 int 47 readrune(int fd, Rune *r) 48 { 49 char buf[UTFmax+1]; 50 int i; 51 52 for(i=0; i<UTFmax && !fullrune(buf, i); i++) 53 if(read(fd, buf+i, 1) <= 0) 54 return -1; 55 buf[i] = 0; 56 chartorune(r, buf); 57 return 1; 58 } 59 60 int 61 readchar(void) 62 { 63 Rune *p; 64 65 if (eof) 66 lastc=0; 67 else if (peekc) { 68 lastc = peekc; 69 peekc = 0; 70 } 71 else { 72 if (lp==0) { 73 for (p = line; p < &line[LINSIZ-1]; p++) { 74 eof = readrune(infile, p) <= 0; 75 if (mkfault) { 76 eof = 0; 77 error(0); 78 } 79 if (eof) { 80 p--; 81 break; 82 } 83 if (*p == EOR) { 84 if (p <= line) 85 break; 86 if (p[-1] != '\\') 87 break; 88 p -= 2; 89 } 90 } 91 p[1] = 0; 92 lp = line; 93 } 94 if ((lastc = *lp) != 0) 95 lp++; 96 } 97 return(lastc); 98 } 99 100 nextchar(void) 101 { 102 if (eol(rdc())) { 103 reread(); 104 return(0); 105 } 106 return(lastc); 107 } 108 109 quotchar(void) 110 { 111 if (readchar()=='\\') 112 return(readchar()); 113 else if (lastc=='\'') 114 return(0); 115 else 116 return(lastc); 117 } 118 119 void 120 getformat(char *deformat) 121 { 122 char *fptr; 123 BOOL quote; 124 Rune r; 125 126 fptr=deformat; 127 quote=FALSE; 128 while ((quote ? readchar()!=EOR : !eol(readchar()))){ 129 r = lastc; 130 fptr += runetochar(fptr, &r); 131 if (lastc == '"') 132 quote = ~quote; 133 } 134 lp--; 135 if (fptr!=deformat) 136 *fptr = '\0'; 137 } 138 139 /* 140 * check if the input line if of the form: 141 * <filename>:<digits><verb> ... 142 * 143 * we handle this case specially because we have to look ahead 144 * at the token after the colon to decide if it is a file reference 145 * or a colon-command with a symbol name prefix. 146 */ 147 148 int 149 isfileref(void) 150 { 151 Rune *cp; 152 153 for (cp = lp-1; *cp && !strchr(CMD_VERBS, *cp); cp++) 154 if (*cp == '\\' && cp[1]) /* escape next char */ 155 cp++; 156 if (*cp && cp > lp-1) { 157 while (*cp == ' ' || *cp == '\t') 158 cp++; 159 if (*cp++ == ':') { 160 while (*cp == ' ' || *cp == '\t') 161 cp++; 162 if (isdigit(*cp)) 163 return 1; 164 } 165 } 166 return 0; 167 } 168