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
main(argc,argv)15 main(argc,argv) int argc; char *argv[];{
16
17 eqnexit(eqn(argc, argv));
18 }
19
eqnexit(n)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
eqn(argc,argv)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
getline(s)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
putout(p1)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
max(i,j)132 max(i,j) int i,j; {
133 return (i>j ? i : j);
134 }
135
oalloc()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
ofree(n)144 ofree(n) int n; {
145 used[n] = 0;
146 }
147
setps(p)148 setps(p) int p; {
149 printf(".ps %d\n", EFFPS(p));
150 }
151
nrwid(n1,p,n2)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
setfile(argc,argv)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
fileinit()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
yyerror()218 yyerror() {;}
219
init()220 init() {
221 ct = 0;
222 ps = gsize;
223 ft = gfont;
224 setps(ps);
225 printf(".ft %c\n", ft);
226 }
227
error(fatal,s1,s2)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