200 lines
3.9 KiB
C
200 lines
3.9 KiB
C
#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);
|
|
}
|