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 25 main(argc,argv) int argc; char *argv[];{ 26 27 eqnexit(eqn(argc, argv)); 28 } 29 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 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 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 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 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 144 max(i,j) int i,j; { 145 return (i>j ? i : j); 146 } 147 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 156 ofree(n) int n; { 157 used[n] = 0; 158 } 159 160 setps(p) int p; { 161 printf(".ps %d\n", EFFPS(p)); 162 } 163 164 nrwid(n1, p, n2) int n1, p, n2; { 165 printf(".nr %d \\w'\\s%d\\*(%d'\n", n1, EFFPS(p), n2); 166 } 167 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 198 yyerror() {;} 199 200 init() { 201 ct = 0; 202 ps = gsize; 203 ft = gfont; 204 setps(ps); 205 printf(".ft %c\n", ft); 206 } 207 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