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