#define PLOT 006 /* ack */ #define BEL 007 /* exit plot mode */ #define ESC 033 /* escape */ #define HFWD '9' #define HREV '8' #define FREV '7' #define SO 016 /* shift out - enter greek */ #define SI 017 /* shift in */ #define UP 013 #define DN 012 #define RT ' ' #define LF '\b' int restore(); int svmode, mode[3]; main(argc,argv) int argc; char **argv; { int c, textmode; extern int fin,fout; fin = dup(0); fout = dup(1); if ((signal(2, 1) & 01) == 0) signal(2, &restore); gtty(1, mode); svmode = mode[2]; mode[2] =& 0777757; /* turn off cr-lf */ mode[2] =| 03; /* turn off delays, tabs */ stty(1, mode); textmode = 1; while( (c=getchar()) != '\0' ){ if( c==SO ){ special(); continue; } if (c== PLOT) textmode = 1-textmode; if (c==BEL) textmode = 1; if( c=='\n' && textmode ) putchar(015); /* CR */ if( c!=ESC ){ putchar(c); continue; } putchar(PLOT); c = getchar(); if( c == HREV ) nplot(4,UP); else if( c == HFWD ) nplot(4,DN); else if( c == FREV ) nplot(8,UP); putchar(PLOT); } flush(); restore(); } restore(){ mode[2] = svmode; stty(1, mode); exit(); } int tab[]{ 'A', /* alpha */ 'B', /* beta */ 'D', /* delta */ 'W', /* DELTA */ 'S', /* epsilon */ 'N', /* eta */ '\\', /* gamma */ 'G', /* GAMMA */ 'o', /* infinity - not in M37 */ '^', /* integral */ 'L', /* lambda */ 'E', /* LAMBDA */ 'M', /* mu */ '[', /* nabla (del) */ '_', /* not */ '@', /* nu */ 'C', /* omega */ 'Z', /* OMEGA */ ']', /* partial */ 'U', /* phi */ 'F', /* PHI */ 'V', /* psi */ 'H', /* PSI */ 'J', /* pi */ 'P', /* PI */ 'K', /* rho */ 'Y', /* sigma */ 'R', /* SIGMA */ 'I', /* tau */ 'T', /* theta */ 'O', /* THETA */ 'X', /* xi */ 'Q', /* zeta */ 0 }; int trans[]{ alpha, beta, delta, DELTA, epsilon, eta, gamma, GAMMA, infinity, integral, lambda, LAMBDA, mu, nabla, not, nu, omega, OMEGA, partial, phi, PHI, psi, PSI, pi, PI, rho, sigma, SIGMA, tau, theta, THETA, xi, zeta, 0 }; int alpha[] {LF,'c',RT,RT,'(',LF,0}; int beta[] {'B',LF,LF,DN,DN,'|',RT,RT,UP,UP,0}; int delta[] {'o',UP,UP,'<',DN,DN,0}; int DELTA[] {LF,LF,'/',-3,DN,'-',-4,RT,'-',-3,UP,'\\',LF,LF,0}; int epsilon[] {'<','-',0}; int eta[] {'n',RT,RT,DN,DN,'|',LF,LF,UP,UP,0}; int gamma[] {')',RT,'/',LF,0}; int GAMMA[] {LF,LF,'|',RT,RT,-3,UP,'-',-3,DN,RT,RT,'`',LF,LF,0}; int infinity[] {LF,LF,'c',-4,RT,'o',LF,LF,0}; int integral[] {'|','\'',RT,RT,'`',-3,LF,-6,DN,'\'',LF,'`',RT,RT,-6,UP,0}; int lambda[] {'\\',-4,DN,LF,'\'',DN,LF,'\'',-5,UP,RT,RT,0}; int LAMBDA[] {LF,LF,'/',-4,RT,'\\',LF,LF,0}; int mu[] {'u',LF,LF,',',RT,RT,0}; int nabla[] {LF,LF,'\\',-3,UP,'-',-4,RT,'-',-3,DN,'/',LF,LF,0}; int not[] {'-',-2,RT,UP,',',DN,-2,LF,0}; int nu[] {LF,'(',-3,RT,'/',LF,LF,0}; int omega[] {LF,'u',-3,RT,'u',LF,LF,0}; int OMEGA[] {'O',DN,DN,LF,'-',RT,RT,'-',LF,UP,UP,0}; int partial[] {'o',RT,DN,'`',LF,UP,'`',LF,UP,'`',RT,DN,0}; int phi[] {'o','/',0}; int PHI[] {'o','[',']',0}; int psi[] {'/','-',DN,DN,RT,RT,'\'',-4,LF,'\'',RT,RT,UP,UP,0}; int PSI[] {'[',']','-',DN,DN,RT,RT,'\'',-4,LF,'`',RT,RT,UP,UP,0}; int pi[] {UP,'-',-3,DN,'"',DN,'"',-3,UP,0}; int PI[] {LF,LF,'[',']',-4,RT,'[',']',LF,LF,-3,UP,'-',-3,DN,0}; int rho[] {'o',LF,LF,DN,DN,'|',UP,UP,RT,RT,0}; int sigma[] {'o',DN,RT,RT,'~',UP,LF,LF,0}; int SIGMA[] {'>',-2,DN,'-',-5,UP,'-',-3,DN,0}; int tau[] {'t',DN,RT,RT,'~',LF,LF,LF,'~',RT,UP,0}; int theta[] {'O','-',0}; int THETA[] {'O','=',0}; int xi[] {'c',RT,DN,',',LF,-3,UP,'c',LF,DN,'`',RT,DN,0}; int zeta[] {'c',RT,DN,',',LF,-3,UP,'<',DN,DN,0}; special(){ int c,i,j,t; loop: if( (c=getchar()) == SI ) return; for( i=0; tab[i]!=0; i++) if( c==tab[i] ){ plot(trans[i]); goto loop; } putchar(c); goto loop; } plot(s) int *s; { int i,c; putchar(PLOT); for( i=0; (c=s[i])!=0; i++ ) if( c<0 ) nplot(-c,s[++i]); else putchar(c); putchar(PLOT); putchar(' '); } nplot(n,c) int n,c; { while(n--) putchar(c); }