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