1 # include "e.h" 2 # include "dev.h" 3 #define MAXLINE 3600 /* maximum input line */ 4 /* huge for Chris's graphics language */ 5 6 #ifndef DEVDIR 7 #define DEVDIR "/usr/lib/font" /* place to find "dev" directory */ 8 #endif 9 char *devdir = DEVDIR; 10 11 char in[MAXLINE]; /* input buffer */ 12 int eqnexit(); 13 int noeqn; 14 15 main(argc,argv) int argc; char *argv[];{ 16 17 eqnexit(eqn(argc, argv)); 18 } 19 20 eqnexit(n) { 21 #ifdef gcos 22 if (n) 23 fprintf(stderr, "run terminated due to eqn error\n"); 24 exit(0); 25 #endif 26 exit(n); 27 } 28 29 eqn(argc,argv) int argc; char *argv[];{ 30 int i, type; 31 32 setfile(argc,argv); 33 init_tbl(); /* install keywords in tables */ 34 while ((type=getline(in)) != EOF) { 35 eqline = linect; 36 if (in[0]=='.' && in[1]=='E' && in[2]=='Q') { 37 for (i=11; i<100; used[i++]=0); 38 printf("%s",in); 39 printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n.af 98 01\n"); 40 markline = 0; 41 init(); 42 yyparse(); 43 if (eqnreg>0) { 44 printf(".nr %d \\w'\\*(%d'\n", eqnreg, eqnreg); 45 /* printf(".if \\n(%d>\\n(.l .tm too-long eqn, file %s, between lines %d-%d\n", */ 46 /* eqnreg, svargv[ifile], eqline, linect); */ 47 printf(".nr MK %d\n", markline); /* for -ms macros */ 48 printf(".if %d>\\n(.v .ne %du\n", eqnht, eqnht); 49 printf(".rn %d 10\n", eqnreg); 50 if(!noeqn)printf("\\*(10\n"); 51 } 52 printf(".ps \\n(99\n.ft \\n(98\n"); 53 printf(".EN"); 54 if (lastchar == EOF) { 55 putchar('\n'); 56 break; 57 } 58 if (putchar(lastchar) != '\n') 59 while (putchar(gtc()) != '\n'); 60 } 61 else if (type == lefteq) 62 inline(); 63 else 64 printf("%s",in); 65 } 66 return(0); 67 } 68 69 getline(s) register char *s; { 70 register c; 71 while((*s++=c=gtc())!='\n' && c!=EOF && c!=lefteq) 72 if (s >= in+MAXLINE) { 73 error( !FATAL, "input line too long: %.20s\n", in); 74 in[MAXLINE] = '\0'; 75 break; 76 } 77 if (c==lefteq) 78 s--; 79 *s++ = '\0'; 80 return(c); 81 } 82 83 inline() { 84 int ds; 85 86 printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n.af 98 01\n"); 87 ds = oalloc(); 88 printf(".rm %d \n", ds); 89 do{ 90 if (*in) 91 printf(".as %d \"%s\n", ds, in); 92 init(); 93 yyparse(); 94 if (eqnreg > 0) { 95 printf(".as %d \\*(%d\n", ds, eqnreg); 96 ofree(eqnreg); 97 } 98 printf(".ps \\n(99\n.ft \\n(98\n"); 99 } while (getline(in) == lefteq); 100 if (*in) 101 printf(".as %d \"%s", ds, in); 102 printf(".ps \\n(99\n.ft \\n(98\n"); 103 printf("\\*(%d\n", ds); 104 ofree(ds); 105 } 106 107 putout(p1) int p1; { 108 extern int gsize, gfont; 109 int before, after; 110 if(dbg)printf(".\tanswer <- S%d, h=%d,b=%d\n",p1, eht[p1], ebase[p1]); 111 eqnht = eht[p1]; 112 printf(".ds %d \\x'0'", p1); 113 /* suppposed to leave room for a subscript or superscript */ 114 before = eht[p1] - ebase[p1] - VERT( EM(1.2, ps) ); 115 if (spaceval != NULL) 116 printf("\\x'0-%s'", spaceval); 117 else if (before > 0) 118 printf("\\x'0-%du'", before); 119 printf("\\f%c\\s%d\\*(%d%s\\s\\n(99\\f(\\n(98", 120 gfont, gsize, p1, rfont[p1] == ITAL ? "\\|" : ""); 121 after = ebase[p1] - VERT( EM(0.2, ps) ); 122 if (spaceval == NULL && after > 0) 123 printf("\\x'%du'", after); 124 putchar('\n'); 125 eqnreg = p1; 126 if (spaceval != NULL) { 127 free(spaceval); 128 spaceval = NULL; 129 } 130 } 131 132 max(i,j) int i,j; { 133 return (i>j ? i : j); 134 } 135 136 oalloc() { 137 int i; 138 for (i=11; i<100; i++) 139 if (used[i]++ == 0) return(i); 140 error( FATAL, "no eqn strings left", i); 141 return(0); 142 } 143 144 ofree(n) int n; { 145 used[n] = 0; 146 } 147 148 setps(p) int p; { 149 printf(".ps %d\n", EFFPS(p)); 150 } 151 152 nrwid(n1, p, n2) int n1, p, n2; { 153 printf(".nr %d \\w'\\s%d\\*(%d'\n", n1, EFFPS(p), n2); 154 } 155 156 char *getenv(); 157 158 setfile(argc, argv) int argc; char *argv[]; { 159 static char *nullstr = "-"; 160 char *cp; 161 162 if ((cp = getenv("PRINTER"))) device = cp; 163 if ((cp = getenv("TYPESETTER"))) device = cp; 164 svargc = --argc; 165 svargv = argv; 166 while (svargc > 0 && svargv[1][0] == '-') { 167 switch (svargv[1][1]) { 168 169 case 'd': lefteq=svargv[1][2]; righteq=svargv[1][3]; break; 170 case 's': gsize = atoi(&svargv[1][2]); break; 171 case 'p': deltaps = atoi(&svargv[1][2]); break; 172 case 'r': res = atoi(&svargv[1][2]); break; 173 case 'm': minsize = atoi(&svargv[1][2]); break; 174 case 'f': gfont = svargv[1][2]; break; 175 case 'e': noeqn++; break; 176 case 'P': 177 case 'T': device = &(svargv[1][2]); break; 178 case 'F': devdir = &(svargv[1][2]); break; 179 default: dbg = 1; 180 } 181 svargc--; 182 svargv++; 183 } 184 185 fileinit(); 186 ifile = 1; 187 linect = 1; 188 if (svargc <= 0) { 189 curfile = stdin; 190 svargv[1] = nullstr; 191 } 192 else if ((curfile = fopen(svargv[1], "r")) == NULL) 193 error( FATAL,"can't open file %s", svargv[1]); 194 } 195 196 fileinit() 197 { 198 int fin; 199 short readmin; 200 struct dev device_info; 201 char temp[100]; 202 203 sprintf(temp, "%s/dev%s/DESC.out", devdir, device); 204 if ((fin = open(temp, 0)) < 0) { 205 fprintf(stderr, "can't open tables for %s\n", temp); 206 exit(1); 207 } 208 read(fin, &device_info, sizeof(struct dev)); 209 read(fin, &readmin, sizeof readmin); 210 211 /* if res and minsize were not set by option, do it now */ 212 if (res <= 0) res = device_info.res; 213 if (minsize <= 0) minsize = readmin; 214 minvert = device_info.vert; 215 close(fin); 216 } 217 218 yyerror() {;} 219 220 init() { 221 ct = 0; 222 ps = gsize; 223 ft = gfont; 224 setps(ps); 225 printf(".ft %c\n", ft); 226 } 227 228 error(fatal, s1, s2) int fatal; char *s1, *s2; { 229 if (fatal>0) 230 printf("eqn fatal error: "); 231 printf(s1,s2); 232 printf("\nfile %s, between lines %d and %d\n", 233 svargv[ifile], eqline, linect); 234 fprintf(stderr, "eqn: "); 235 if (fatal>0) 236 fprintf(stderr, "fatal error: "); 237 fprintf(stderr, s1, s2); 238 fprintf(stderr, "\nfile %s, between lines %d and %d\n", 239 svargv[ifile], eqline, linect); 240 if (fatal > 0) 241 eqnexit(1); 242 } 243