Commit | Line | Data |
---|---|---|
16f3713b TL |
1 | # include "e.h" |
2 | #define MAXLINE 1200 /* maximum input line */ | |
3 | ||
4 | char in[MAXLINE]; /* input buffer */ | |
5 | int eqnexit(); | |
6 | int noeqn; | |
7 | ||
8 | main(argc,argv) int argc; char *argv[];{ | |
9 | ||
10 | eqnexit(eqn(argc, argv)); | |
11 | } | |
12 | ||
13 | eqnexit(n) { | |
14 | #ifdef gcos | |
15 | if (n) | |
16 | fprintf(stderr, "run terminated due to eqn error\n"); | |
17 | exit(0); | |
18 | #endif | |
19 | exit(n); | |
20 | } | |
21 | ||
22 | eqn(argc,argv) int argc; char *argv[];{ | |
23 | int i, type; | |
24 | ||
25 | setfile(argc,argv); | |
26 | init_tbl(); /* install keywords in tables */ | |
27 | while ((type=getline(in)) != EOF) { | |
28 | eqline = linect; | |
29 | if (in[0]=='.' && in[1]=='E' && in[2]=='Q') { | |
30 | for (i=11; i<100; used[i++]=0); | |
31 | printf("%s",in); | |
32 | printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n"); | |
33 | markline = 0; | |
34 | init(); | |
35 | yyparse(); | |
36 | if (eqnreg>0) { | |
37 | printf(".nr %d \\w'\\*(%d'\n", eqnreg, eqnreg); | |
38 | /* printf(".if \\n(%d>\\n(.l .tm too-long eqn, file %s, between lines %d-%d\n", */ | |
39 | /* eqnreg, svargv[ifile], eqline, linect); */ | |
40 | printf(".nr MK %d\n", markline); /* for -ms macros */ | |
41 | printf(".if %d>\\n(.v .ne %du\n", eqnht, eqnht); | |
42 | printf(".rn %d 10\n", eqnreg); | |
43 | if(!noeqn)printf("\\*(10\n"); | |
44 | } | |
45 | printf(".ps \\n(99\n.ft \\n(98\n"); | |
46 | printf(".EN"); | |
47 | if (lastchar == EOF) { | |
48 | putchar('\n'); | |
49 | break; | |
50 | } | |
51 | if (putchar(lastchar) != '\n') | |
52 | while (putchar(gtc()) != '\n'); | |
53 | } | |
54 | else if (type == lefteq) | |
55 | inline(); | |
56 | else | |
57 | printf("%s",in); | |
58 | } | |
59 | return(0); | |
60 | } | |
61 | ||
62 | getline(s) register char *s; { | |
63 | register c; | |
64 | while((*s++=c=gtc())!='\n' && c!=EOF && c!=lefteq) | |
65 | if (s >= in+MAXLINE) { | |
66 | error( !FATAL, "input line too long: %.20s\n", in); | |
67 | in[MAXLINE] = '\0'; | |
68 | break; | |
69 | } | |
70 | if (c==lefteq) | |
71 | s--; | |
72 | *s++ = '\0'; | |
73 | return(c); | |
74 | } | |
75 | ||
76 | inline() { | |
77 | int ds; | |
78 | ||
79 | printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n"); | |
80 | ds = oalloc(); | |
81 | printf(".rm %d \n", ds); | |
82 | do{ | |
83 | if (*in) | |
84 | printf(".as %d \"%s\n", ds, in); | |
85 | init(); | |
86 | yyparse(); | |
87 | if (eqnreg > 0) { | |
88 | printf(".as %d \\*(%d\n", ds, eqnreg); | |
89 | ofree(eqnreg); | |
90 | } | |
91 | printf(".ps \\n(99\n.ft \\n(98\n"); | |
92 | } while (getline(in) == lefteq); | |
93 | if (*in) | |
94 | printf(".as %d \"%s", ds, in); | |
95 | printf(".ps \\n(99\n.ft \\n(98\n"); | |
96 | printf("\\*(%d\n", ds); | |
97 | ofree(ds); | |
98 | } | |
99 | ||
100 | putout(p1) int p1; { | |
101 | extern int gsize, gfont; | |
102 | int before, after; | |
103 | if(dbg)printf(".\tanswer <- S%d, h=%d,b=%d\n",p1, eht[p1], ebase[p1]); | |
104 | eqnht = eht[p1]; | |
105 | printf(".ds %d \\x'0'", p1); | |
106 | /* suppposed to leave room for a subscript or superscript */ | |
107 | before = eht[p1] - ebase[p1] - VERT(3); /* 3 = 1.5 lines */ | |
108 | if (before > 0) | |
109 | printf("\\x'0-%du'", before); | |
110 | printf("\\f%c\\s%d\\*(%d%s\\s\\n(99\\f\\n(98", | |
111 | gfont, gsize, p1, rfont[p1] == ITAL ? "\\|" : ""); | |
112 | after = ebase[p1] - VERT(1); | |
113 | if (after > 0) | |
114 | printf("\\x'%du'", after); | |
115 | putchar('\n'); | |
116 | eqnreg = p1; | |
117 | } | |
118 | ||
119 | max(i,j) int i,j; { | |
120 | return (i>j ? i : j); | |
121 | } | |
122 | ||
123 | oalloc() { | |
124 | int i; | |
125 | for (i=11; i<100; i++) | |
126 | if (used[i]++ == 0) return(i); | |
127 | error( FATAL, "no eqn strings left", i); | |
128 | return(0); | |
129 | } | |
130 | ||
131 | ofree(n) int n; { | |
132 | used[n] = 0; | |
133 | } | |
134 | ||
135 | setps(p) int p; { | |
136 | printf(".ps %d\n", EFFPS(p)); | |
137 | } | |
138 | ||
139 | nrwid(n1, p, n2) int n1, p, n2; { | |
140 | printf(".nr %d \\w'\\s%d\\*(%d'\n", n1, EFFPS(p), n2); | |
141 | } | |
142 | ||
143 | setfile(argc, argv) int argc; char *argv[]; { | |
144 | static char *nullstr = "-"; | |
145 | ||
146 | svargc = --argc; | |
147 | svargv = argv; | |
148 | while (svargc > 0 && svargv[1][0] == '-') { | |
149 | switch (svargv[1][1]) { | |
150 | ||
151 | case 'd': lefteq=svargv[1][2]; righteq=svargv[1][3]; break; | |
152 | case 's': gsize = atoi(&svargv[1][2]); break; | |
153 | case 'p': deltaps = atoi(&svargv[1][2]); break; | |
154 | case 'f': gfont = svargv[1][2]; break; | |
155 | case 'e': noeqn++; break; | |
156 | default: dbg = 1; | |
157 | } | |
158 | svargc--; | |
159 | svargv++; | |
160 | } | |
161 | ifile = 1; | |
162 | linect = 1; | |
163 | if (svargc <= 0) { | |
164 | curfile = stdin; | |
165 | svargv[1] = nullstr; | |
166 | } | |
167 | else if ((curfile = fopen(svargv[1], "r")) == NULL) | |
168 | error( FATAL,"can't open file %s", svargv[1]); | |
169 | } | |
170 | ||
171 | yyerror() {;} | |
172 | ||
173 | init() { | |
174 | ct = 0; | |
175 | ps = gsize; | |
176 | ft = gfont; | |
177 | setps(ps); | |
178 | printf(".ft %c\n", ft); | |
179 | } | |
180 | ||
181 | error(fatal, s1, s2) int fatal; char *s1, *s2; { | |
182 | if (fatal>0) | |
183 | printf("eqn fatal error: "); | |
184 | printf(s1,s2); | |
185 | printf("\nfile %s, between lines %d and %d\n", | |
186 | svargv[ifile], eqline, linect); | |
187 | fprintf(stderr, "eqn: "); | |
188 | if (fatal>0) | |
189 | fprintf(stderr, "fatal error: "); | |
190 | fprintf(stderr, s1, s2); | |
191 | fprintf(stderr, "\nfile %s, between lines %d and %d\n", | |
192 | svargv[ifile], eqline, linect); | |
193 | if (fatal > 0) | |
194 | eqnexit(1); | |
195 | } |