📄 gsi.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);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -