xref: /csrg-svn/old/eqn/common_source/io.c (revision 14486)
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