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