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