|
|
1.1 ! root 1: # include "e.h" ! 2: #define MAXLINE 1200 /* maximum input line */ ! 3: ! 4: char in[MAXLINE]; /* input buffer */ ! 5: int eqnexit(); ! 6: int noeqn; ! 7: ! 8: main(argc,argv) int argc; char *argv[];{ ! 9: ! 10: eqnexit(eqn(argc, argv)); ! 11: } ! 12: ! 13: eqnexit(n) { ! 14: #ifdef gcos ! 15: if (n) ! 16: fprintf(stderr, "run terminated due to eqn error\n"); ! 17: exit(0); ! 18: #endif ! 19: exit(n); ! 20: } ! 21: ! 22: eqn(argc,argv) int argc; char *argv[];{ ! 23: int i, type; ! 24: ! 25: setfile(argc,argv); ! 26: init_tbl(); /* install keywords in tables */ ! 27: while ((type=getline(in)) != EOF) { ! 28: eqline = linect; ! 29: if (in[0]=='.' && in[1]=='E' && in[2]=='Q') { ! 30: for (i=11; i<100; used[i++]=0); ! 31: printf("%s",in); ! 32: printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n"); ! 33: markline = 0; ! 34: init(); ! 35: yyparse(); ! 36: if (eqnreg>0) { ! 37: printf(".nr %d \\w'\\*(%d'\n", eqnreg, eqnreg); ! 38: /* printf(".if \\n(%d>\\n(.l .tm too-long eqn, file %s, between lines %d-%d\n", */ ! 39: /* eqnreg, svargv[ifile], eqline, linect); */ ! 40: printf(".nr MK %d\n", markline); /* for -ms macros */ ! 41: printf(".if %d>\\n(.v .ne %du\n", eqnht, eqnht); ! 42: printf(".rn %d 10\n", eqnreg); ! 43: if(!noeqn)printf("\\*(10\n"); ! 44: } ! 45: printf(".ps \\n(99\n.ft \\n(98\n"); ! 46: printf(".EN"); ! 47: if (lastchar == EOF) { ! 48: putchar('\n'); ! 49: break; ! 50: } ! 51: if (putchar(lastchar) != '\n') ! 52: while (putchar(gtc()) != '\n'); ! 53: } ! 54: else if (type == lefteq) ! 55: inline(); ! 56: else ! 57: printf("%s",in); ! 58: } ! 59: return(0); ! 60: } ! 61: ! 62: getline(s) register char *s; { ! 63: register c; ! 64: while((*s++=c=gtc())!='\n' && c!=EOF && c!=lefteq) ! 65: if (s >= in+MAXLINE) { ! 66: error( !FATAL, "input line too long: %.20s\n", in); ! 67: in[MAXLINE] = '\0'; ! 68: break; ! 69: } ! 70: if (c==lefteq) ! 71: s--; ! 72: *s++ = '\0'; ! 73: return(c); ! 74: } ! 75: ! 76: inline() { ! 77: int ds; ! 78: ! 79: printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n"); ! 80: ds = oalloc(); ! 81: printf(".rm %d \n", ds); ! 82: do{ ! 83: if (*in) ! 84: printf(".as %d \"%s\n", ds, in); ! 85: init(); ! 86: yyparse(); ! 87: if (eqnreg > 0) { ! 88: printf(".as %d \\*(%d\n", ds, eqnreg); ! 89: ofree(eqnreg); ! 90: } ! 91: printf(".ps \\n(99\n.ft \\n(98\n"); ! 92: } while (getline(in) == lefteq); ! 93: if (*in) ! 94: printf(".as %d \"%s", ds, in); ! 95: printf(".ps \\n(99\n.ft \\n(98\n"); ! 96: printf("\\*(%d\n", ds); ! 97: ofree(ds); ! 98: } ! 99: ! 100: putout(p1) int p1; { ! 101: extern int gsize, gfont; ! 102: int before, after; ! 103: if(dbg)printf(".\tanswer <- S%d, h=%d,b=%d\n",p1, eht[p1], ebase[p1]); ! 104: eqnht = eht[p1]; ! 105: printf(".ds %d \\x'0'", p1); ! 106: /* suppposed to leave room for a subscript or superscript */ ! 107: before = eht[p1] - ebase[p1] - VERT(3); /* 3 = 1.5 lines */ ! 108: if (before > 0) ! 109: printf("\\x'0-%du'", before); ! 110: printf("\\f%c\\s%d\\*(%d%s\\s\\n(99\\f\\n(98", ! 111: gfont, gsize, p1, rfont[p1] == ITAL ? "\\|" : ""); ! 112: after = ebase[p1] - VERT(1); ! 113: if (after > 0) ! 114: printf("\\x'%du'", after); ! 115: putchar('\n'); ! 116: eqnreg = p1; ! 117: } ! 118: ! 119: max(i,j) int i,j; { ! 120: return (i>j ? i : j); ! 121: } ! 122: ! 123: oalloc() { ! 124: int i; ! 125: for (i=11; i<100; i++) ! 126: if (used[i]++ == 0) return(i); ! 127: error( FATAL, "no eqn strings left", i); ! 128: return(0); ! 129: } ! 130: ! 131: ofree(n) int n; { ! 132: used[n] = 0; ! 133: } ! 134: ! 135: setps(p) int p; { ! 136: printf(".ps %d\n", EFFPS(p)); ! 137: } ! 138: ! 139: nrwid(n1, p, n2) int n1, p, n2; { ! 140: printf(".nr %d \\w'\\s%d\\*(%d'\n", n1, EFFPS(p), n2); ! 141: } ! 142: ! 143: setfile(argc, argv) int argc; char *argv[]; { ! 144: static char *nullstr = "-"; ! 145: ! 146: svargc = --argc; ! 147: svargv = argv; ! 148: while (svargc > 0 && svargv[1][0] == '-') { ! 149: switch (svargv[1][1]) { ! 150: ! 151: case 'd': lefteq=svargv[1][2]; righteq=svargv[1][3]; break; ! 152: case 's': gsize = atoi(&svargv[1][2]); break; ! 153: case 'p': deltaps = atoi(&svargv[1][2]); break; ! 154: case 'f': gfont = svargv[1][2]; break; ! 155: case 'e': noeqn++; break; ! 156: default: dbg = 1; ! 157: } ! 158: svargc--; ! 159: svargv++; ! 160: } ! 161: ifile = 1; ! 162: linect = 1; ! 163: if (svargc <= 0) { ! 164: curfile = stdin; ! 165: svargv[1] = nullstr; ! 166: } ! 167: else if ((curfile = fopen(svargv[1], "r")) == NULL) ! 168: error( FATAL,"can't open file %s", svargv[1]); ! 169: } ! 170: ! 171: yyerror() {;} ! 172: ! 173: init() { ! 174: ct = 0; ! 175: ps = gsize; ! 176: ft = gfont; ! 177: setps(ps); ! 178: printf(".ft %c\n", ft); ! 179: } ! 180: ! 181: error(fatal, s1, s2) int fatal; char *s1, *s2; { ! 182: if (fatal>0) ! 183: printf("eqn fatal error: "); ! 184: printf(s1,s2); ! 185: printf("\nfile %s, between lines %d and %d\n", ! 186: svargv[ifile], eqline, linect); ! 187: fprintf(stderr, "eqn: "); ! 188: if (fatal>0) ! 189: fprintf(stderr, "fatal error: "); ! 190: fprintf(stderr, s1, s2); ! 191: fprintf(stderr, "\nfile %s, between lines %d and %d\n", ! 192: svargv[ifile], eqline, linect); ! 193: if (fatal > 0) ! 194: eqnexit(1); ! 195: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.