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