MiniUnix/usr/source/s7/ne4.c
# 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('_');
}