1 # include "e.h"
2 # include "dev.h"
3 #define	MAXLINE	3600	/* maximum input line */
4 	/* huge for Chris's graphics language */
5 
6 #ifndef DEVDIR
7 #define DEVDIR	"/usr/lib/font"		/* place to find "dev" directory */
8 #endif
9 char	*devdir	= DEVDIR;
10 
11 char	in[MAXLINE];	/* input buffer */
12 int	eqnexit();
13 int noeqn;
14 
15 main(argc,argv) int argc; char *argv[];{
16 
17 	eqnexit(eqn(argc, argv));
18 }
19 
20 eqnexit(n) {
21 #ifdef gcos
22 	if (n)
23 		fprintf(stderr, "run terminated due to eqn error\n");
24 	exit(0);
25 #endif
26 	exit(n);
27 }
28 
29 eqn(argc,argv) int argc; char *argv[];{
30 	int i, type;
31 
32 	setfile(argc,argv);
33 	init_tbl();	/* install keywords in tables */
34 	while ((type=getline(in)) != EOF) {
35 		eqline = linect;
36 		if (in[0]=='.' && in[1]=='E' && in[2]=='Q') {
37 			for (i=11; i<100; used[i++]=0);
38 			printf("%s",in);
39 			printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n.af 98 01\n");
40 			markline = 0;
41 			init();
42 			yyparse();
43 			if (eqnreg>0) {
44 				printf(".nr %d \\w'\\*(%d'\n", eqnreg, eqnreg);
45 				/* printf(".if \\n(%d>\\n(.l .tm too-long eqn, file %s, between lines %d-%d\n",	*/
46 				/*	eqnreg, svargv[ifile], eqline, linect);	*/
47 				printf(".nr MK %d\n", markline);	/* for -ms macros */
48 				printf(".if %d>\\n(.v .ne %du\n", eqnht, eqnht);
49 				printf(".rn %d 10\n", eqnreg);
50 				if(!noeqn)printf("\\*(10\n");
51 			}
52 			printf(".ps \\n(99\n.ft \\n(98\n");
53 			printf(".EN");
54 			if (lastchar == EOF) {
55 				putchar('\n');
56 				break;
57 			}
58 			if (putchar(lastchar) != '\n')
59 				while (putchar(gtc()) != '\n');
60 		}
61 		else if (type == lefteq)
62 			inline();
63 		else
64 			printf("%s",in);
65 	}
66 	return(0);
67 }
68 
69 getline(s) register char *s; {
70 	register c;
71 	while((*s++=c=gtc())!='\n' && c!=EOF && c!=lefteq)
72 		if (s >= in+MAXLINE) {
73 			error( !FATAL, "input line too long: %.20s\n", in);
74 			in[MAXLINE] = '\0';
75 			break;
76 		}
77 	if (c==lefteq)
78 		s--;
79 	*s++ = '\0';
80 	return(c);
81 }
82 
83 inline() {
84 	int ds;
85 
86 	printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n.af 98 01\n");
87 	ds = oalloc();
88 	printf(".rm %d \n", ds);
89 	do{
90 		if (*in)
91 			printf(".as %d \"%s\n", ds, in);
92 		init();
93 		yyparse();
94 		if (eqnreg > 0) {
95 			printf(".as %d \\*(%d\n", ds, eqnreg);
96 			ofree(eqnreg);
97 		}
98 		printf(".ps \\n(99\n.ft \\n(98\n");
99 	} while (getline(in) == lefteq);
100 	if (*in)
101 		printf(".as %d \"%s", ds, in);
102 	printf(".ps \\n(99\n.ft \\n(98\n");
103 	printf("\\*(%d\n", ds);
104 	ofree(ds);
105 }
106 
107 putout(p1) int p1; {
108 	extern int gsize, gfont;
109 	int before, after;
110 	if(dbg)printf(".\tanswer <- S%d, h=%d,b=%d\n",p1, eht[p1], ebase[p1]);
111 	eqnht = eht[p1];
112 	printf(".ds %d \\x'0'", p1);
113 	/* suppposed to leave room for a subscript or superscript */
114 	before = eht[p1] - ebase[p1] - VERT( EM(1.2, ps) );
115 	if (spaceval != NULL)
116 		printf("\\x'0-%s'", spaceval);
117 	else if (before > 0)
118 		printf("\\x'0-%du'", before);
119 	printf("\\f%c\\s%d\\*(%d%s\\s\\n(99\\f(\\n(98",
120 		gfont, gsize, p1, rfont[p1] == ITAL ? "\\|" : "");
121 	after = ebase[p1] - VERT( EM(0.2, ps) );
122 	if (spaceval == NULL && after > 0)
123 		printf("\\x'%du'", after);
124 	putchar('\n');
125 	eqnreg = p1;
126 	if (spaceval != NULL) {
127 		free(spaceval);
128 		spaceval = NULL;
129 	}
130 }
131 
132 max(i,j) int i,j; {
133 	return (i>j ? i : j);
134 }
135 
136 oalloc() {
137 	int i;
138 	for (i=11; i<100; i++)
139 		if (used[i]++ == 0) return(i);
140 	error( FATAL, "no eqn strings left", i);
141 	return(0);
142 }
143 
144 ofree(n) int n; {
145 	used[n] = 0;
146 }
147 
148 setps(p) int p; {
149 	printf(".ps %d\n", EFFPS(p));
150 }
151 
152 nrwid(n1, p, n2) int n1, p, n2; {
153 	printf(".nr %d \\w'\\s%d\\*(%d'\n", n1, EFFPS(p), n2);
154 }
155 
156 char *getenv();
157 
158 setfile(argc, argv) int argc; char *argv[]; {
159 	static char *nullstr = "-";
160 	char *cp;
161 
162 	if ((cp = getenv("PRINTER"))) device = cp;
163 	if ((cp = getenv("TYPESETTER"))) device = cp;
164 	svargc = --argc;
165 	svargv = argv;
166 	while (svargc > 0 && svargv[1][0] == '-') {
167 		switch (svargv[1][1]) {
168 
169 		case 'd': lefteq=svargv[1][2]; righteq=svargv[1][3]; break;
170 		case 's': gsize = atoi(&svargv[1][2]); break;
171 		case 'p': deltaps = atoi(&svargv[1][2]); break;
172 		case 'r': res = atoi(&svargv[1][2]); break;
173 		case 'm': minsize = atoi(&svargv[1][2]); break;
174 		case 'f': gfont = svargv[1][2]; break;
175 		case 'e': noeqn++; break;
176 		case 'P':
177 		case 'T': device = &(svargv[1][2]); break;
178 		case 'F': devdir = &(svargv[1][2]); break;
179 		default: dbg = 1;
180 		}
181 		svargc--;
182 		svargv++;
183 	}
184 
185 	fileinit();
186 	ifile = 1;
187 	linect = 1;
188 	if (svargc <= 0) {
189 		curfile = stdin;
190 		svargv[1] = nullstr;
191 	}
192 	else if ((curfile = fopen(svargv[1], "r")) == NULL)
193 		error( FATAL,"can't open file %s", svargv[1]);
194 }
195 
196 fileinit()
197 {
198 	int fin;
199 	short readmin;
200 	struct dev device_info;
201 	char temp[100];
202 
203 	sprintf(temp, "%s/dev%s/DESC.out", devdir, device);
204 	if ((fin = open(temp, 0)) < 0) {
205 	    fprintf(stderr, "can't open tables for %s\n", temp);
206 	    exit(1);
207 	}
208 	read(fin, &device_info, sizeof(struct dev));
209 	read(fin, &readmin, sizeof readmin);
210 
211 		/* if res and minsize were not set by option, do it now */
212 	if (res <= 0) res = device_info.res;
213 	if (minsize <= 0) minsize = readmin;
214 	minvert = device_info.vert;
215 	close(fin);
216 }
217 
218 yyerror() {;}
219 
220 init() {
221 	ct = 0;
222 	ps = gsize;
223 	ft = gfont;
224 	setps(ps);
225 	printf(".ft %c\n", ft);
226 }
227 
228 error(fatal, s1, s2) int fatal; char *s1, *s2; {
229 	if (fatal>0)
230 		printf("eqn fatal error: ");
231 	printf(s1,s2);
232 	printf("\nfile %s, between lines %d and %d\n",
233 		 svargv[ifile], eqline, linect);
234 	fprintf(stderr, "eqn: ");
235 	if (fatal>0)
236 		fprintf(stderr, "fatal error: ");
237 	fprintf(stderr, s1, s2);
238 	fprintf(stderr, "\nfile %s, between lines %d and %d\n",
239 		 svargv[ifile], eqline, linect);
240 	if (fatal > 0)
241 		eqnexit(1);
242 }
243