1 #ifndef lint 2 static char *sccsid = "io.c (CWI) 1.2 85/03/12"; 3 #endif 4 # include "e.h" 5 #define MAXLINE 3600 /* maximum input line */ 6 /* huge for Chris's graphics language */ 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 before = eht[p1] - ebase[p1] - VERT( EM(1.2, ps) ); 112 if (spaceval != NULL) 113 printf("\\x'0-%s'", spaceval); 114 else if (before > 0) 115 printf("\\x'0-%du'", before); 116 printf("\\f%c\\s%d\\*(%d%s\\s\\n(99\\f\\n(98", 117 gfont, gsize, p1, rfont[p1] == ITAL ? "\\|" : ""); 118 after = ebase[p1] - VERT( EM(0.2, ps) ); 119 if (spaceval == NULL && after > 0) 120 printf("\\x'%du'", after); 121 putchar('\n'); 122 eqnreg = p1; 123 if (spaceval != NULL) { 124 free(spaceval); 125 spaceval = NULL; 126 } 127 } 128 129 max(i,j) int i,j; { 130 return (i>j ? i : j); 131 } 132 133 oalloc() { 134 int i; 135 for (i=11; i<100; i++) 136 if (used[i]++ == 0) return(i); 137 error( FATAL, "no eqn strings left", i); 138 return(0); 139 } 140 141 ofree(n) int n; { 142 used[n] = 0; 143 } 144 145 setps(p) int p; { 146 printf(".ps %d\n", EFFPS(p)); 147 } 148 149 nrwid(n1, p, n2) int n1, p, n2; { 150 printf(".nr %d \\w'\\s%d\\*(%d'\n", n1, EFFPS(p), n2); 151 } 152 153 setfile(argc, argv) int argc; char *argv[]; { 154 static char *nullstr = "-"; 155 156 svargc = --argc; 157 svargv = argv; 158 while (svargc > 0 && svargv[1][0] == '-') { 159 switch (svargv[1][1]) { 160 161 case 'd': lefteq=svargv[1][2]; righteq=svargv[1][3]; break; 162 case 's': gsize = atoi(&svargv[1][2]); break; 163 case 'p': deltaps = atoi(&svargv[1][2]); break; 164 case 'r': res = atoi(&svargv[1][2]); break; 165 case 'm': minsize = atoi(&svargv[1][2]); break; 166 case 'f': gfont = svargv[1][2]; break; 167 case 'e': noeqn++; break; 168 case 'T': 169 if (strcmp(&svargv[1][2], "202") == 0) 170 {res = 972; minsize = 5; ttype = DEV202; } 171 else if (strcmp(&svargv[1][2], "aps") == 0) 172 {res = 723; minsize = 5; ttype = DEVAPS; } 173 else if (strcmp(&svargv[1][2], "cat") == 0) 174 {res = 432; minsize = 6; ttype = DEVCAT; } 175 else if (strcmp(&svargv[1][2], "har") == 0) 176 {res = 1445; minsize = 4; ttype = DEVHAR; } 177 else if (strcmp(&svargv[1][2], "ver") == 0) 178 {res = 200; minsize = 6; ttype = DEVVER; } 179 else 180 error(FATAL, "unknown typesetter %s", &argv[1][2]); 181 break; 182 default: dbg = 1; 183 } 184 svargc--; 185 svargv++; 186 } 187 ifile = 1; 188 linect = 1; 189 if (svargc <= 0) { 190 curfile = stdin; 191 svargv[1] = nullstr; 192 } 193 else if ((curfile = fopen(svargv[1], "r")) == NULL) 194 error( FATAL,"can't open file %s", svargv[1]); 195 } 196 197 yyerror() {;} 198 199 init() { 200 ct = 0; 201 ps = gsize; 202 ft = gfont; 203 setps(ps); 204 printf(".ft %c\n", ft); 205 } 206 207 error(fatal, s1, s2) int fatal; char *s1, *s2; { 208 if (fatal>0) 209 printf("eqn fatal error: "); 210 printf(s1,s2); 211 printf("\nfile %s, between lines %d and %d\n", 212 svargv[ifile], eqline, linect); 213 fprintf(stderr, "eqn: "); 214 if (fatal>0) 215 fprintf(stderr, "fatal error: "); 216 fprintf(stderr, s1, s2); 217 fprintf(stderr, "\nfile %s, between lines %d and %d\n", 218 svargv[ifile], eqline, linect); 219 if (fatal > 0) 220 eqnexit(1); 221 } 222