Blame


1 5cedca1b 2004-05-15 devnull #include "e.h"
2 5cedca1b 2004-05-15 devnull
3 b237df90 2004-05-16 devnull #undef inline
4 e98091cf 2004-05-17 devnull #define inline _einline
5 b237df90 2004-05-16 devnull
6 5cedca1b 2004-05-15 devnull #define MAXLINE 3600 /* maximum input line */
7 5cedca1b 2004-05-15 devnull
8 5cedca1b 2004-05-15 devnull char *version = "version Oct 24, 1991";
9 5cedca1b 2004-05-15 devnull
10 5cedca1b 2004-05-15 devnull char in[MAXLINE]; /* input buffer */
11 5cedca1b 2004-05-15 devnull int noeqn;
12 5cedca1b 2004-05-15 devnull char *cmdname;
13 5cedca1b 2004-05-15 devnull
14 5cedca1b 2004-05-15 devnull int yyparse(void);
15 5cedca1b 2004-05-15 devnull void settype(char *);
16 5cedca1b 2004-05-15 devnull int getdata(void);
17 5cedca1b 2004-05-15 devnull int getline(char *);
18 5cedca1b 2004-05-15 devnull void inline(void);
19 5cedca1b 2004-05-15 devnull void init(void);
20 5cedca1b 2004-05-15 devnull void init_tbl(void);
21 5cedca1b 2004-05-15 devnull
22 b237df90 2004-05-16 devnull int
23 5cedca1b 2004-05-15 devnull main(int argc, char *argv[])
24 5cedca1b 2004-05-15 devnull {
25 5cedca1b 2004-05-15 devnull char *p, buf[20];
26 5cedca1b 2004-05-15 devnull
27 5cedca1b 2004-05-15 devnull cmdname = argv[0];
28 b237df90 2004-05-16 devnull if ((p = getenv("TYPESETTER")))
29 5cedca1b 2004-05-15 devnull typesetter = p;
30 5cedca1b 2004-05-15 devnull while (argc > 1 && argv[1][0] == '-') {
31 5cedca1b 2004-05-15 devnull switch (argv[1][1]) {
32 5cedca1b 2004-05-15 devnull
33 5cedca1b 2004-05-15 devnull case 'd':
34 5cedca1b 2004-05-15 devnull if (argv[1][2] == '\0') {
35 5cedca1b 2004-05-15 devnull dbg++;
36 5cedca1b 2004-05-15 devnull printf("...\teqn %s\n", version);
37 5cedca1b 2004-05-15 devnull } else {
38 5cedca1b 2004-05-15 devnull lefteq = argv[1][2];
39 5cedca1b 2004-05-15 devnull righteq = argv[1][3];
40 5cedca1b 2004-05-15 devnull }
41 5cedca1b 2004-05-15 devnull break;
42 5cedca1b 2004-05-15 devnull case 's': szstack[0] = gsize = atoi(&argv[1][2]); break;
43 5cedca1b 2004-05-15 devnull case 'p': deltaps = atoi(&argv[1][2]); dps_set = 1; break;
44 5cedca1b 2004-05-15 devnull case 'm': minsize = atoi(&argv[1][2]); break;
45 5cedca1b 2004-05-15 devnull case 'f': strcpy(ftstack[0].name,&argv[1][2]); break;
46 5cedca1b 2004-05-15 devnull case 'e': noeqn++; break;
47 5cedca1b 2004-05-15 devnull case 'T': typesetter = &argv[1][2]; break;
48 5cedca1b 2004-05-15 devnull default:
49 5cedca1b 2004-05-15 devnull fprintf(stderr, "%s: unknown option %s\n", cmdname, argv[1]);
50 5cedca1b 2004-05-15 devnull break;
51 5cedca1b 2004-05-15 devnull }
52 5cedca1b 2004-05-15 devnull argc--;
53 5cedca1b 2004-05-15 devnull argv++;
54 5cedca1b 2004-05-15 devnull }
55 5cedca1b 2004-05-15 devnull settype(typesetter);
56 5cedca1b 2004-05-15 devnull sprintf(buf, "\"%s\"", typesetter);
57 5cedca1b 2004-05-15 devnull install(deftbl, strsave(typesetter), strsave(buf), 0);
58 5cedca1b 2004-05-15 devnull init_tbl(); /* install other keywords in tables */
59 5cedca1b 2004-05-15 devnull curfile = infile;
60 5cedca1b 2004-05-15 devnull pushsrc(File, curfile->fname);
61 5cedca1b 2004-05-15 devnull if (argc <= 1) {
62 5cedca1b 2004-05-15 devnull curfile->fin = stdin;
63 5cedca1b 2004-05-15 devnull curfile->fname = strsave("-");
64 5cedca1b 2004-05-15 devnull getdata();
65 5cedca1b 2004-05-15 devnull } else
66 5cedca1b 2004-05-15 devnull while (argc-- > 1) {
67 5cedca1b 2004-05-15 devnull if (strcmp(*++argv, "-") == 0)
68 5cedca1b 2004-05-15 devnull curfile->fin = stdin;
69 5cedca1b 2004-05-15 devnull else if ((curfile->fin = fopen(*argv, "r")) == NULL)
70 5cedca1b 2004-05-15 devnull ERROR "can't open file %s", *argv FATAL;
71 5cedca1b 2004-05-15 devnull curfile->fname = strsave(*argv);
72 5cedca1b 2004-05-15 devnull getdata();
73 5cedca1b 2004-05-15 devnull if (curfile->fin != stdin)
74 5cedca1b 2004-05-15 devnull fclose(curfile->fin);
75 5cedca1b 2004-05-15 devnull }
76 b237df90 2004-05-16 devnull return 0;
77 5cedca1b 2004-05-15 devnull }
78 5cedca1b 2004-05-15 devnull
79 5cedca1b 2004-05-15 devnull void settype(char *s) /* initialize data for particular typesetter */
80 5cedca1b 2004-05-15 devnull /* the minsize could profitably come from the */
81 5cedca1b 2004-05-15 devnull { /* troff description file /usr/lib/font/dev.../DESC.out */
82 5cedca1b 2004-05-15 devnull if (strcmp(s, "202") == 0)
83 5cedca1b 2004-05-15 devnull { minsize = 5; ttype = DEV202; }
84 5cedca1b 2004-05-15 devnull else if (strcmp(s, "aps") == 0)
85 5cedca1b 2004-05-15 devnull { minsize = 5; ttype = DEVAPS; }
86 5cedca1b 2004-05-15 devnull else if (strcmp(s, "cat") == 0)
87 5cedca1b 2004-05-15 devnull { minsize = 6; ttype = DEVCAT; }
88 5cedca1b 2004-05-15 devnull else if (strcmp(s, "post") == 0)
89 5cedca1b 2004-05-15 devnull { minsize = 4; ttype = DEVPOST; }
90 5cedca1b 2004-05-15 devnull else
91 5cedca1b 2004-05-15 devnull { minsize = 5; ttype = DEV202; }
92 5cedca1b 2004-05-15 devnull }
93 5cedca1b 2004-05-15 devnull
94 b237df90 2004-05-16 devnull int
95 5cedca1b 2004-05-15 devnull getdata(void)
96 5cedca1b 2004-05-15 devnull {
97 5cedca1b 2004-05-15 devnull int i, type, ln;
98 5cedca1b 2004-05-15 devnull char fname[100];
99 5cedca1b 2004-05-15 devnull
100 5cedca1b 2004-05-15 devnull errno = 0;
101 5cedca1b 2004-05-15 devnull curfile->lineno = 0;
102 5cedca1b 2004-05-15 devnull printf(".lf 1 %s\n", curfile->fname);
103 5cedca1b 2004-05-15 devnull while ((type = getline(in)) != EOF) {
104 5cedca1b 2004-05-15 devnull if (in[0] == '.' && in[1] == 'E' && in[2] == 'Q') {
105 5cedca1b 2004-05-15 devnull for (i = 11; i < 100; i++)
106 5cedca1b 2004-05-15 devnull used[i] = 0;
107 5cedca1b 2004-05-15 devnull printf("%s", in);
108 5cedca1b 2004-05-15 devnull if (markline) { /* turn off from last time */
109 5cedca1b 2004-05-15 devnull printf(".nr MK 0\n");
110 5cedca1b 2004-05-15 devnull markline = 0;
111 5cedca1b 2004-05-15 devnull }
112 5cedca1b 2004-05-15 devnull display = 1;
113 5cedca1b 2004-05-15 devnull init();
114 5cedca1b 2004-05-15 devnull yyparse();
115 5cedca1b 2004-05-15 devnull if (eqnreg > 0) {
116 5cedca1b 2004-05-15 devnull if (markline)
117 5cedca1b 2004-05-15 devnull printf(".nr MK %d\n", markline); /* for -ms macros */
118 5cedca1b 2004-05-15 devnull printf(".if %gm>\\n(.v .ne %gm\n", eqnht, eqnht);
119 5cedca1b 2004-05-15 devnull printf(".rn %d 10\n", eqnreg);
120 5cedca1b 2004-05-15 devnull if (!noeqn)
121 5cedca1b 2004-05-15 devnull printf("\\&\\*(10\n");
122 5cedca1b 2004-05-15 devnull }
123 5cedca1b 2004-05-15 devnull printf(".EN");
124 5cedca1b 2004-05-15 devnull while (putchar(input()) != '\n')
125 5cedca1b 2004-05-15 devnull ;
126 5cedca1b 2004-05-15 devnull printf(".lf %d\n", curfile->lineno+1);
127 5cedca1b 2004-05-15 devnull }
128 5cedca1b 2004-05-15 devnull else if (type == lefteq)
129 5cedca1b 2004-05-15 devnull inline();
130 5cedca1b 2004-05-15 devnull else if (in[0] == '.' && in[1] == 'l' && in[2] == 'f') {
131 5cedca1b 2004-05-15 devnull if (sscanf(in+3, "%d %s", &ln, fname) == 2) {
132 5cedca1b 2004-05-15 devnull free(curfile->fname);
133 5cedca1b 2004-05-15 devnull printf(".lf %d %s\n", curfile->lineno = ln, curfile->fname = strsave(fname));
134 5cedca1b 2004-05-15 devnull } else
135 5cedca1b 2004-05-15 devnull printf(".lf %d\n", curfile->lineno = ln);
136 5cedca1b 2004-05-15 devnull } else
137 5cedca1b 2004-05-15 devnull printf("%s", in);
138 5cedca1b 2004-05-15 devnull }
139 5cedca1b 2004-05-15 devnull return(0);
140 5cedca1b 2004-05-15 devnull }
141 5cedca1b 2004-05-15 devnull
142 b237df90 2004-05-16 devnull int
143 5cedca1b 2004-05-15 devnull getline(char *s)
144 5cedca1b 2004-05-15 devnull {
145 b237df90 2004-05-16 devnull register int c;
146 5cedca1b 2004-05-15 devnull
147 5cedca1b 2004-05-15 devnull while ((c=input()) != '\n' && c != EOF && c != lefteq) {
148 5cedca1b 2004-05-15 devnull if (s >= in+MAXLINE) {
149 5cedca1b 2004-05-15 devnull ERROR "input line too long: %.20s\n", in WARNING;
150 5cedca1b 2004-05-15 devnull in[MAXLINE] = '\0';
151 5cedca1b 2004-05-15 devnull break;
152 5cedca1b 2004-05-15 devnull }
153 5cedca1b 2004-05-15 devnull *s++ = c;
154 5cedca1b 2004-05-15 devnull }
155 5cedca1b 2004-05-15 devnull if (c != lefteq)
156 5cedca1b 2004-05-15 devnull *s++ = c;
157 5cedca1b 2004-05-15 devnull *s = '\0';
158 5cedca1b 2004-05-15 devnull return(c);
159 5cedca1b 2004-05-15 devnull }
160 5cedca1b 2004-05-15 devnull
161 5cedca1b 2004-05-15 devnull void inline(void)
162 5cedca1b 2004-05-15 devnull {
163 5cedca1b 2004-05-15 devnull int ds, n, sz1 = 0;
164 5cedca1b 2004-05-15 devnull
165 5cedca1b 2004-05-15 devnull n = curfile->lineno;
166 5cedca1b 2004-05-15 devnull if (szstack[0] != 0)
167 5cedca1b 2004-05-15 devnull printf(".nr %d \\n(.s\n", sz1 = salloc());
168 5cedca1b 2004-05-15 devnull ds = salloc();
169 5cedca1b 2004-05-15 devnull printf(".rm %d \n", ds);
170 5cedca1b 2004-05-15 devnull display = 0;
171 5cedca1b 2004-05-15 devnull do {
172 5cedca1b 2004-05-15 devnull if (*in)
173 5cedca1b 2004-05-15 devnull printf(".as %d \"%s\n", ds, in);
174 5cedca1b 2004-05-15 devnull init();
175 5cedca1b 2004-05-15 devnull yyparse();
176 5cedca1b 2004-05-15 devnull if (eqnreg > 0) {
177 5cedca1b 2004-05-15 devnull printf(".as %d \\*(%d\n", ds, eqnreg);
178 5cedca1b 2004-05-15 devnull sfree(eqnreg);
179 5cedca1b 2004-05-15 devnull printf(".lf %d\n", curfile->lineno+1);
180 5cedca1b 2004-05-15 devnull }
181 5cedca1b 2004-05-15 devnull } while (getline(in) == lefteq);
182 5cedca1b 2004-05-15 devnull if (*in)
183 5cedca1b 2004-05-15 devnull printf(".as %d \"%s", ds, in);
184 5cedca1b 2004-05-15 devnull if (sz1)
185 5cedca1b 2004-05-15 devnull printf("\\s\\n(%d", sz1);
186 5cedca1b 2004-05-15 devnull printf("\\*(%d\n", ds);
187 5cedca1b 2004-05-15 devnull printf(".lf %d\n", curfile->lineno+1);
188 5cedca1b 2004-05-15 devnull if (curfile->lineno > n+3)
189 5cedca1b 2004-05-15 devnull fprintf(stderr, "eqn warning: multi-line %c...%c, file %s:%d,%d\n",
190 5cedca1b 2004-05-15 devnull lefteq, righteq, curfile->fname, n, curfile->lineno);
191 5cedca1b 2004-05-15 devnull sfree(ds);
192 5cedca1b 2004-05-15 devnull if (sz1) sfree(sz1);
193 5cedca1b 2004-05-15 devnull }
194 5cedca1b 2004-05-15 devnull
195 5cedca1b 2004-05-15 devnull void putout(int p1)
196 5cedca1b 2004-05-15 devnull {
197 5cedca1b 2004-05-15 devnull double before, after;
198 5cedca1b 2004-05-15 devnull extern double BeforeSub, AfterSub;
199 5cedca1b 2004-05-15 devnull
200 5cedca1b 2004-05-15 devnull dprintf(".\tanswer <- S%d, h=%g,b=%g\n",p1, eht[p1], ebase[p1]);
201 5cedca1b 2004-05-15 devnull eqnht = eht[p1];
202 5cedca1b 2004-05-15 devnull before = eht[p1] - ebase[p1] - BeforeSub; /* leave room for sub or superscript */
203 5cedca1b 2004-05-15 devnull after = ebase[p1] - AfterSub;
204 5cedca1b 2004-05-15 devnull if (spaceval || before > 0.01 || after > 0.01) {
205 5cedca1b 2004-05-15 devnull printf(".ds %d ", p1); /* used to be \\x'0' here: why? */
206 5cedca1b 2004-05-15 devnull if (spaceval != NULL)
207 5cedca1b 2004-05-15 devnull printf("\\x'0-%s'", spaceval);
208 5cedca1b 2004-05-15 devnull else if (before > 0.01)
209 5cedca1b 2004-05-15 devnull printf("\\x'0-%gm'", before);
210 5cedca1b 2004-05-15 devnull printf("\\*(%d", p1);
211 5cedca1b 2004-05-15 devnull if (spaceval == NULL && after > 0.01)
212 5cedca1b 2004-05-15 devnull printf("\\x'%gm'", after);
213 5cedca1b 2004-05-15 devnull putchar('\n');
214 5cedca1b 2004-05-15 devnull }
215 5cedca1b 2004-05-15 devnull if (szstack[0] != 0)
216 5cedca1b 2004-05-15 devnull printf(".ds %d %s\\*(%d\\s\\n(99\n", p1, DPS(gsize,gsize), p1);
217 5cedca1b 2004-05-15 devnull eqnreg = p1;
218 5cedca1b 2004-05-15 devnull if (spaceval != NULL) {
219 5cedca1b 2004-05-15 devnull free(spaceval);
220 5cedca1b 2004-05-15 devnull spaceval = NULL;
221 5cedca1b 2004-05-15 devnull }
222 5cedca1b 2004-05-15 devnull }
223 5cedca1b 2004-05-15 devnull
224 5cedca1b 2004-05-15 devnull void init(void)
225 5cedca1b 2004-05-15 devnull {
226 5cedca1b 2004-05-15 devnull synerr = 0;
227 5cedca1b 2004-05-15 devnull ct = 0;
228 5cedca1b 2004-05-15 devnull ps = gsize;
229 5cedca1b 2004-05-15 devnull ftp = ftstack;
230 5cedca1b 2004-05-15 devnull ft = ftp->ft;
231 5cedca1b 2004-05-15 devnull nszstack = 0;
232 5cedca1b 2004-05-15 devnull if (szstack[0] != 0) /* absolute gsize in effect */
233 5cedca1b 2004-05-15 devnull printf(".nr 99 \\n(.s\n");
234 5cedca1b 2004-05-15 devnull }
235 5cedca1b 2004-05-15 devnull
236 b237df90 2004-05-16 devnull int
237 5cedca1b 2004-05-15 devnull salloc(void)
238 5cedca1b 2004-05-15 devnull {
239 5cedca1b 2004-05-15 devnull int i;
240 5cedca1b 2004-05-15 devnull
241 5cedca1b 2004-05-15 devnull for (i = 11; i < 100; i++)
242 5cedca1b 2004-05-15 devnull if (used[i] == 0) {
243 5cedca1b 2004-05-15 devnull used[i]++;
244 5cedca1b 2004-05-15 devnull return(i);
245 5cedca1b 2004-05-15 devnull }
246 5cedca1b 2004-05-15 devnull ERROR "no eqn strings left (%d)", i FATAL;
247 5cedca1b 2004-05-15 devnull return(0);
248 5cedca1b 2004-05-15 devnull }
249 5cedca1b 2004-05-15 devnull
250 5cedca1b 2004-05-15 devnull void sfree(int n)
251 5cedca1b 2004-05-15 devnull {
252 5cedca1b 2004-05-15 devnull used[n] = 0;
253 5cedca1b 2004-05-15 devnull }
254 5cedca1b 2004-05-15 devnull
255 5cedca1b 2004-05-15 devnull void nrwid(int n1, int p, int n2)
256 5cedca1b 2004-05-15 devnull {
257 5cedca1b 2004-05-15 devnull printf(".nr %d 0\\w'%s\\*(%d'\n", n1, DPS(gsize,p), n2); /* 0 defends against - width */
258 5cedca1b 2004-05-15 devnull }
259 5cedca1b 2004-05-15 devnull
260 5cedca1b 2004-05-15 devnull char *ABSPS(int dn) /* absolute size dn in printable form \sd or \s(dd (dd >= 40) */
261 5cedca1b 2004-05-15 devnull {
262 5cedca1b 2004-05-15 devnull static char buf[100], *lb = buf;
263 5cedca1b 2004-05-15 devnull char *p;
264 5cedca1b 2004-05-15 devnull
265 5cedca1b 2004-05-15 devnull if (lb > buf + sizeof(buf) - 10)
266 5cedca1b 2004-05-15 devnull lb = buf;
267 5cedca1b 2004-05-15 devnull p = lb;
268 5cedca1b 2004-05-15 devnull *lb++ = '\\';
269 5cedca1b 2004-05-15 devnull *lb++ = 's';
270 5cedca1b 2004-05-15 devnull if (dn >= 10) { /* \s(dd only works in new troff */
271 5cedca1b 2004-05-15 devnull if (dn >= 40)
272 5cedca1b 2004-05-15 devnull *lb++ = '(';
273 5cedca1b 2004-05-15 devnull *lb++ = dn/10 + '0';
274 5cedca1b 2004-05-15 devnull *lb++ = dn%10 + '0';
275 5cedca1b 2004-05-15 devnull } else {
276 5cedca1b 2004-05-15 devnull *lb++ = dn + '0';
277 5cedca1b 2004-05-15 devnull }
278 5cedca1b 2004-05-15 devnull *lb++ = '\0';
279 5cedca1b 2004-05-15 devnull return p;
280 5cedca1b 2004-05-15 devnull }
281 5cedca1b 2004-05-15 devnull
282 5cedca1b 2004-05-15 devnull char *DPS(int f, int t) /* delta ps (t-f) in printable form \s+d or \s-d or \s+-(dd */
283 5cedca1b 2004-05-15 devnull {
284 5cedca1b 2004-05-15 devnull static char buf[100], *lb = buf;
285 5cedca1b 2004-05-15 devnull char *p;
286 5cedca1b 2004-05-15 devnull int dn;
287 5cedca1b 2004-05-15 devnull
288 5cedca1b 2004-05-15 devnull if (lb > buf + sizeof(buf) - 10)
289 5cedca1b 2004-05-15 devnull lb = buf;
290 5cedca1b 2004-05-15 devnull p = lb;
291 5cedca1b 2004-05-15 devnull *lb++ = '\\';
292 5cedca1b 2004-05-15 devnull *lb++ = 's';
293 5cedca1b 2004-05-15 devnull dn = EFFPS(t) - EFFPS(f);
294 5cedca1b 2004-05-15 devnull if (szstack[nszstack] != 0) /* absolute */
295 5cedca1b 2004-05-15 devnull dn = EFFPS(t); /* should do proper \s(dd */
296 5cedca1b 2004-05-15 devnull else if (dn >= 0)
297 5cedca1b 2004-05-15 devnull *lb++ = '+';
298 5cedca1b 2004-05-15 devnull else {
299 5cedca1b 2004-05-15 devnull *lb++ = '-';
300 5cedca1b 2004-05-15 devnull dn = -dn;
301 5cedca1b 2004-05-15 devnull }
302 5cedca1b 2004-05-15 devnull if (dn >= 10) { /* \s+(dd only works in new troff */
303 5cedca1b 2004-05-15 devnull *lb++ = '(';
304 5cedca1b 2004-05-15 devnull *lb++ = dn/10 + '0';
305 5cedca1b 2004-05-15 devnull *lb++ = dn%10 + '0';
306 5cedca1b 2004-05-15 devnull } else {
307 5cedca1b 2004-05-15 devnull *lb++ = dn + '0';
308 5cedca1b 2004-05-15 devnull }
309 5cedca1b 2004-05-15 devnull *lb++ = '\0';
310 5cedca1b 2004-05-15 devnull return p;
311 5cedca1b 2004-05-15 devnull }
312 5cedca1b 2004-05-15 devnull
313 b237df90 2004-05-16 devnull int
314 5cedca1b 2004-05-15 devnull EFFPS(int n) /* effective value of n */
315 5cedca1b 2004-05-15 devnull {
316 5cedca1b 2004-05-15 devnull if (n >= minsize)
317 5cedca1b 2004-05-15 devnull return n;
318 5cedca1b 2004-05-15 devnull else
319 5cedca1b 2004-05-15 devnull return minsize;
320 5cedca1b 2004-05-15 devnull }
321 5cedca1b 2004-05-15 devnull
322 5cedca1b 2004-05-15 devnull double EM(double m, int ps) /* convert m to ems in gsize */
323 5cedca1b 2004-05-15 devnull {
324 5cedca1b 2004-05-15 devnull m *= (double) EFFPS(ps) / gsize;
325 5cedca1b 2004-05-15 devnull if (m <= 0.001 && m >= -0.001)
326 5cedca1b 2004-05-15 devnull return 0;
327 5cedca1b 2004-05-15 devnull else
328 5cedca1b 2004-05-15 devnull return m;
329 5cedca1b 2004-05-15 devnull }
330 5cedca1b 2004-05-15 devnull
331 5cedca1b 2004-05-15 devnull double REL(double m, int ps) /* convert m to ems in ps */
332 5cedca1b 2004-05-15 devnull {
333 5cedca1b 2004-05-15 devnull m *= (double) gsize / EFFPS(ps);
334 5cedca1b 2004-05-15 devnull if (m <= 0.001 && m >= -0.001)
335 5cedca1b 2004-05-15 devnull return 0;
336 5cedca1b 2004-05-15 devnull else
337 5cedca1b 2004-05-15 devnull return m;
338 5cedca1b 2004-05-15 devnull }