Blame


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