1: #include "e.h" 2: #include "e.def" 3: 4: #define SSIZE 400 5: char token[SSIZE]; 6: int sp; 7: #define putbak(c) *ip++ = c; 8: #define PUSHBACK 300 /* maximum pushback characters */ 9: char ibuf[PUSHBACK+SSIZE]; /* pushback buffer for definitions, etc. */ 10: char *ip = ibuf; 11: 12: gtc() { 13: loop: 14: if (ip > ibuf) 15: return(*--ip); /* already present */ 16: lastchar = getc(curfile); 17: if (lastchar=='\n') 18: linect++; 19: if (lastchar != EOF) 20: return(lastchar); 21: if (++ifile > svargc) { 22: return(EOF); 23: } 24: fclose(curfile); 25: linect = 1; 26: if ((curfile=fopen(svargv[ifile], "r")) != NULL) 27: goto loop; 28: error(FATAL, "can't open file %s", svargv[ifile]); 29: return(EOF); 30: } 31: 32: pbstr(str) 33: register char *str; 34: { 35: register char *p; 36: 37: p = str; 38: while (*p++); 39: --p; 40: if (ip >= &ibuf[PUSHBACK]) 41: error( FATAL, "pushback overflow"); 42: while (p > str) 43: putbak(*--p); 44: } 45: 46: yylex() { 47: register int c; 48: tbl *tp, *lookup(); 49: extern tbl **keytbl, **deftbl; 50: 51: beg: 52: while ((c=gtc())==' ' || c=='\n') 53: ; 54: yylval=c; 55: switch(c) { 56: 57: case EOF: 58: return(EOF); 59: case '~': 60: return(SPACE); 61: case '^': 62: return(THIN); 63: case '\t': 64: return(TAB); 65: case '{': 66: return('{'); 67: case '}': 68: return('}'); 69: case '"': 70: for (sp=0; (c=gtc())!='"' && c != '\n'; ) { 71: if (c == '\\') 72: if ((c = gtc()) != '"') 73: token[sp++] = '\\'; 74: token[sp++] = c; 75: if (sp>=SSIZE) 76: error(FATAL, "quoted string %.20s... too long", token); 77: } 78: token[sp]='\0'; 79: yylval = (int) &token[0]; 80: if (c == '\n') 81: error(!FATAL, "missing \" in %.20s", token); 82: return(QTEXT); 83: } 84: if (c==righteq) 85: return(EOF); 86: 87: putbak(c); 88: getstr(token, SSIZE); 89: if (dbg)printf(".\tlex token = |%s|\n", token); 90: if ((tp = lookup(&deftbl, token, NULL)) != NULL) { 91: putbak(' '); 92: pbstr(tp->defn); 93: putbak(' '); 94: if (dbg) 95: printf(".\tfound %s|=%s|\n", token, tp->defn); 96: } 97: else if ((tp = lookup(&keytbl, token, NULL)) == NULL) { 98: if(dbg)printf(".\t%s is not a keyword\n", token); 99: return(CONTIG); 100: } 101: else if (tp->defn == (char *) DEFINE || tp->defn == (char *) NDEFINE || tp->defn == (char *) TDEFINE) 102: define(tp->defn); 103: else if (tp->defn == (char *) DELIM) 104: delim(); 105: else if (tp->defn == (char *) GSIZE) 106: globsize(); 107: else if (tp->defn == (char *) GFONT) 108: globfont(); 109: else if (tp->defn == (char *) INCLUDE) 110: include(); 111: else { 112: return((int) tp->defn); 113: } 114: goto beg; 115: } 116: 117: getstr(s, n) char *s; register int n; { 118: register int c; 119: register char *p; 120: 121: p = s; 122: while ((c = gtc()) == ' ' || c == '\n') 123: ; 124: if (c == EOF) { 125: *s = 0; 126: return; 127: } 128: while (c != ' ' && c != '\t' && c != '\n' && c != '{' && c != '}' 129: && c != '"' && c != '~' && c != '^' && c != righteq) { 130: if (c == '\\') 131: if ((c = gtc()) != '"') 132: *p++ = '\\'; 133: *p++ = c; 134: if (--n <= 0) 135: error(FATAL, "token %.20s... too long", s); 136: c = gtc(); 137: } 138: if (c=='{' || c=='}' || c=='"' || c=='~' || c=='^' || c=='\t' || c==righteq) 139: putbak(c); 140: *p = '\0'; 141: yylval = (int) s; 142: } 143: 144: cstr(s, quote, maxs) char *s; int quote; { 145: int del, c, i; 146: 147: while((del=gtc()) == ' ' || del == '\t' || del == '\n'); 148: if (quote) 149: for (i=0; (c=gtc()) != del && c != EOF;) { 150: s[i++] = c; 151: if (i >= maxs) 152: return(1); /* disaster */ 153: } 154: else { 155: s[0] = del; 156: for (i=1; (c=gtc())!=' ' && c!= '\t' && c!='\n' && c!=EOF;) { 157: s[i++]=c; 158: if (i >= maxs) 159: return(1); /* disaster */ 160: } 161: } 162: s[i] = '\0'; 163: if (c == EOF) 164: error(FATAL, "Unexpected end of input at %.20s", s); 165: return(0); 166: } 167: 168: define(type) int type; { 169: char *strsave(), *p1, *p2; 170: tbl *lookup(); 171: extern tbl **deftbl; 172: 173: getstr(token, SSIZE); /* get name */ 174: if (type != DEFINE) { 175: cstr(token, 1, SSIZE); /* skip the definition too */ 176: return; 177: } 178: p1 = strsave(token); 179: if (cstr(token, 1, SSIZE)) 180: error(FATAL, "Unterminated definition at %.20s", token); 181: p2 = strsave(token); 182: lookup(&deftbl, p1, p2); 183: if (dbg)printf(".\tname %s defined as %s\n", p1, p2); 184: } 185: 186: char *strsave(s) 187: char *s; 188: { 189: char *malloc(); 190: register char *q; 191: 192: q = malloc(strlen(s)+1); 193: if (q == NULL) 194: error(FATAL, "out of space in strsave on %s", s); 195: strcpy(q, s); 196: return(q); 197: } 198: 199: include() { 200: error(!FATAL, "Include not yet implemented"); 201: } 202: 203: delim() { 204: yyval = eqnreg = 0; 205: if (cstr(token, 0, SSIZE)) 206: error(FATAL, "Bizarre delimiters at %.20s", token); 207: lefteq = token[0]; 208: righteq = token[1]; 209: if (lefteq == 'o' && righteq == 'f') 210: lefteq = righteq = '\0'; 211: }