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