home *** CD-ROM | disk | FTP | other *** search
- # include "e.h"
- #define MAXLINE 1200 /* maximum input line */
-
- char in[MAXLINE]; /* input buffer */
- int eqnexit();
- int noeqn;
-
- main(argc,argv) int argc; char *argv[];{
-
- eqnexit(eqn(argc, argv));
- }
-
- eqnexit(n) {
- #ifdef gcos
- if (n)
- fprintf(stderr, "run terminated due to eqn error\n");
- exit(0);
- #endif
- exit(n);
- }
-
- eqn(argc,argv) int argc; char *argv[];{
- int i, type;
-
- setfile(argc,argv);
- init_tbl(); /* install keywords in tables */
- while ((type=getline(in)) != EOF) {
- eqline = linect;
- if (in[0]=='.' && in[1]=='E' && in[2]=='Q') {
- for (i=11; i<100; used[i++]=0);
- printf("%s",in);
- printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n");
- markline = 0;
- init();
- yyparse();
- if (eqnreg>0) {
- printf(".nr %d \\w'\\*(%d'\n", eqnreg, eqnreg);
- /* printf(".if \\n(%d>\\n(.l .tm too-long eqn, file %s, between lines %d-%d\n", */
- /* eqnreg, svargv[ifile], eqline, linect); */
- printf(".nr MK %d\n", markline); /* for -ms macros */
- printf(".if %d>\\n(.v .ne %du\n", eqnht, eqnht);
- printf(".rn %d 10\n", eqnreg);
- if(!noeqn)printf("\\*(10\n");
- }
- printf(".ps \\n(99\n.ft \\n(98\n");
- printf(".EN");
- if (lastchar == EOF) {
- putchar('\n');
- break;
- }
- if (putchar(lastchar) != '\n')
- while (putchar(gtc()) != '\n');
- }
- else if (type == lefteq)
- inline();
- else
- printf("%s",in);
- }
- return(0);
- }
-
- getline(s) register char *s; {
- register c;
- while((*s++=c=gtc())!='\n' && c!=EOF && c!=lefteq)
- if (s >= in+MAXLINE) {
- error( !FATAL, "input line too long: %.20s\n", in);
- in[MAXLINE] = '\0';
- break;
- }
- if (c==lefteq)
- s--;
- *s++ = '\0';
- return(c);
- }
-
- inline() {
- int ds;
-
- printf(".nr 99 \\n(.s\n.nr 98 \\n(.f\n");
- ds = oalloc();
- printf(".rm %d \n", ds);
- do{
- if (*in)
- printf(".as %d \"%s\n", ds, in);
- init();
- yyparse();
- if (eqnreg > 0) {
- printf(".as %d \\*(%d\n", ds, eqnreg);
- ofree(eqnreg);
- }
- printf(".ps \\n(99\n.ft \\n(98\n");
- } while (getline(in) == lefteq);
- if (*in)
- printf(".as %d \"%s", ds, in);
- printf(".ps \\n(99\n.ft \\n(98\n");
- printf("\\*(%d\n", ds);
- ofree(ds);
- }
-
- putout(p1) int p1; {
- extern int gsize, gfont;
- int before, after;
- if(dbg)printf(".\tanswer <- S%d, h=%d,b=%d\n",p1, eht[p1], ebase[p1]);
- eqnht = eht[p1];
- printf(".ds %d \\x'0'", p1);
- /* suppposed to leave room for a subscript or superscript */
- before = eht[p1] - ebase[p1] - VERT(3); /* 3 = 1.5 lines */
- if (before > 0)
- printf("\\x'0-%du'", before);
- printf("\\f%c\\s%d\\*(%d%s\\s\\n(99\\f\\n(98",
- gfont, gsize, p1, rfont[p1] == ITAL ? "\\|" : "");
- after = ebase[p1] - VERT(1);
- if (after > 0)
- printf("\\x'%du'", after);
- putchar('\n');
- eqnreg = p1;
- }
-
- max(i,j) int i,j; {
- return (i>j ? i : j);
- }
-
- oalloc() {
- int i;
- for (i=11; i<100; i++)
- if (used[i]++ == 0) return(i);
- error( FATAL, "no eqn strings left", i);
- return(0);
- }
-
- ofree(n) int n; {
- used[n] = 0;
- }
-
- setps(p) int p; {
- printf(".ps %d\n", EFFPS(p));
- }
-
- nrwid(n1, p, n2) int n1, p, n2; {
- printf(".nr %d \\w'\\s%d\\*(%d'\n", n1, EFFPS(p), n2);
- }
-
- setfile(argc, argv) int argc; char *argv[]; {
- static char *nullstr = "-";
-
- svargc = --argc;
- svargv = argv;
- while (svargc > 0 && svargv[1][0] == '-') {
- switch (svargv[1][1]) {
-
- case 'd': lefteq=svargv[1][2]; righteq=svargv[1][3]; break;
- case 's': gsize = atoi(&svargv[1][2]); break;
- case 'p': deltaps = atoi(&svargv[1][2]); break;
- case 'f': gfont = svargv[1][2]; break;
- case 'e': noeqn++; break;
- default: dbg = 1;
- }
- svargc--;
- svargv++;
- }
- ifile = 1;
- linect = 1;
- if (svargc <= 0) {
- curfile = stdin;
- svargv[1] = nullstr;
- }
- else if ((curfile = fopen(svargv[1], "r")) == NULL)
- error( FATAL,"can't open file %s", svargv[1]);
- }
-
- yyerror() {;}
-
- init() {
- ct = 0;
- ps = gsize;
- ft = gfont;
- setps(ps);
- printf(".ft %c\n", ft);
- }
-
- error(fatal, s1, s2) int fatal; char *s1, *s2; {
- if (fatal>0)
- printf("eqn fatal error: ");
- printf(s1,s2);
- printf("\nfile %s, between lines %d and %d\n",
- svargv[ifile], eqline, linect);
- fprintf(stderr, "eqn: ");
- if (fatal>0)
- fprintf(stderr, "fatal error: ");
- fprintf(stderr, s1, s2);
- fprintf(stderr, "\nfile %s, between lines %d and %d\n",
- svargv[ifile], eqline, linect);
- if (fatal > 0)
- eqnexit(1);
- }
-