xref: /csrg-svn/old/eqn/common_source/io.c (revision 11007)
1*11007Sshannon /*	io.c	4.1	83/02/11	*/
2*11007Sshannon 
3*11007Sshannon # include "e.h"
4*11007Sshannon #define	MAXLINE	1200	/* maximum input line */
5*11007Sshannon 
6*11007Sshannon char	in[MAXLINE];	/* input buffer */
7*11007Sshannon int	eqnexit();
8*11007Sshannon int noeqn;
9*11007Sshannon 
10*11007Sshannon main(argc,argv) int argc; char *argv[];{
11*11007Sshannon 
12*11007Sshannon 	eqnexit(eqn(argc, argv));
13*11007Sshannon }
14*11007Sshannon 
15*11007Sshannon eqnexit(n) {
16*11007Sshannon #ifdef gcos
17*11007Sshannon 	if (n)
18*11007Sshannon 		fprintf(stderr, "run terminated due to eqn error\n");
19*11007Sshannon 	exit(0);
20*11007Sshannon #endif
21*11007Sshannon 	exit(n);
22*11007Sshannon }
23*11007Sshannon 
24*11007Sshannon eqn(argc,argv) int argc; char *argv[];{
25*11007Sshannon 	int i, type;
26*11007Sshannon 
27*11007Sshannon 	setfile(argc,argv);
28*11007Sshannon 	init_tbl();	/* install keywords in tables */
29*11007Sshannon 	while ((type=getline(in)) != EOF) {
30*11007Sshannon 		eqline = linect;
31*11007Sshannon 		if (in[0]=='.' && in[1]=='E' && in[2]=='Q') {
32*11007Sshannon 			for (i=11; i<100; used[i++]=0);
33*11007Sshannon 			printf("%s",in);
34*11007Sshannon 			printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n");
35*11007Sshannon 			markline = 0;
36*11007Sshannon 			init();
37*11007Sshannon 			yyparse();
38*11007Sshannon 			if (eqnreg>0) {
39*11007Sshannon 				printf(".nr %d \\w'\\*(%d'\n", eqnreg, eqnreg);
40*11007Sshannon 				/* printf(".if \\n(%d>\\n(.l .tm too-long eqn, file %s, between lines %d-%d\n",	*/
41*11007Sshannon 				/*	eqnreg, svargv[ifile], eqline, linect);	*/
42*11007Sshannon 				printf(".nr MK %d\n", markline);	/* for -ms macros */
43*11007Sshannon 				printf(".if %d>\\n(.v .ne %du\n", eqnht, eqnht);
44*11007Sshannon 				printf(".rn %d 10\n", eqnreg);
45*11007Sshannon 				if(!noeqn)printf("\\*(10\n");
46*11007Sshannon 			}
47*11007Sshannon 			printf(".ps \\n(99\n.ft \\n(98\n");
48*11007Sshannon 			printf(".EN");
49*11007Sshannon 			if (lastchar == EOF) {
50*11007Sshannon 				putchar('\n');
51*11007Sshannon 				break;
52*11007Sshannon 			}
53*11007Sshannon 			if (putchar(lastchar) != '\n')
54*11007Sshannon 				while (putchar(gtc()) != '\n');
55*11007Sshannon 		}
56*11007Sshannon 		else if (type == lefteq)
57*11007Sshannon 			inline();
58*11007Sshannon 		else
59*11007Sshannon 			printf("%s",in);
60*11007Sshannon 	}
61*11007Sshannon 	return(0);
62*11007Sshannon }
63*11007Sshannon 
64*11007Sshannon getline(s) register char *s; {
65*11007Sshannon 	register c;
66*11007Sshannon 	while((*s++=c=gtc())!='\n' && c!=EOF && c!=lefteq)
67*11007Sshannon 		if (s >= in+MAXLINE) {
68*11007Sshannon 			error( !FATAL, "input line too long: %.20s\n", in);
69*11007Sshannon 			in[MAXLINE] = '\0';
70*11007Sshannon 			break;
71*11007Sshannon 		}
72*11007Sshannon 	if (c==lefteq)
73*11007Sshannon 		s--;
74*11007Sshannon 	*s++ = '\0';
75*11007Sshannon 	return(c);
76*11007Sshannon }
77*11007Sshannon 
78*11007Sshannon inline() {
79*11007Sshannon 	int ds;
80*11007Sshannon 
81*11007Sshannon 	printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n");
82*11007Sshannon 	ds = oalloc();
83*11007Sshannon 	printf(".rm %d \n", ds);
84*11007Sshannon 	do{
85*11007Sshannon 		if (*in)
86*11007Sshannon 			printf(".as %d \"%s\n", ds, in);
87*11007Sshannon 		init();
88*11007Sshannon 		yyparse();
89*11007Sshannon 		if (eqnreg > 0) {
90*11007Sshannon 			printf(".as %d \\*(%d\n", ds, eqnreg);
91*11007Sshannon 			ofree(eqnreg);
92*11007Sshannon 		}
93*11007Sshannon 		printf(".ps \\n(99\n.ft \\n(98\n");
94*11007Sshannon 	} while (getline(in) == lefteq);
95*11007Sshannon 	if (*in)
96*11007Sshannon 		printf(".as %d \"%s", ds, in);
97*11007Sshannon 	printf(".ps \\n(99\n.ft \\n(98\n");
98*11007Sshannon 	printf("\\*(%d\n", ds);
99*11007Sshannon 	ofree(ds);
100*11007Sshannon }
101*11007Sshannon 
102*11007Sshannon putout(p1) int p1; {
103*11007Sshannon 	extern int gsize, gfont;
104*11007Sshannon 	int before, after;
105*11007Sshannon 	if(dbg)printf(".\tanswer <- S%d, h=%d,b=%d\n",p1, eht[p1], ebase[p1]);
106*11007Sshannon 	eqnht = eht[p1];
107*11007Sshannon 	printf(".ds %d \\x'0'", p1);
108*11007Sshannon 	/* suppposed to leave room for a subscript or superscript */
109*11007Sshannon 	before = eht[p1] - ebase[p1] - VERT((ps*6*12)/10);
110*11007Sshannon 	if (before > 0)
111*11007Sshannon 		printf("\\x'0-%du'", before);
112*11007Sshannon 	printf("\\f%c\\s%d\\*(%d%s\\s\\n(99\\f\\n(98",
113*11007Sshannon 		gfont, gsize, p1, rfont[p1] == ITAL ? "\\|" : "");
114*11007Sshannon 	after = ebase[p1] - VERT((ps*6*2)/10);
115*11007Sshannon 	if (after > 0)
116*11007Sshannon 		printf("\\x'%du'", after);
117*11007Sshannon 	putchar('\n');
118*11007Sshannon 	eqnreg = p1;
119*11007Sshannon }
120*11007Sshannon 
121*11007Sshannon max(i,j) int i,j; {
122*11007Sshannon 	return (i>j ? i : j);
123*11007Sshannon }
124*11007Sshannon 
125*11007Sshannon oalloc() {
126*11007Sshannon 	int i;
127*11007Sshannon 	for (i=11; i<100; i++)
128*11007Sshannon 		if (used[i]++ == 0) return(i);
129*11007Sshannon 	error( FATAL, "no eqn strings left", i);
130*11007Sshannon 	return(0);
131*11007Sshannon }
132*11007Sshannon 
133*11007Sshannon ofree(n) int n; {
134*11007Sshannon 	used[n] = 0;
135*11007Sshannon }
136*11007Sshannon 
137*11007Sshannon setps(p) int p; {
138*11007Sshannon 	printf(".ps %d\n", EFFPS(p));
139*11007Sshannon }
140*11007Sshannon 
141*11007Sshannon nrwid(n1, p, n2) int n1, p, n2; {
142*11007Sshannon 	printf(".nr %d \\w'\\s%d\\*(%d'\n", n1, EFFPS(p), n2);
143*11007Sshannon }
144*11007Sshannon 
145*11007Sshannon setfile(argc, argv) int argc; char *argv[]; {
146*11007Sshannon 	static char *nullstr = "-";
147*11007Sshannon 
148*11007Sshannon 	svargc = --argc;
149*11007Sshannon 	svargv = argv;
150*11007Sshannon 	while (svargc > 0 && svargv[1][0] == '-') {
151*11007Sshannon 		switch (svargv[1][1]) {
152*11007Sshannon 
153*11007Sshannon 		case 'd': lefteq=svargv[1][2]; righteq=svargv[1][3]; break;
154*11007Sshannon 		case 's': gsize = atoi(&svargv[1][2]); break;
155*11007Sshannon 		case 'p': deltaps = atoi(&svargv[1][2]); break;
156*11007Sshannon 		case 'f': gfont = svargv[1][2]; break;
157*11007Sshannon 		case 'e': noeqn++; break;
158*11007Sshannon 		default: dbg = 1;
159*11007Sshannon 		}
160*11007Sshannon 		svargc--;
161*11007Sshannon 		svargv++;
162*11007Sshannon 	}
163*11007Sshannon 	ifile = 1;
164*11007Sshannon 	linect = 1;
165*11007Sshannon 	if (svargc <= 0) {
166*11007Sshannon 		curfile = stdin;
167*11007Sshannon 		svargv[1] = nullstr;
168*11007Sshannon 	}
169*11007Sshannon 	else if ((curfile = fopen(svargv[1], "r")) == NULL)
170*11007Sshannon 		error( FATAL,"can't open file %s", svargv[1]);
171*11007Sshannon }
172*11007Sshannon 
173*11007Sshannon yyerror() {;}
174*11007Sshannon 
175*11007Sshannon init() {
176*11007Sshannon 	ct = 0;
177*11007Sshannon 	ps = gsize;
178*11007Sshannon 	ft = gfont;
179*11007Sshannon 	setps(ps);
180*11007Sshannon 	printf(".ft %c\n", ft);
181*11007Sshannon }
182*11007Sshannon 
183*11007Sshannon error(fatal, s1, s2) int fatal; char *s1, *s2; {
184*11007Sshannon 	if (fatal>0)
185*11007Sshannon 		printf("eqn fatal error: ");
186*11007Sshannon 	printf(s1,s2);
187*11007Sshannon 	printf("\nfile %s, between lines %d and %d\n",
188*11007Sshannon 		 svargv[ifile], eqline, linect);
189*11007Sshannon 	fprintf(stderr, "eqn: ");
190*11007Sshannon 	if (fatal>0)
191*11007Sshannon 		fprintf(stderr, "fatal error: ");
192*11007Sshannon 	fprintf(stderr, s1, s2);
193*11007Sshannon 	fprintf(stderr, "\nfile %s, between lines %d and %d\n",
194*11007Sshannon 		 svargv[ifile], eqline, linect);
195*11007Sshannon 	if (fatal > 0)
196*11007Sshannon 		eqnexit(1);
197*11007Sshannon }
198