|
|
1.1 ! root 1: #include "e.h" ! 2: #include "y.tab.h" ! 3: #include "ctype.h" ! 4: ! 5: #define SSIZE 400 ! 6: char token[SSIZE]; ! 7: int sp; ! 8: ! 9: yylex() ! 10: { ! 11: register int c; ! 12: tbl *tp; ! 13: ! 14: begin: ! 15: while ((c=input()) == ' ' || c == '\n') ! 16: ; ! 17: yylval = c; ! 18: switch (c) { ! 19: case EOF: ! 20: error(!FATAL, "unexpected end of input inside equation"); ! 21: return(EOF); ! 22: case '~': ! 23: return(SPACE); ! 24: case '^': ! 25: return(THIN); ! 26: case '\t': ! 27: return(TAB); ! 28: case '{': ! 29: return('{'); ! 30: case '}': ! 31: return('}'); ! 32: case '"': ! 33: for (sp = 0; (c=input())!='"' && c != '\n'; ) { ! 34: if (c == '\\') ! 35: if ((c = input()) != '"') ! 36: token[sp++] = '\\'; ! 37: token[sp++] = c; ! 38: if (sp >= SSIZE) ! 39: error(FATAL, "quoted string %.20s... too long", token); ! 40: } ! 41: token[sp] = '\0'; ! 42: yylval = (int) &token[0]; ! 43: if (c == '\n') ! 44: error(!FATAL, "missing \" in %.20s", token); ! 45: return(QTEXT); ! 46: } ! 47: if (!display && c == righteq) ! 48: return(EOF); ! 49: ! 50: unput(c); ! 51: getstr(token, SSIZE); ! 52: dprintf(".\tlex token = |%s|\n", token); ! 53: if ((tp = lookup(deftbl, token, NULL)) != NULL) { /* defined term */ ! 54: c = input(); ! 55: unput(c); ! 56: if (c == '(') /* macro with args */ ! 57: dodef(tp); ! 58: else { /* no args */ ! 59: unput(' '); ! 60: pbstr(tp->defn); ! 61: dprintf(".\tfound %s|=%s|\n", token, tp->defn); ! 62: } ! 63: goto begin; ! 64: } ! 65: ! 66: if ((tp = lookup(keytbl, token, NULL)) == NULL) /* not a keyword */ ! 67: return CONTIG; ! 68: ! 69: switch ((int) tp->defn) { /* some kind of keyword */ ! 70: case DEFINE: case TDEFINE: case NDEFINE: ! 71: define(tp->defn); ! 72: break; ! 73: case IFDEF: ! 74: ifdef(); ! 75: break; ! 76: case DELIM: ! 77: delim(); ! 78: break; ! 79: case GSIZE: ! 80: globsize(); ! 81: break; ! 82: case GFONT: ! 83: globfont(); ! 84: break; ! 85: case INCLUDE: ! 86: include(); ! 87: break; ! 88: case SPACE: ! 89: space(); ! 90: break; ! 91: case DOTEQ: ! 92: /* .EQ inside equation -- should warn if at bottom level */ ! 93: break; ! 94: case DOTEN: ! 95: if (curfile == infile) ! 96: return EOF; ! 97: /* else ignore nested .EN */ ! 98: break; ! 99: default: ! 100: return (int) tp->defn; ! 101: } ! 102: goto begin; ! 103: } ! 104: ! 105: getstr(s, n) ! 106: char *s; ! 107: register int n; ! 108: { ! 109: register int c; ! 110: register char *p; ! 111: ! 112: p = s; ! 113: while ((c = input()) == ' ' || c == '\n') ! 114: ; ! 115: if (c == EOF) { ! 116: *s = 0; ! 117: return; ! 118: } ! 119: while (c != ' ' && c != '\t' && c != '\n' && c != '{' && c != '}' ! 120: && c != '"' && c != '~' && c != '^') { ! 121: if (!display && c == righteq) ! 122: break; ! 123: if (c == '(' && p > s) { /* might be defined(...) */ ! 124: *p = '\0'; ! 125: if (lookup(deftbl, s, NULL) != NULL) ! 126: break; ! 127: } ! 128: if (c == '\\') ! 129: if ((c = input()) != '"') ! 130: *p++ = '\\'; ! 131: *p++ = c; ! 132: if (--n <= 0) ! 133: error(FATAL, "token %.20s... too long", s); ! 134: c = input(); ! 135: } ! 136: unput(c); ! 137: *p = '\0'; ! 138: yylval = (int) s; ! 139: } ! 140: ! 141: cstr(s, quote, maxs) ! 142: char *s; ! 143: int quote; ! 144: { ! 145: int del, c, i; ! 146: ! 147: s[0] = 0; ! 148: while ((del=input()) == ' ' || del == '\t') ! 149: ; ! 150: if (quote) ! 151: for (i=0; (c=input()) != del && c != EOF;) { ! 152: s[i++] = c; ! 153: if (i >= maxs) ! 154: return(1); /* disaster */ ! 155: } ! 156: else { ! 157: if (del == '\n') ! 158: return(1); ! 159: s[0] = del; ! 160: for (i=1; (c=input())!=' ' && c!= '\t' && c!='\n' && c!=EOF;) { ! 161: s[i++] = c; ! 162: if (i >= maxs) ! 163: return(1); /* disaster */ ! 164: } ! 165: } ! 166: s[i] = '\0'; ! 167: if (c == EOF) ! 168: error(FATAL, "Unexpected end of input at %.20s", s); ! 169: return(0); ! 170: } ! 171: ! 172: define(type) ! 173: int type; ! 174: { ! 175: char *p1, *p2; ! 176: ! 177: getstr(token, SSIZE); /* get name */ ! 178: if (type != DEFINE) { ! 179: cstr(token, 1, SSIZE); /* skip the definition too */ ! 180: return; ! 181: } ! 182: p1 = strsave(token); ! 183: if (cstr(token, 1, SSIZE)) ! 184: error(FATAL, "Unterminated definition at %.20s", token); ! 185: p2 = strsave(token); ! 186: lookup(deftbl, p1, p2); ! 187: dprintf(".\tname %s defined as %s\n", p1, p2); ! 188: } ! 189: ! 190: ifdef() /* do body if name is defined */ ! 191: { ! 192: tbl *tp; ! 193: char name[100], *p; ! 194: ! 195: getstr(name, sizeof(name)); /* get name */ ! 196: cstr(token, 1, SSIZE); /* and body */ ! 197: if ((tp = lookup(deftbl, name, NULL)) != NULL) { /* found it */ ! 198: p = strsave(token); ! 199: pushsrc(Free, p); ! 200: pushsrc(String, p); ! 201: } ! 202: } ! 203: ! 204: char *spaceval = NULL; ! 205: ! 206: space() /* collect line of form "space amt" to replace \x in output */ ! 207: { ! 208: getstr(token, SSIZE); ! 209: spaceval = strsave(token); ! 210: dprintf(".\tsetting spaceval to %s\n", token); ! 211: } ! 212: ! 213: char *strsave(s) ! 214: char *s; ! 215: { ! 216: register char *q; ! 217: ! 218: q = malloc(strlen(s)+1); ! 219: if (q == NULL) ! 220: error(FATAL, "out of space in strsave on %s", s); ! 221: strcpy(q, s); ! 222: return(q); ! 223: } ! 224: ! 225: include() ! 226: { ! 227: char name[100]; ! 228: FILE *fin; ! 229: int c; ! 230: extern int errno; ! 231: ! 232: while ((c = input()) == ' ') ! 233: ; ! 234: unput(c); ! 235: cstr(name, c == '"', sizeof(name)); /* gets it quoted or not */ ! 236: if ((fin = fopen(name, "r")) == NULL) ! 237: fatal("can't open file %s", name); ! 238: errno = 0; ! 239: curfile++; ! 240: curfile->fin = fin; ! 241: curfile->fname = strsave(name); ! 242: curfile->lineno = 0; ! 243: printf(".lf 1 %s\n", curfile->fname); ! 244: pushsrc(File, curfile); ! 245: } ! 246: ! 247: delim() ! 248: { ! 249: yyval = eqnreg = 0; ! 250: if (cstr(token, 0, SSIZE)) ! 251: error(FATAL, "Bizarre delimiters"); ! 252: lefteq = token[0]; ! 253: righteq = token[1]; ! 254: if (!isprint(lefteq) || !isprint(righteq)) ! 255: error(FATAL, "Bizarre delimiters"); ! 256: if (lefteq == 'o' && righteq == 'f') ! 257: lefteq = righteq = '\0'; ! 258: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.