+/* io.c 4.1 83/02/11 */
+
+# include "e.h"
+#define MAXLINE 1200 /* maximum input line */
+
+char in[MAXLINE]; /* input buffer */
+int eqnexit();
+int noeqn;
+
+main(argc,argv) int argc; char *argv[];{
+
+ eqnexit(eqn(argc, argv));
+}
+
+eqnexit(n) {
+#ifdef gcos
+ if (n)
+ fprintf(stderr, "run terminated due to eqn error\n");
+ exit(0);
+#endif
+ exit(n);
+}
+
+eqn(argc,argv) int argc; char *argv[];{
+ int i, type;
+
+ setfile(argc,argv);
+ init_tbl(); /* install keywords in tables */
+ while ((type=getline(in)) != EOF) {
+ eqline = linect;
+ if (in[0]=='.' && in[1]=='E' && in[2]=='Q') {
+ for (i=11; i<100; used[i++]=0);
+ printf("%s",in);
+ printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n");
+ markline = 0;
+ init();
+ yyparse();
+ if (eqnreg>0) {
+ printf(".nr %d \\w'\\*(%d'\n", eqnreg, eqnreg);
+ /* printf(".if \\n(%d>\\n(.l .tm too-long eqn, file %s, between lines %d-%d\n", */
+ /* eqnreg, svargv[ifile], eqline, linect); */
+ printf(".nr MK %d\n", markline); /* for -ms macros */
+ printf(".if %d>\\n(.v .ne %du\n", eqnht, eqnht);
+ printf(".rn %d 10\n", eqnreg);
+ if(!noeqn)printf("\\*(10\n");
+ }
+ printf(".ps \\n(99\n.ft \\n(98\n");
+ printf(".EN");
+ if (lastchar == EOF) {
+ putchar('\n');
+ break;
+ }
+ if (putchar(lastchar) != '\n')
+ while (putchar(gtc()) != '\n');
+ }
+ else if (type == lefteq)
+ inline();
+ else
+ printf("%s",in);
+ }
+ return(0);
+}
+
+getline(s) register char *s; {
+ register c;
+ while((*s++=c=gtc())!='\n' && c!=EOF && c!=lefteq)
+ if (s >= in+MAXLINE) {
+ error( !FATAL, "input line too long: %.20s\n", in);
+ in[MAXLINE] = '\0';
+ break;
+ }
+ if (c==lefteq)
+ s--;
+ *s++ = '\0';
+ return(c);
+}
+
+inline() {
+ int ds;
+
+ printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n");
+ ds = oalloc();
+ printf(".rm %d \n", ds);
+ do{
+ if (*in)
+ printf(".as %d \"%s\n", ds, in);
+ init();
+ yyparse();
+ if (eqnreg > 0) {
+ printf(".as %d \\*(%d\n", ds, eqnreg);
+ ofree(eqnreg);
+ }
+ printf(".ps \\n(99\n.ft \\n(98\n");
+ } while (getline(in) == lefteq);
+ if (*in)
+ printf(".as %d \"%s", ds, in);
+ printf(".ps \\n(99\n.ft \\n(98\n");
+ printf("\\*(%d\n", ds);
+ ofree(ds);
+}
+
+putout(p1) int p1; {
+ extern int gsize, gfont;
+ int before, after;
+ if(dbg)printf(".\tanswer <- S%d, h=%d,b=%d\n",p1, eht[p1], ebase[p1]);
+ eqnht = eht[p1];
+ printf(".ds %d \\x'0'", p1);
+ /* suppposed to leave room for a subscript or superscript */
+ before = eht[p1] - ebase[p1] - VERT((ps*6*12)/10);
+ if (before > 0)
+ printf("\\x'0-%du'", before);
+ printf("\\f%c\\s%d\\*(%d%s\\s\\n(99\\f\\n(98",
+ gfont, gsize, p1, rfont[p1] == ITAL ? "\\|" : "");
+ after = ebase[p1] - VERT((ps*6*2)/10);
+ if (after > 0)
+ printf("\\x'%du'", after);
+ putchar('\n');
+ eqnreg = p1;
+}
+
+max(i,j) int i,j; {
+ return (i>j ? i : j);
+}
+
+oalloc() {
+ int i;
+ for (i=11; i<100; i++)
+ if (used[i]++ == 0) return(i);
+ error( FATAL, "no eqn strings left", i);
+ return(0);
+}
+
+ofree(n) int n; {
+ used[n] = 0;
+}
+
+setps(p) int p; {
+ printf(".ps %d\n", EFFPS(p));
+}
+
+nrwid(n1, p, n2) int n1, p, n2; {
+ printf(".nr %d \\w'\\s%d\\*(%d'\n", n1, EFFPS(p), n2);
+}
+
+setfile(argc, argv) int argc; char *argv[]; {
+ static char *nullstr = "-";
+
+ svargc = --argc;
+ svargv = argv;
+ while (svargc > 0 && svargv[1][0] == '-') {
+ switch (svargv[1][1]) {
+
+ case 'd': lefteq=svargv[1][2]; righteq=svargv[1][3]; break;
+ case 's': gsize = atoi(&svargv[1][2]); break;
+ case 'p': deltaps = atoi(&svargv[1][2]); break;
+ case 'f': gfont = svargv[1][2]; break;
+ case 'e': noeqn++; break;
+ default: dbg = 1;
+ }
+ svargc--;
+ svargv++;
+ }
+ ifile = 1;
+ linect = 1;
+ if (svargc <= 0) {
+ curfile = stdin;
+ svargv[1] = nullstr;
+ }
+ else if ((curfile = fopen(svargv[1], "r")) == NULL)
+ error( FATAL,"can't open file %s", svargv[1]);
+}
+
+yyerror() {;}
+
+init() {
+ ct = 0;
+ ps = gsize;
+ ft = gfont;
+ setps(ps);
+ printf(".ft %c\n", ft);
+}
+
+error(fatal, s1, s2) int fatal; char *s1, *s2; {
+ if (fatal>0)
+ printf("eqn fatal error: ");
+ printf(s1,s2);
+ printf("\nfile %s, between lines %d and %d\n",
+ svargv[ifile], eqline, linect);
+ fprintf(stderr, "eqn: ");
+ if (fatal>0)
+ fprintf(stderr, "fatal error: ");
+ fprintf(stderr, s1, s2);
+ fprintf(stderr, "\nfile %s, between lines %d and %d\n",
+ svargv[ifile], eqline, linect);
+ if (fatal > 0)
+ eqnexit(1);
+}