1*11023Sshannon /* io.c 4.2 83/02/12 */ 211007Sshannon 311007Sshannon # include "e.h" 411007Sshannon #define MAXLINE 1200 /* maximum input line */ 511007Sshannon 611007Sshannon char in[MAXLINE]; /* input buffer */ 711007Sshannon int eqnexit(); 811007Sshannon int noeqn; 911007Sshannon 1011007Sshannon main(argc,argv) int argc; char *argv[];{ 1111007Sshannon 1211007Sshannon eqnexit(eqn(argc, argv)); 1311007Sshannon } 1411007Sshannon 1511007Sshannon eqnexit(n) { 1611007Sshannon #ifdef gcos 1711007Sshannon if (n) 1811007Sshannon fprintf(stderr, "run terminated due to eqn error\n"); 1911007Sshannon exit(0); 2011007Sshannon #endif 2111007Sshannon exit(n); 2211007Sshannon } 2311007Sshannon 2411007Sshannon eqn(argc,argv) int argc; char *argv[];{ 2511007Sshannon int i, type; 2611007Sshannon 2711007Sshannon setfile(argc,argv); 2811007Sshannon init_tbl(); /* install keywords in tables */ 2911007Sshannon while ((type=getline(in)) != EOF) { 3011007Sshannon eqline = linect; 3111007Sshannon if (in[0]=='.' && in[1]=='E' && in[2]=='Q') { 3211007Sshannon for (i=11; i<100; used[i++]=0); 3311007Sshannon printf("%s",in); 3411007Sshannon printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n"); 3511007Sshannon markline = 0; 3611007Sshannon init(); 3711007Sshannon yyparse(); 3811007Sshannon if (eqnreg>0) { 3911007Sshannon printf(".nr %d \\w'\\*(%d'\n", eqnreg, eqnreg); 4011007Sshannon /* printf(".if \\n(%d>\\n(.l .tm too-long eqn, file %s, between lines %d-%d\n", */ 4111007Sshannon /* eqnreg, svargv[ifile], eqline, linect); */ 4211007Sshannon printf(".nr MK %d\n", markline); /* for -ms macros */ 4311007Sshannon printf(".if %d>\\n(.v .ne %du\n", eqnht, eqnht); 4411007Sshannon printf(".rn %d 10\n", eqnreg); 4511007Sshannon if(!noeqn)printf("\\*(10\n"); 4611007Sshannon } 4711007Sshannon printf(".ps \\n(99\n.ft \\n(98\n"); 4811007Sshannon printf(".EN"); 4911007Sshannon if (lastchar == EOF) { 5011007Sshannon putchar('\n'); 5111007Sshannon break; 5211007Sshannon } 5311007Sshannon if (putchar(lastchar) != '\n') 5411007Sshannon while (putchar(gtc()) != '\n'); 5511007Sshannon } 5611007Sshannon else if (type == lefteq) 5711007Sshannon inline(); 5811007Sshannon else 5911007Sshannon printf("%s",in); 6011007Sshannon } 6111007Sshannon return(0); 6211007Sshannon } 6311007Sshannon 6411007Sshannon getline(s) register char *s; { 6511007Sshannon register c; 6611007Sshannon while((*s++=c=gtc())!='\n' && c!=EOF && c!=lefteq) 6711007Sshannon if (s >= in+MAXLINE) { 6811007Sshannon error( !FATAL, "input line too long: %.20s\n", in); 6911007Sshannon in[MAXLINE] = '\0'; 7011007Sshannon break; 7111007Sshannon } 7211007Sshannon if (c==lefteq) 7311007Sshannon s--; 7411007Sshannon *s++ = '\0'; 7511007Sshannon return(c); 7611007Sshannon } 7711007Sshannon 7811007Sshannon inline() { 7911007Sshannon int ds; 8011007Sshannon 8111007Sshannon printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n"); 8211007Sshannon ds = oalloc(); 8311007Sshannon printf(".rm %d \n", ds); 8411007Sshannon do{ 8511007Sshannon if (*in) 8611007Sshannon printf(".as %d \"%s\n", ds, in); 8711007Sshannon init(); 8811007Sshannon yyparse(); 8911007Sshannon if (eqnreg > 0) { 9011007Sshannon printf(".as %d \\*(%d\n", ds, eqnreg); 9111007Sshannon ofree(eqnreg); 9211007Sshannon } 9311007Sshannon printf(".ps \\n(99\n.ft \\n(98\n"); 9411007Sshannon } while (getline(in) == lefteq); 9511007Sshannon if (*in) 9611007Sshannon printf(".as %d \"%s", ds, in); 9711007Sshannon printf(".ps \\n(99\n.ft \\n(98\n"); 9811007Sshannon printf("\\*(%d\n", ds); 9911007Sshannon ofree(ds); 10011007Sshannon } 10111007Sshannon 10211007Sshannon putout(p1) int p1; { 10311007Sshannon extern int gsize, gfont; 10411007Sshannon int before, after; 10511007Sshannon if(dbg)printf(".\tanswer <- S%d, h=%d,b=%d\n",p1, eht[p1], ebase[p1]); 10611007Sshannon eqnht = eht[p1]; 10711007Sshannon printf(".ds %d \\x'0'", p1); 10811007Sshannon /* suppposed to leave room for a subscript or superscript */ 109*11023Sshannon #ifndef NEQN 11011007Sshannon before = eht[p1] - ebase[p1] - VERT((ps*6*12)/10); 111*11023Sshannon #else NEQN 112*11023Sshannon before = eht[p1] - ebase[p1] - VERT(3); /* 3 = 1.5 lines */ 113*11023Sshannon #endif NEQN 11411007Sshannon if (before > 0) 11511007Sshannon printf("\\x'0-%du'", before); 11611007Sshannon printf("\\f%c\\s%d\\*(%d%s\\s\\n(99\\f\\n(98", 11711007Sshannon gfont, gsize, p1, rfont[p1] == ITAL ? "\\|" : ""); 118*11023Sshannon #ifndef NEQN 11911007Sshannon after = ebase[p1] - VERT((ps*6*2)/10); 120*11023Sshannon #else NEQN 121*11023Sshannon after = ebase[p1] - VERT(1); 122*11023Sshannon #endif NEQN 12311007Sshannon if (after > 0) 12411007Sshannon printf("\\x'%du'", after); 12511007Sshannon putchar('\n'); 12611007Sshannon eqnreg = p1; 12711007Sshannon } 12811007Sshannon 12911007Sshannon max(i,j) int i,j; { 13011007Sshannon return (i>j ? i : j); 13111007Sshannon } 13211007Sshannon 13311007Sshannon oalloc() { 13411007Sshannon int i; 13511007Sshannon for (i=11; i<100; i++) 13611007Sshannon if (used[i]++ == 0) return(i); 13711007Sshannon error( FATAL, "no eqn strings left", i); 13811007Sshannon return(0); 13911007Sshannon } 14011007Sshannon 14111007Sshannon ofree(n) int n; { 14211007Sshannon used[n] = 0; 14311007Sshannon } 14411007Sshannon 14511007Sshannon setps(p) int p; { 14611007Sshannon printf(".ps %d\n", EFFPS(p)); 14711007Sshannon } 14811007Sshannon 14911007Sshannon nrwid(n1, p, n2) int n1, p, n2; { 15011007Sshannon printf(".nr %d \\w'\\s%d\\*(%d'\n", n1, EFFPS(p), n2); 15111007Sshannon } 15211007Sshannon 15311007Sshannon setfile(argc, argv) int argc; char *argv[]; { 15411007Sshannon static char *nullstr = "-"; 15511007Sshannon 15611007Sshannon svargc = --argc; 15711007Sshannon svargv = argv; 15811007Sshannon while (svargc > 0 && svargv[1][0] == '-') { 15911007Sshannon switch (svargv[1][1]) { 16011007Sshannon 16111007Sshannon case 'd': lefteq=svargv[1][2]; righteq=svargv[1][3]; break; 16211007Sshannon case 's': gsize = atoi(&svargv[1][2]); break; 16311007Sshannon case 'p': deltaps = atoi(&svargv[1][2]); break; 16411007Sshannon case 'f': gfont = svargv[1][2]; break; 16511007Sshannon case 'e': noeqn++; break; 16611007Sshannon default: dbg = 1; 16711007Sshannon } 16811007Sshannon svargc--; 16911007Sshannon svargv++; 17011007Sshannon } 17111007Sshannon ifile = 1; 17211007Sshannon linect = 1; 17311007Sshannon if (svargc <= 0) { 17411007Sshannon curfile = stdin; 17511007Sshannon svargv[1] = nullstr; 17611007Sshannon } 17711007Sshannon else if ((curfile = fopen(svargv[1], "r")) == NULL) 17811007Sshannon error( FATAL,"can't open file %s", svargv[1]); 17911007Sshannon } 18011007Sshannon 18111007Sshannon yyerror() {;} 18211007Sshannon 18311007Sshannon init() { 18411007Sshannon ct = 0; 18511007Sshannon ps = gsize; 18611007Sshannon ft = gfont; 18711007Sshannon setps(ps); 18811007Sshannon printf(".ft %c\n", ft); 18911007Sshannon } 19011007Sshannon 19111007Sshannon error(fatal, s1, s2) int fatal; char *s1, *s2; { 19211007Sshannon if (fatal>0) 19311007Sshannon printf("eqn fatal error: "); 19411007Sshannon printf(s1,s2); 19511007Sshannon printf("\nfile %s, between lines %d and %d\n", 19611007Sshannon svargv[ifile], eqline, linect); 19711007Sshannon fprintf(stderr, "eqn: "); 19811007Sshannon if (fatal>0) 19911007Sshannon fprintf(stderr, "fatal error: "); 20011007Sshannon fprintf(stderr, s1, s2); 20111007Sshannon fprintf(stderr, "\nfile %s, between lines %d and %d\n", 20211007Sshannon svargv[ifile], eqline, linect); 20311007Sshannon if (fatal > 0) 20411007Sshannon eqnexit(1); 20511007Sshannon } 206