# include "ne.h" # define SIGPIPE 13 /* nroff has stopped reading */ int ESC 033; int HREV '8'; int HFWD '9'; int SI 017; int SO 016; int ESCOUT 033; int HFWDOUT '9'; int HREVOUT '8'; int BKSPOUT '\b'; int FWDOUT '~'; char in[400]; /* input buffer */ int exit(); main(argc,argv) int argc; char *argv[];{ int i, type; flush(); first = 0; lefteq = righteq = '\0'; signal(SIGPIPE, &exit); setfile(argc,argv); while( (type=getline(in)) != '\0' ){ eqline = linect; if( in[0]=='.' && in[1]=='E' && in[2]=='Q' ){ for( i=11; i<100; used[i++]=0 ); printf(".tr ~\n"); printf("%s",in); init(); yyparse(); if( eqnreg>0 ) printf(".ne %d\n.rs\n'sp %d\n\\*(%d\n'sp %d\n", (eqnht+1)/2, (eqnht-eqnbase-2)/2,eqnreg,eqnbase/2); printf(".EN"); if( lastchar == '\0' ){ putchar('\n'); break; } if( putchar(lastchar) != '\n' ) while( putchar(getc()) != '\n' ); flush(); } else if( type != lefteq ) printf("%s",in); else inline(); } putchar('\0'); flush(); exit(); } getline(s) char *s; { char c; while((*s++=c=getc())!='\n' && c!='\0' && c!=lefteq ); if( c==lefteq ) s--; *s++ = '\0'; return(c); } inline() { int i,j,ds[20],t; i = -1; do{ if( i>=17 ){ while((j=getline(in))!='\n' && j!='\0'); error(!FATAL,"missing right delim (?) at %.20s",in); break; } ds[++i] = oalloc(); printf(".ds %d \"%s\n", ds[i], in); init(); yyparse(); if( eqnreg > 0 ) ds[++i] = eqnreg; } while( (t=getline(in)) == lefteq ); ds[++i] = oalloc(); printf(".ds %d \"%s", ds[i], in); for( j=0; j<=i; j++){ printf("\\*(%d", ds[j]); ofree(ds[j]); } putchar('\n'); flush(); } putout(p1) int p1; { if(dbg)printf(".\tanswer <- S%d\n",p1); eqnht = eht[p1]; eqnbase = ebase[p1]; eqnreg = p1; } abs(v) int v; { return( v>0 ? v : -v ); } 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 strings left", i); } ofree(n) int n; { used[n] = 0; } setfile(argc, argv) int argc; char *argv[]; { 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': break; case 'f': break; default: dbg = 1; ESCOUT = 'E'; HFWDOUT = 'F'; HREVOUT = 'R'; BKSPOUT = 'B'; FWDOUT = 'S'; } svargc--; svargv++; } if( svargc == 0 ) fin = dup(0); else if( (fin = open(svargv[1], 0)) < 0) error( FATAL,"can't open file %s", argv[1]); ptr = 0; fout = dup(1); ifile = 1; linect = 1; } yyerror(){;} int gsize 10; int gfont 'I'; init(){ ct = 0; first++; } error(fatal, s1, s2) int fatal; char *s1, *s2; { int sfout; printf("NEQN ERROR HERE"); flush(fout); sfout = fout; fout = 2; if( fatal>0 ) printf("fatal error: "); printf(s1,s2); printf(" file %s, between lines %d and %d\n", svargv[ifile], eqline, linect); flush(2); fout = sfout; if( fatal > 0 ) exit(1); } down(n) int n; { int c; if( n<= 0 ) c = HREVOUT; else c = HFWDOUT; n = abs(n); while( n-- > 0 ){ putchar(ESCOUT); putchar(c); } } up(n) int n; { int c; if( n<= 0 ) c = HFWDOUT; else c = HREVOUT; n = abs(n); while( n-- > 0 ){ putchar(ESCOUT); putchar(HREVOUT); } } fwd(n) int n; { int c,i; c = n<0 ? BKSPOUT : FWDOUT; n = abs(n); while( n-- > 0 ) putchar(c); } back(n) int n; { int c,i; c = n>0 ? BKSPOUT : FWDOUT; n = abs(n); while( n-- > 0 ) putchar(c); } line(n) int n; { while( n-- > 0 ) putchar('_'); }