fredericopissarra Posted December 3, 2019 at 02:16 PM Share Posted December 3, 2019 at 02:16 PM Outra obra de arte do IOCCC (Jon Thingvold, em 1996) Não faço a MENOR ideia de como esse troço funciona: #define O B F U S C A T E D #define I 8;}t(p){r(p?W:o);XClearWindow(V,m);}main(i,f)char**f;{M((T(h=f), #define K Y(o,XMapRaised(V,e);)x=3;x--;)for(y=3;y--;r(G))XMapRaised(V,R[D] #define N z(x+i,(z(H-x-i,x),x)))x<i||z(x-i,x)|z(H-x+i,x)Y(W,)l=k;l>20&&l>x #define XIMOfIC Z;XID(*w)()=XCreateWindow,m,e,o[2],W[2],G[2],R[2][O]);}GC*g #define E (++D)));}r(XID*z){XSetWindowBackgroundPixmap(V=d[D],m=R[D][x][y],z[ #define L ;XStoreName(V,e=w(V,RootWindow(V,s),0,0,152,152,2,0,1,0,0,0),"II"+D #define B 3][3];Display*V,*d[2];char**h,k=25,b[2500],H=50,D,s,x,y,i;T(){float #define S +k),z(k-P=w(V,e,H*x,H*y,H,H,1,0,1,0,2048,&c));}XEvent J;M(){XFlush( #define Y(z,y) ;for(z[D]=XCreatePixmapFromBitmapData(Q,x=0,H*H);x<H;x++)y for( #define A x][y]&&!b[x+k*y]++?t(D),t(!(D^=1)):D);M();}z(x,y){b[x/8+y*7]|=1<<x%I #define P x,y)-z(y,x+k)+z(y,k-x)*z(x+k,y=H-y),z(k-x,y),z(y,k-x),z(y,k+x)K[x][y] #define Q V,e,b,H,H,BlackPixel(V,s),WhitePixel(V,s),DefaultDepth(V,s)),memset(b #define C d[!D]);x=3;for(XNextEvent(V,&J);x--;)for(y=3;y--;J.xany.window==R[D][ #define F l;XSetWindowAttributes c;s=XDefaultScreen(V=d[D]=XOpenDisplay(*(h+=!! #define U *h)))L)Y(G,)i=c.event_mask=4;i--;x+i>H||N;l-=.5)z(x+k,y=sqrt(l*l-x*x) #include <math.h> #include <string.h> #include <X11/Xlib.h> Só funciona nos "unixes" (por causa do X11)... Para compilar: $ gcc -O2 -ansi -o jonth jonth.c -lX11 -lm Para compilar no Solaris é necessário acrescentar -lsocket. Note que o código inteiro só tem definições lexicas (#define)... cadê a porcaria do main() como função (está lá na definição de I)? ? Esse programinha abrirá 2 janelas no X11 (sem argumentos ambas abrirão no DISPLAY default)... elas podem ser direcionadas para hosts diferentes... por exemplo: $ ./jonth host1:0 host2:0 Onde 'host1' e 'host2' podem ser IPs ou nomes de hosts... Link to comment Share on other sites More sharing options...
Felipe.Silva Posted December 6, 2019 at 08:10 PM Share Posted December 6, 2019 at 08:10 PM $ gcc jonth.c -o test.c -E Eu usei -E do GCC para ver o conteúdo expandido. Depois procurei pelo texto "main(" no arquivo de saída e encontrei. Aproveitando das diretivas de linha que o GCC insere, eu vi que o conteúdo estava expandindo no arquivo /usr/include/X11/Xlib.c na linha 3889. Nesta linha contém a seguinte declaração: extern XIM XIMOfIC( XIC /* ic */ ); O `#define` da linha 5 seta o macro de nome XIMOfIC. Perto do final desse macro nós temos um macro "O" ali. Veja em negrito: Citar #define XIMOfIC Z;XID(*w)()=XCreateWindow,m,e,o[2],W[2],G[2],R[2][O]);}GC*g Acontece que aonde tem esse "O" é expandido o conteúdo do macro B. Pelo visto um macro que expande para o nome de outro macro dentro de um header file, é expandido mais uma vez. Parece que há uma repetição do pré-processamento. Para testar isso eu fiz o seguinte: // Arquivo tst.c #define B X Y #define X 5 #define Y , c = 3 #include <stdio.h> #include "h.h" int main(void) { printf("%d, %d\n", b, c); return 0; } // Arquivo h.h int b = B; E funcionou. No arquivo "h.h", B expandiu para o conteúdo de X e Y em sequência. Formando: int b = 5, c = 3; E se a gente voltar para o primeiro `#define`, a gente nota que a declaração do macro "O" é feita como uma sequência de letras, onde a primeira é B. Seguindo essa "corrente" os macros vão expandindo um atrás do outro. Isso é brilhante hahaha. Link to comment Share on other sites More sharing options...
fredericopissarra Posted December 8, 2019 at 01:47 AM Author Share Posted December 8, 2019 at 01:47 AM Grande Felipe, você é muito mais paciente que eu... também pensei em passar o troço pelo pré-processador (cpp - c pre processor)... mas não tive paciência pra isso! ? Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.