118159Sjaap #ifndef lint
2*18300Sjaap static char *sccsid = "io.c (CWI) 1.2 85/03/12";
318159Sjaap #endif
418159Sjaap # include "e.h"
518159Sjaap #define MAXLINE 3600 /* maximum input line */
618159Sjaap /* huge for Chris's graphics language */
718159Sjaap
818159Sjaap char in[MAXLINE]; /* input buffer */
918159Sjaap int eqnexit();
1018159Sjaap int noeqn;
1118159Sjaap
main(argc,argv)1218159Sjaap main(argc,argv) int argc; char *argv[];{
1318159Sjaap
1418159Sjaap eqnexit(eqn(argc, argv));
1518159Sjaap }
1618159Sjaap
eqnexit(n)1718159Sjaap eqnexit(n) {
1818159Sjaap #ifdef gcos
1918159Sjaap if (n)
2018159Sjaap fprintf(stderr, "run terminated due to eqn error\n");
2118159Sjaap exit(0);
2218159Sjaap #endif
2318159Sjaap exit(n);
2418159Sjaap }
2518159Sjaap
eqn(argc,argv)2618159Sjaap eqn(argc,argv) int argc; char *argv[];{
2718159Sjaap int i, type;
2818159Sjaap
2918159Sjaap setfile(argc,argv);
3018159Sjaap init_tbl(); /* install keywords in tables */
3118159Sjaap while ((type=getline(in)) != EOF) {
3218159Sjaap eqline = linect;
3318159Sjaap if (in[0]=='.' && in[1]=='E' && in[2]=='Q') {
3418159Sjaap for (i=11; i<100; used[i++]=0);
3518159Sjaap printf("%s",in);
3618159Sjaap printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n");
3718159Sjaap markline = 0;
3818159Sjaap init();
3918159Sjaap yyparse();
4018159Sjaap if (eqnreg>0) {
4118159Sjaap printf(".nr %d \\w'\\*(%d'\n", eqnreg, eqnreg);
4218159Sjaap /* printf(".if \\n(%d>\\n(.l .tm too-long eqn, file %s, between lines %d-%d\n", */
4318159Sjaap /* eqnreg, svargv[ifile], eqline, linect); */
4418159Sjaap printf(".nr MK %d\n", markline); /* for -ms macros */
4518159Sjaap printf(".if %d>\\n(.v .ne %du\n", eqnht, eqnht);
4618159Sjaap printf(".rn %d 10\n", eqnreg);
4718159Sjaap if(!noeqn)printf("\\*(10\n");
4818159Sjaap }
4918159Sjaap printf(".ps \\n(99\n.ft \\n(98\n");
5018159Sjaap printf(".EN");
5118159Sjaap if (lastchar == EOF) {
5218159Sjaap putchar('\n');
5318159Sjaap break;
5418159Sjaap }
5518159Sjaap if (putchar(lastchar) != '\n')
5618159Sjaap while (putchar(gtc()) != '\n');
5718159Sjaap }
5818159Sjaap else if (type == lefteq)
5918159Sjaap inline();
6018159Sjaap else
6118159Sjaap printf("%s",in);
6218159Sjaap }
6318159Sjaap return(0);
6418159Sjaap }
6518159Sjaap
getline(s)6618159Sjaap getline(s) register char *s; {
6718159Sjaap register c;
6818159Sjaap while((*s++=c=gtc())!='\n' && c!=EOF && c!=lefteq)
6918159Sjaap if (s >= in+MAXLINE) {
7018159Sjaap error( !FATAL, "input line too long: %.20s\n", in);
7118159Sjaap in[MAXLINE] = '\0';
7218159Sjaap break;
7318159Sjaap }
7418159Sjaap if (c==lefteq)
7518159Sjaap s--;
7618159Sjaap *s++ = '\0';
7718159Sjaap return(c);
7818159Sjaap }
7918159Sjaap
8018159Sjaap inline() {
8118159Sjaap int ds;
8218159Sjaap
8318159Sjaap printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n");
8418159Sjaap ds = oalloc();
8518159Sjaap printf(".rm %d \n", ds);
8618159Sjaap do{
8718159Sjaap if (*in)
8818159Sjaap printf(".as %d \"%s\n", ds, in);
8918159Sjaap init();
9018159Sjaap yyparse();
9118159Sjaap if (eqnreg > 0) {
9218159Sjaap printf(".as %d \\*(%d\n", ds, eqnreg);
9318159Sjaap ofree(eqnreg);
9418159Sjaap }
9518159Sjaap printf(".ps \\n(99\n.ft \\n(98\n");
9618159Sjaap } while (getline(in) == lefteq);
9718159Sjaap if (*in)
9818159Sjaap printf(".as %d \"%s", ds, in);
9918159Sjaap printf(".ps \\n(99\n.ft \\n(98\n");
10018159Sjaap printf("\\*(%d\n", ds);
10118159Sjaap ofree(ds);
10218159Sjaap }
10318159Sjaap
putout(p1)10418159Sjaap putout(p1) int p1; {
10518159Sjaap extern int gsize, gfont;
10618159Sjaap int before, after;
10718159Sjaap if(dbg)printf(".\tanswer <- S%d, h=%d,b=%d\n",p1, eht[p1], ebase[p1]);
10818159Sjaap eqnht = eht[p1];
10918159Sjaap printf(".ds %d \\x'0'", p1);
11018159Sjaap /* suppposed to leave room for a subscript or superscript */
11118159Sjaap before = eht[p1] - ebase[p1] - VERT( EM(1.2, ps) );
11218159Sjaap if (spaceval != NULL)
11318159Sjaap printf("\\x'0-%s'", spaceval);
11418159Sjaap else if (before > 0)
11518159Sjaap printf("\\x'0-%du'", before);
11618159Sjaap printf("\\f%c\\s%d\\*(%d%s\\s\\n(99\\f\\n(98",
11718159Sjaap gfont, gsize, p1, rfont[p1] == ITAL ? "\\|" : "");
11818159Sjaap after = ebase[p1] - VERT( EM(0.2, ps) );
11918159Sjaap if (spaceval == NULL && after > 0)
12018159Sjaap printf("\\x'%du'", after);
12118159Sjaap putchar('\n');
12218159Sjaap eqnreg = p1;
12318159Sjaap if (spaceval != NULL) {
12418159Sjaap free(spaceval);
12518159Sjaap spaceval = NULL;
12618159Sjaap }
12718159Sjaap }
12818159Sjaap
max(i,j)12918159Sjaap max(i,j) int i,j; {
13018159Sjaap return (i>j ? i : j);
13118159Sjaap }
13218159Sjaap
oalloc()13318159Sjaap oalloc() {
13418159Sjaap int i;
13518159Sjaap for (i=11; i<100; i++)
13618159Sjaap if (used[i]++ == 0) return(i);
13718159Sjaap error( FATAL, "no eqn strings left", i);
13818159Sjaap return(0);
13918159Sjaap }
14018159Sjaap
ofree(n)14118159Sjaap ofree(n) int n; {
14218159Sjaap used[n] = 0;
14318159Sjaap }
14418159Sjaap
setps(p)14518159Sjaap setps(p) int p; {
14618159Sjaap printf(".ps %d\n", EFFPS(p));
14718159Sjaap }
14818159Sjaap
nrwid(n1,p,n2)14918159Sjaap nrwid(n1, p, n2) int n1, p, n2; {
15018159Sjaap printf(".nr %d \\w'\\s%d\\*(%d'\n", n1, EFFPS(p), n2);
15118159Sjaap }
15218159Sjaap
setfile(argc,argv)15318159Sjaap setfile(argc, argv) int argc; char *argv[]; {
15418159Sjaap static char *nullstr = "-";
15518159Sjaap
15618159Sjaap svargc = --argc;
15718159Sjaap svargv = argv;
15818159Sjaap while (svargc > 0 && svargv[1][0] == '-') {
15918159Sjaap switch (svargv[1][1]) {
16018159Sjaap
16118159Sjaap case 'd': lefteq=svargv[1][2]; righteq=svargv[1][3]; break;
16218159Sjaap case 's': gsize = atoi(&svargv[1][2]); break;
16318159Sjaap case 'p': deltaps = atoi(&svargv[1][2]); break;
16418159Sjaap case 'r': res = atoi(&svargv[1][2]); break;
16518159Sjaap case 'm': minsize = atoi(&svargv[1][2]); break;
16618159Sjaap case 'f': gfont = svargv[1][2]; break;
16718159Sjaap case 'e': noeqn++; break;
16818159Sjaap case 'T':
16918159Sjaap if (strcmp(&svargv[1][2], "202") == 0)
17018159Sjaap {res = 972; minsize = 5; ttype = DEV202; }
17118159Sjaap else if (strcmp(&svargv[1][2], "aps") == 0)
17218159Sjaap {res = 723; minsize = 5; ttype = DEVAPS; }
17318159Sjaap else if (strcmp(&svargv[1][2], "cat") == 0)
17418159Sjaap {res = 432; minsize = 6; ttype = DEVCAT; }
17518159Sjaap else if (strcmp(&svargv[1][2], "har") == 0)
17618159Sjaap {res = 1445; minsize = 4; ttype = DEVHAR; }
177*18300Sjaap else if (strcmp(&svargv[1][2], "ver") == 0)
178*18300Sjaap {res = 200; minsize = 6; ttype = DEVVER; }
17918159Sjaap else
18018159Sjaap error(FATAL, "unknown typesetter %s", &argv[1][2]);
18118159Sjaap break;
18218159Sjaap default: dbg = 1;
18318159Sjaap }
18418159Sjaap svargc--;
18518159Sjaap svargv++;
18618159Sjaap }
18718159Sjaap ifile = 1;
18818159Sjaap linect = 1;
18918159Sjaap if (svargc <= 0) {
19018159Sjaap curfile = stdin;
19118159Sjaap svargv[1] = nullstr;
19218159Sjaap }
19318159Sjaap else if ((curfile = fopen(svargv[1], "r")) == NULL)
19418159Sjaap error( FATAL,"can't open file %s", svargv[1]);
19518159Sjaap }
19618159Sjaap
yyerror()19718159Sjaap yyerror() {;}
19818159Sjaap
init()19918159Sjaap init() {
20018159Sjaap ct = 0;
20118159Sjaap ps = gsize;
20218159Sjaap ft = gfont;
20318159Sjaap setps(ps);
20418159Sjaap printf(".ft %c\n", ft);
20518159Sjaap }
20618159Sjaap
error(fatal,s1,s2)20718159Sjaap error(fatal, s1, s2) int fatal; char *s1, *s2; {
20818159Sjaap if (fatal>0)
20918159Sjaap printf("eqn fatal error: ");
21018159Sjaap printf(s1,s2);
21118159Sjaap printf("\nfile %s, between lines %d and %d\n",
21218159Sjaap svargv[ifile], eqline, linect);
21318159Sjaap fprintf(stderr, "eqn: ");
21418159Sjaap if (fatal>0)
21518159Sjaap fprintf(stderr, "fatal error: ");
21618159Sjaap fprintf(stderr, s1, s2);
21718159Sjaap fprintf(stderr, "\nfile %s, between lines %d and %d\n",
21818159Sjaap svargv[ifile], eqline, linect);
21918159Sjaap if (fatal > 0)
22018159Sjaap eqnexit(1);
22118159Sjaap }
222