/* modified for 300S enter plot with ACK leave plot with ESC ACK BEL supposedly compatible with 300 */ #include <stdio.h> #include <signal.h> #include <sgtty.h> #define ACK 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 /* vt */ #define DN 012 #define RT ' ' #define LF '\b' #define enterplot putchar(ACK) #define leaveplot putchar(ESC); putchar(ACK) int restore(); struct sgttyb ttymode; main(argc,argv) int argc; char **argv; { int c, textmode; gtty(1, &ttymode); if (signal(SIGINT, SIG_IGN) != SIG_IGN) signal(SIGINT, restore); ttymode.sg_flags &= ~(CRMOD|ALLDELAY); stty(1, &ttymode); textmode = 1; while( (c=getchar()) != EOF ){ if( c==SO ){ special(); continue; } if (c== ACK) textmode = 1-textmode; if (c==BEL) textmode = 1; if( c=='\n' && textmode ) putchar(015); /* CR */ if( c!=ESC ){ putchar(c); continue; } enterplot; c = getchar(); if( c == HREV ) nplot(4,UP); else if( c == HFWD ) nplot(4,DN); else if( c == FREV ) nplot(8,UP); leaveplot; } restore(); } restore(){ stty(1, &ttymode); exit(0); } 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 */ 'O', /* theta */ 'T', /* THETA */ 'X', /* xi */ 'Q', /* 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}; 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 }; special(){ int c,i; 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; enterplot; for( i=0; (c=s[i])!=0; i++ ) if( c<0 ) nplot(-c,s[++i]); else nplot(1, c); leaveplot; putchar(' '); } nplot(n,c) int n,c; { while(n--) { if( c == UP ) putchar(ESC); putchar(c); } }