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