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