Two things had to be done here to make the code look much more like the original (though it is hardly discernible at first glance). First thing was I redefined free() to be free() + the comma operator as it was a binary expression error in modern systems (this fix was provided by Yusuke Endoh). The second one was an improvement to one of my earlier several fixes and in particular the prevention of warnings that cannot be disabled at compilation/linking/runtime (the latter of which can be interspersed with the output of the program): gets() to fgets(). The way this was done is redefining gets() to use fgets(). The second and third arg are the same so it was possible to just redefine gets() to use fgets() but gets() having one arg like the original function. It should be noticed that the original code used fgets() in one case because it has to read from a different FILE * than stdin so there still is a reference to fgets() that is not part of the macros.
26 lines
1.6 KiB
C
26 lines
1.6 KiB
C
#define O(b,f,u,s,c,a)b(){int o=f();switch(*p++){X u:_ o s b();X c:_ o a b();default:p--;_ o;}}
|
|
#define t(e,d,_,C)X e:f=fopen(B+d,_);C;fclose(f)
|
|
#define U(y,z)while(p=Q(s,y))*p++=z,*p=' '
|
|
#define N for(i=0;i<11*R;i++)m[i]&&
|
|
#define I "%d %s\n",i,m[i]
|
|
#define X ;break;case
|
|
#define _ return
|
|
#define R 999
|
|
#define gets(x) fgets((x),R,stdin)
|
|
typedef char*A;int*C,E[R],L[R],M[R],P[R],l,i,j;char B[R],F[2];A m[12*R],malloc
|
|
(),p,q,x,y,z,s,d;FILE *f;A Q(s,o)A s,o;{for(x=s;*x;x++){for(y=x,z=o;*z&&*y==
|
|
*z;y++)z++;if(z>o&&!*z)_ x;}_ 0;}main(){m[11*R]="E";while(puts("Ok"),gets(B),
|
|
B[strlen(B)-1]='\0',1)switch(*B){X'R':C=E;l=1;for(i=0;i<R;P[i++]=0);while(l){while(!(s=m[l]))l++;if
|
|
(!Q(s,"\"")){U("<>",'#');U("<=",'$');U(">=",'!');}d=B;while(*F=*s){*s=='"'&&j
|
|
++;if(j&1||!Q(" \t",F))*d++=*s;s++;}*d--=j=0;if(B[1]!='=')switch(*B){X'E':l=-1
|
|
X'R':B[2]!='M'&&(l=*--C)X'I':B[1]=='N'?gets(p=B),P[*d]=S():(*(q=Q(B,"TH"))=0,p
|
|
=B+2,S()&&(p=q+4,l=S()-1))X'P':B[5]=='"'?*d=0,puts(B+6):(p=B+5,printf("%d\n",S
|
|
()))X'G':p=B+4,B[2]=='S'&&(*C++=l,p++),l=S()-1 X'F':*(q=Q(B,"TO"))=0;p=B+5;P[i
|
|
=B[3]]=S();p=q+2;M[i]=S();L[i]=l X'N':++P[*d]<=M[*d]&&(l=L[*d]);}else p=B+2,P[
|
|
*B]=S();l++;}X'L':N printf(I)X'N':N(free(m[i]),0),m[i]=0 X'B':_ 0 t('S',5,"w",N
|
|
fprintf(f,I))t('O',4,"r",while(fgets(B,R,f))(*Q(B,"\n")=0,G()))X 0:default:G()
|
|
;}_ 0;}G(){l=atoi(B);m[l]&&(free(m[l]),0);(p=Q(B," "))?strcpy(m[l]=malloc(strlen(p
|
|
)),p+1):(m[l]=0,0);}O(S,J,'=',==,'#',!=)O(J,K,'<',<,'>',>)O(K,V,'$',<=,'!',>=)
|
|
O(V,W,'+',+,'-',-)O(W,Y,'*',*,'/',/)Y(){int o;_*p=='-'?p++,-Y():*p>='0'&&*p<=
|
|
'9'?strtol(p,&p,0):*p=='('?p++,o=S(),p++,o:P[*p++];}
|