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