xref: /csrg-svn/old/eqn/common_source/io.c (revision 48252)
1*48252Sbostic /*-
2*48252Sbostic  * Copyright (c) 1991 The Regents of the University of California.
3*48252Sbostic  * All rights reserved.
4*48252Sbostic  *
5*48252Sbostic  * %sccs.include.proprietary.c%
6*48252Sbostic  */
7*48252Sbostic 
814486Ssam #ifndef lint
9*48252Sbostic char copyright[] =
10*48252Sbostic "@(#) Copyright (c) 1991 The Regents of the University of California.\n\
11*48252Sbostic  All rights reserved.\n";
12*48252Sbostic #endif /* not lint */
1311007Sshannon 
14*48252Sbostic #ifndef lint
15*48252Sbostic static char sccsid[] = "@(#)io.c	4.6 (Berkeley) 04/17/91";
16*48252Sbostic #endif /* not lint */
17*48252Sbostic 
1811007Sshannon # include "e.h"
1911007Sshannon #define	MAXLINE	1200	/* maximum input line */
2011007Sshannon 
2111007Sshannon char	in[MAXLINE];	/* input buffer */
2211007Sshannon int	eqnexit();
2311007Sshannon int noeqn;
2411007Sshannon 
main(argc,argv)2511007Sshannon main(argc,argv) int argc; char *argv[];{
2611007Sshannon 
2711007Sshannon 	eqnexit(eqn(argc, argv));
2811007Sshannon }
2911007Sshannon 
eqnexit(n)3011007Sshannon eqnexit(n) {
3111007Sshannon #ifdef gcos
3211007Sshannon 	if (n)
3311007Sshannon 		fprintf(stderr, "run terminated due to eqn error\n");
3411007Sshannon 	exit(0);
3511007Sshannon #endif
3611007Sshannon 	exit(n);
3711007Sshannon }
3811007Sshannon 
eqn(argc,argv)3911007Sshannon eqn(argc,argv) int argc; char *argv[];{
4011007Sshannon 	int i, type;
4111007Sshannon 
4211007Sshannon 	setfile(argc,argv);
4311007Sshannon 	init_tbl();	/* install keywords in tables */
4411007Sshannon 	while ((type=getline(in)) != EOF) {
4511007Sshannon 		eqline = linect;
4611007Sshannon 		if (in[0]=='.' && in[1]=='E' && in[2]=='Q') {
4711007Sshannon 			for (i=11; i<100; used[i++]=0);
4811007Sshannon 			printf("%s",in);
4911007Sshannon 			printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n");
5011007Sshannon 			markline = 0;
5111007Sshannon 			init();
5211007Sshannon 			yyparse();
5311007Sshannon 			if (eqnreg>0) {
5411007Sshannon 				printf(".nr %d \\w'\\*(%d'\n", eqnreg, eqnreg);
5511007Sshannon 				/* printf(".if \\n(%d>\\n(.l .tm too-long eqn, file %s, between lines %d-%d\n",	*/
5611007Sshannon 				/*	eqnreg, svargv[ifile], eqline, linect);	*/
5711007Sshannon 				printf(".nr MK %d\n", markline);	/* for -ms macros */
5811007Sshannon 				printf(".if %d>\\n(.v .ne %du\n", eqnht, eqnht);
5911007Sshannon 				printf(".rn %d 10\n", eqnreg);
6011007Sshannon 				if(!noeqn)printf("\\*(10\n");
6111007Sshannon 			}
6211007Sshannon 			printf(".ps \\n(99\n.ft \\n(98\n");
6311007Sshannon 			printf(".EN");
6411007Sshannon 			if (lastchar == EOF) {
6511007Sshannon 				putchar('\n');
6611007Sshannon 				break;
6711007Sshannon 			}
6811007Sshannon 			if (putchar(lastchar) != '\n')
6911007Sshannon 				while (putchar(gtc()) != '\n');
7011007Sshannon 		}
7111007Sshannon 		else if (type == lefteq)
7235271Sbostic 			in_line();
7311007Sshannon 		else
7411007Sshannon 			printf("%s",in);
7511007Sshannon 	}
7611007Sshannon 	return(0);
7711007Sshannon }
7811007Sshannon 
getline(s)7911007Sshannon getline(s) register char *s; {
8011007Sshannon 	register c;
8111007Sshannon 	while((*s++=c=gtc())!='\n' && c!=EOF && c!=lefteq)
8211007Sshannon 		if (s >= in+MAXLINE) {
8311007Sshannon 			error( !FATAL, "input line too long: %.20s\n", in);
8411007Sshannon 			in[MAXLINE] = '\0';
8511007Sshannon 			break;
8611007Sshannon 		}
8711007Sshannon 	if (c==lefteq)
8811007Sshannon 		s--;
8911007Sshannon 	*s++ = '\0';
9011007Sshannon 	return(c);
9111007Sshannon }
9211007Sshannon 
in_line()9335271Sbostic in_line() {
9411007Sshannon 	int ds;
9511007Sshannon 
9611007Sshannon 	printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n");
9711007Sshannon 	ds = oalloc();
9811007Sshannon 	printf(".rm %d \n", ds);
9911007Sshannon 	do{
10011007Sshannon 		if (*in)
10111007Sshannon 			printf(".as %d \"%s\n", ds, in);
10211007Sshannon 		init();
10311007Sshannon 		yyparse();
10411007Sshannon 		if (eqnreg > 0) {
10511007Sshannon 			printf(".as %d \\*(%d\n", ds, eqnreg);
10611007Sshannon 			ofree(eqnreg);
10711007Sshannon 		}
10811007Sshannon 		printf(".ps \\n(99\n.ft \\n(98\n");
10911007Sshannon 	} while (getline(in) == lefteq);
11011007Sshannon 	if (*in)
11111007Sshannon 		printf(".as %d \"%s", ds, in);
11211007Sshannon 	printf(".ps \\n(99\n.ft \\n(98\n");
11311007Sshannon 	printf("\\*(%d\n", ds);
11411007Sshannon 	ofree(ds);
11511007Sshannon }
11611007Sshannon 
putout(p1)11711007Sshannon putout(p1) int p1; {
11811007Sshannon 	extern int gsize, gfont;
11911007Sshannon 	int before, after;
12011007Sshannon 	if(dbg)printf(".\tanswer <- S%d, h=%d,b=%d\n",p1, eht[p1], ebase[p1]);
12111007Sshannon 	eqnht = eht[p1];
12211007Sshannon 	printf(".ds %d \\x'0'", p1);
12311007Sshannon 	/* suppposed to leave room for a subscript or superscript */
12411023Sshannon #ifndef NEQN
12511007Sshannon 	before = eht[p1] - ebase[p1] - VERT((ps*6*12)/10);
12611023Sshannon #else NEQN
12711023Sshannon 	before = eht[p1] - ebase[p1] - VERT(3);	/* 3 = 1.5 lines */
12811023Sshannon #endif NEQN
12911007Sshannon 	if (before > 0)
13011007Sshannon 		printf("\\x'0-%du'", before);
13111007Sshannon 	printf("\\f%c\\s%d\\*(%d%s\\s\\n(99\\f\\n(98",
13211007Sshannon 		gfont, gsize, p1, rfont[p1] == ITAL ? "\\|" : "");
13311023Sshannon #ifndef NEQN
13411007Sshannon 	after = ebase[p1] - VERT((ps*6*2)/10);
13511023Sshannon #else NEQN
13611023Sshannon 	after = ebase[p1] - VERT(1);
13711023Sshannon #endif NEQN
13811007Sshannon 	if (after > 0)
13911007Sshannon 		printf("\\x'%du'", after);
14011007Sshannon 	putchar('\n');
14111007Sshannon 	eqnreg = p1;
14211007Sshannon }
14311007Sshannon 
max(i,j)14411007Sshannon max(i,j) int i,j; {
14511007Sshannon 	return (i>j ? i : j);
14611007Sshannon }
14711007Sshannon 
oalloc()14811007Sshannon oalloc() {
14911007Sshannon 	int i;
15011007Sshannon 	for (i=11; i<100; i++)
15111007Sshannon 		if (used[i]++ == 0) return(i);
15211007Sshannon 	error( FATAL, "no eqn strings left", i);
15311007Sshannon 	return(0);
15411007Sshannon }
15511007Sshannon 
ofree(n)15611007Sshannon ofree(n) int n; {
15711007Sshannon 	used[n] = 0;
15811007Sshannon }
15911007Sshannon 
setps(p)16011007Sshannon setps(p) int p; {
16111007Sshannon 	printf(".ps %d\n", EFFPS(p));
16211007Sshannon }
16311007Sshannon 
nrwid(n1,p,n2)16411007Sshannon nrwid(n1, p, n2) int n1, p, n2; {
16511007Sshannon 	printf(".nr %d \\w'\\s%d\\*(%d'\n", n1, EFFPS(p), n2);
16611007Sshannon }
16711007Sshannon 
setfile(argc,argv)16811007Sshannon setfile(argc, argv) int argc; char *argv[]; {
16911007Sshannon 	static char *nullstr = "-";
17011007Sshannon 
17111007Sshannon 	svargc = --argc;
17211007Sshannon 	svargv = argv;
17311007Sshannon 	while (svargc > 0 && svargv[1][0] == '-') {
17411007Sshannon 		switch (svargv[1][1]) {
17511007Sshannon 
17611007Sshannon 		case 'd': lefteq=svargv[1][2]; righteq=svargv[1][3]; break;
17711007Sshannon 		case 's': gsize = atoi(&svargv[1][2]); break;
17811007Sshannon 		case 'p': deltaps = atoi(&svargv[1][2]); break;
17911007Sshannon 		case 'f': gfont = svargv[1][2]; break;
18011007Sshannon 		case 'e': noeqn++; break;
18114899Srrh 		case 0:	goto endargs;
18211007Sshannon 		default: dbg = 1;
18311007Sshannon 		}
18411007Sshannon 		svargc--;
18511007Sshannon 		svargv++;
18611007Sshannon 	}
18714899Srrh   endargs:
18811007Sshannon 	ifile = 1;
18911007Sshannon 	linect = 1;
19011007Sshannon 	if (svargc <= 0) {
19111007Sshannon 		curfile = stdin;
19211007Sshannon 		svargv[1] = nullstr;
19311007Sshannon 	}
19414899Srrh 	else
19514899Srrh 		openinfile();	/* opens up the first input file */
19611007Sshannon }
19711007Sshannon 
yyerror()19811007Sshannon yyerror() {;}
19911007Sshannon 
init()20011007Sshannon init() {
20111007Sshannon 	ct = 0;
20211007Sshannon 	ps = gsize;
20311007Sshannon 	ft = gfont;
20411007Sshannon 	setps(ps);
20511007Sshannon 	printf(".ft %c\n", ft);
20611007Sshannon }
20711007Sshannon 
error(fatal,s1,s2)20811007Sshannon error(fatal, s1, s2) int fatal; char *s1, *s2; {
20911007Sshannon 	if (fatal>0)
21011007Sshannon 		printf("eqn fatal error: ");
21111007Sshannon 	printf(s1,s2);
21211007Sshannon 	printf("\nfile %s, between lines %d and %d\n",
21311007Sshannon 		 svargv[ifile], eqline, linect);
21411007Sshannon 	fprintf(stderr, "eqn: ");
21511007Sshannon 	if (fatal>0)
21611007Sshannon 		fprintf(stderr, "fatal error: ");
21711007Sshannon 	fprintf(stderr, s1, s2);
21811007Sshannon 	fprintf(stderr, "\nfile %s, between lines %d and %d\n",
21911007Sshannon 		 svargv[ifile], eqline, linect);
22011007Sshannon 	if (fatal > 0)
22111007Sshannon 		eqnexit(1);
22211007Sshannon }
223