|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.