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