[comp.lang.c] v15i110: International Obfuscated C Code Contest, Part06/07

rsalz@uunet.uu.net (Rich Salz) (08/03/88)

Submitted-by: Landon Curt Noll <chongo@uts.amdahl.com>
Posting-number: Volume 15, Issue 110
Archive-name: ioccc/part06

# This is a shell archive.  Remove anything before this line, then
# unpack it by saving it in a file and typing "sh file".  (Files
# unpacked will be owned by you and have default permissions.)
#
# This archive contains:
# 
# ./1987/Makefile ./1987/README ./1987/biggar.c ./1987/biggar.hint
# ./1987/heckbert.c ./1987/heckbert.hint ./1987/hines.c ./1987/hines.hint
# ./1987/korn.c ./1987/korn.hint ./1987/lievaart.c ./1987/lievaart.hint
# ./1987/lievaart2.c ./1987/rules ./1987/wall.c ./1987/wall.hint
# ./1987/westley.c ./1987/westley.hint

echo x - ./1987/Makefile
sed -e 's/^X//' > "./1987/Makefile" << '//E*O*F ./1987/Makefile//'
X# %W% %G% %U%
X#
X# 1987 makefile
X
XSHELL=/bin/sh
XWINNERS=heckbert wall westley hines korn biggar lievaart lievaart2
X
X# for System V style systems
XOPSYS=-Dindex=strchr
X# for BSD style systems
X#OPSYS=
X
Xall: ${WINNERS}
X
Xheckbert: heckbert.c
X	cc ${OPSYS} $? -o $@
Xwall: wall.c
X	cc $? -o $@
Xwestley: westley.c
X	cc $? -o $@
Xhines: hines.c
X	cc $? -o $@
Xkorn: korn.c
X	cc $? -o $@
Xbiggar: biggar.c
X	cc -DC="R>0" -DI="if(T)O" -DO="c=write(1,&c,1);" \
X	    -DP="main(){X}" -DR="read(0,&c,1)" -DT="c!=015" \
X	    -DW="while(C)I" -DX="char c;W" $? -o $@
Xlievaart: lievaart.c
X	cc $? -o $@
X# not an official entry
Xlievaart2: lievaart2.c
X	cc $? -o $@
X
Xclean:
X	rm -f core
Xclobber: clean
X	rm -f ${WINNERS}
Xinstall: all
X	@echo are you kidding'??'
//E*O*F ./1987/Makefile//

echo x - ./1987/README
sed -e 's/^X//' > "./1987/README" << '//E*O*F ./1987/README//'
X1987 marked the "The Fourth International Obfuscated C Code Contest"
X
XThe rules for 1987 suggested even more categories than in 1986.  Hints
Xfor what to do and not to do were also given in the rules.  For
Xexample, a simple excessive abuse of /lib/cpp was discouraged unless
Xthe abuse was unusual.  The mailboxes for the contest were moved from
Xnsc to amdahl.  The practice of posting a preliminary set of rules for
Xthe next year was started this year.
X
XRules and results were posted to comp.lang.c, comp.unix.wizards with
Xan announcement in news.announce.important.  Micro/Systems Journal
Xpublished the 1987 winners.  Mark Horton included a version of the 1987
Xwinners in an appendix of his C book.  The first announcement of
Xwinners at the Summer 87 Usenix was helped by a small fly that
Xdanced all over the foils.
//E*O*F ./1987/README//

echo x - ./1987/biggar.c
sed -e 's/^X//' > "./1987/biggar.c" << '//E*O*F ./1987/biggar.c//'
XP;
//E*O*F ./1987/biggar.c//

echo x - ./1987/biggar.hint
sed -e 's/^X//' > "./1987/biggar.hint" << '//E*O*F ./1987/biggar.hint//'
XBest Abuse of the Rules: <sdcrdcf!markb> Mark Biggar
X
X	Mark Biggar
X	UNiSYS - System Development Group, Santa Monica
X	2525 Colorado AV MD 91-01
X	Santa Monica, CA
X	90406
X
XCompile with:
X
X	cc -DC="R>0" -DI="if(T)O" -DO="c=write(1,&c,1);" -DP="main(){X}"\
X	-DR="read(0,&c,1)" -DT="c!=015" -DW="while(C)I" -DX="char c;W" markb.c
X
XPasses BSD and UTS lint.  At least one version of lint is thrown into
Xan infinite loop by this entry.
X
XTry:  ... | markb | od -c	(remember to compile as indicated above)
X
XBy changing the compile line you can make this program do anything you
Xwant.  This is a very efficient way to transfer source, though it
Xincreases the size of Makefiles.
X
XWith only slight variations, this program can be set to many uses.
XConsider how easy it would be to release Un*x source in this form;
Xso what if the make files grow a little!  :-) 
X
XOne vendor's lint got hung in an infinite loop over this entry!
X
XFYI:  We will let Mark get away with this truly sick entry this time, but 
X      for the future on we have placed a limit on the size of a compile line.
X
XAlso see our comment in Larry Wall's entry regarding Mark's contribution.
//E*O*F ./1987/biggar.hint//

echo x - ./1987/heckbert.c
sed -e 's/^X//' > "./1987/heckbert.c" << '//E*O*F ./1987/heckbert.c//'
X#include <ctype.h>
X#include <stdio.h>
X#define _ define
X#_ A putchar
X#_ B return
X#_ C index
Xchar*r,c[300001],*d=">=<=!===||&&->++-->><<",*i,*l,*j,*m,*k,*n,*h,*y;e,u=1,v,w,
Xf=1,p,s,x;main(a,b)char**b;{p=a>1?atoi(b[1]):79;r=c+read(0,j=l=i=c,300000);v=g(
Xj,&m);for(k=m;v!=2;j=k,m=n,v=w,k=m){w=g(k,&n);if(v==1&&m-j==1&&*j==35)e&&A(10),
Xe=f=0;if(!f&&v==3&&(char*)C(j,10)<m)A(10),e=0,f=1;else if(v>2&&(u||w)&&(f||u)&&
X(l-i>1||*i!=61||n-k>1||!C("-*&",*k)))continue;else if(v==3)if(f&&e+1+n-k>p&&e)A
X(10),e=0;else A(32),e++;else{if(f&&e+m-j>p&&e)A(10),e=0;e+=m-j;k=j;while(k<m)A(
X*k++);}i=j;l=m;u=v;}e&&A(10);}g(j,m)char*j,**m;{if(j>=r)B*m=j,2;s=isdigit(*j)||
X*j==46&&isdigit(j[1]);for(h=j;h<r;h++)if(!isalnum(*h)&&*h!=95&&(!s||*h!=46)&&(!
Xs||h[-1]!=101&&h[-1]!=69||!C("+-",*h)))break;if(h>j)B*m=h,0;x=1;for(h=j;h<r&&C(
X" \t\n",*h);h++);if(h>j)h--,x=3;if(*j==34||*j==39)for(h=j+1;h<r&&*h!=*j;h++)if(
X*h==92)h++;for(y=d;*y&&strncmp(y,j,2);y+=2);if(*y)h=j+1;if(!strncmp("/*",j,2)){
Xh=j+2;while(*++h!=42||*++h!=47);x=4;}*m=h+1;B x;}
//E*O*F ./1987/heckbert.c//

echo x - ./1987/heckbert.hint
sed -e 's/^X//' > "./1987/heckbert.hint" << '//E*O*F ./1987/heckbert.hint//'
XBest Obfuscator of Programs: <pixar!ph> Paul Heckbert
X
X	Paul Heckbert
X	Pixar
X
XTry: ph 40 < ph.c > foo.c; cc foo.c -o ph
X     ph 20 < a_C_prog.c > bar.c; cc bar.c
X
XThe judges used this program to fold up very long lines which the
XBSD fold(1) was unable to process.  This program has been added
Xto the contest tool chest.
X
XOn System V systems, compile with: -Dindex=strchr.
XTo compile on a 16 bit machine, change 300000's to 30000.
//E*O*F ./1987/heckbert.hint//

echo x - ./1987/hines.c
sed -e 's/^X//' > "./1987/hines.c" << '//E*O*F ./1987/hines.c//'
X#include <stdio.h>
X#include <malloc.h>
Xmain(togo,toog)
Xint togo;
Xchar *toog[];
X{char *ogto,   tgoo[80];FILE  *ogot;  int    oogt=0, ootg,  otog=79,
Xottg=1;if (    togo==  ottg)   goto   gogo;  goto    goog;  ggot:
Xif (   fgets(  tgoo,   otog,   ogot)) goto   gtgo;   goto   gott;
Xgtot:  exit(); ogtg: ++oogt;   goto   ogoo;  togg:   if (   ootg > 0)
Xgoto   oggt;   goto    ggot;   ogog:  if (  !ogot)   goto   gogo;
Xgoto   ggto;   gtto:   printf( "%d    goto   \'s\n", oogt); goto
Xgtot;  oggt:   if (   !memcmp( ogto, "goto", 4))     goto   otgg;
Xgoto   gooo;   gogo:   exit(   ottg); tggo:  ootg=   strlen(tgoo);
Xgoto   tgog;   oogo: --ootg;   goto   togg;  gooo: ++ogto;  goto
Xoogo;  gott:   fclose( ogot);  goto   gtto;  otgg:   ogto=  ogto +3;
Xgoto   ogtg;   tgog:   ootg-=4;goto   togg;  gtgo:   ogto=  tgoo;
Xgoto   tggo;   ogoo:   ootg-=3;goto   gooo;  goog:   ogot=  fopen(
Xtoog[  ottg],  "r");   goto    ogog;  ggto:  ogto=   tgoo;  goto
Xggot;}
//E*O*F ./1987/hines.c//

echo x - ./1987/hines.hint
sed -e 's/^X//' > "./1987/hines.hint" << '//E*O*F ./1987/hines.hint//'
XWorst Style: <grebyn!avalon> Spencer Hines
X
X	Spencer Hines
X	OnLine Computer Systems
X	4200 Farragut Street
X	Hyattsville, MD
X	20781
X	USA
X
XTry:  avalon avalon.c
X
XThis program was designed to maximize the bother function for
Xstructured programmers.  This program takes goto statements to their
Xlogical conclusion.  The layout and choice of names are classic.
X
XWe consider this to be a beautiful counter-example for Frank Rubin's
Xletter to ACM form titled: `` "GOTO Considered Harmful" Considered Harmful ''.
XSee the Communications of the ACM, March 1987, Page 195-196.
//E*O*F ./1987/hines.hint//

echo x - ./1987/korn.c
sed -e 's/^X//' > "./1987/korn.c" << '//E*O*F ./1987/korn.c//'
X	main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
//E*O*F ./1987/korn.c//

echo x - ./1987/korn.hint
sed -e 's/^X//' > "./1987/korn.hint" << '//E*O*F ./1987/korn.hint//'
XBest One Liner: <ulysses!dgk> David Korn
X
X	David Korn
X	AT&T Bell Labs
X	MH 3C-526B, AT&T Bell Labs
X	Murray Hill, NJ
X	07974
X	USA
X
XThe Judges believe that this is the best one line entry ever received.
XCompile on a UN*X system, or at least using a C implementation that
Xfakes it.  Very few people are able to determine what this program
Xdoes by visual inspection.  I suggest that you stop reading this
Xsection right now and see if you are one of the few people who can.
X
XSeveral points are important to understand in this program:
X
X	1) What is the symbol `unix' and what is its value in the program?
X	   Clearly `unix' is not a function, and since `unix' is not declared
X	   to be a data type (such as int, char, struct foo, enum, ...)
X	   what must `unix' be?
X
X	2) What is the value of the symbol "have"?  (hint: the value is
X	   NOT 4 characters, or 'h', or a string)  Consider the fact that:
X
X		char *x;
X
X	  defines a pointer to a character (i.e. an address), and that
X	  the `=' assigns things is compatible types.  Since:
X
X	        x = "have";
X
X	  is legal C, what type of value is "have"?
X
X	3) Note that the following expressions yield the same value:
X
X		x[3]	*(x+3)	  *(3+x)
X
X	   since addition is communitive.  What can be said about the value:
X
X		3[x]
X
XDavid Korn's /bin/ksh provides us with a greatly improved version of
Xthe /bin/sh.  The source for v7's /bin/sh greatly inspired this contest.
//E*O*F ./1987/korn.hint//

echo x - ./1987/lievaart.c
sed -e 's/^X//' > "./1987/lievaart.c" << '//E*O*F ./1987/lievaart.c//'
X#define D define
X#D Y return
X#D R for
X#D e while
X#D I printf
X#D l int
X#D C y=v+111;H(x,v)*y++= *x
X#D H(a,b)R(a=b+11;a<b+89;a++)
X#D s(a)t=scanf("%d",&a)
Xl V[1100],u,r[]={-1,-11,-10,-9,1,11,10,9},h[]={11,18,81,88},ih[]={22,27,72,77},
Xbz,lv=60,*x,*y,m,t;S(d,v,f,a,b)l*v;{l c=0,*n=v+100,bw=d<u-1?a:-9000,w,z,i,zb,q=
X3-f;if(d>u){R(w=i=0;i<4;i++)w+=(m=v[h[i]])==f?300:m==q?-300:(t=v[ih[i]])==f?-50
X:t==q?50:0;return w;}H(z,0){if(GZ(v,z,f,100)){c++;w= -S(d+1,n,q,-b,-bw);if(w>bw
X){zb=z;bw=w;if(w>=b||w>=8003)Y w;}}}if(!c){bz=0;C;Y-S(d+1,n,q,-b,-bw);}bz=zb;Y
Xd>=u-1?bw+(c<<3):bw;}main(){R(;t<1100;t+=100)R(m=0;m<100;m++)V[t+m]=m<11||m>88
X||(m+1)%10<2?3:0;V[44]=V[55]=1;V[45]=V[54]=2;I("Level:");s(u);e(lv>0){do{I("Yo\
Xu:");s(m);}e(!GZ(V,m,2,0)&&m!=99);if(m!=99)lv--;if(lv<15&&u<10)u+=2;I("Wait\n")
X;I("Value:%d\n",S(0,V,1,-9000,9000));I("move: %d\n",(lv-=GZ(V,bz,1,0),bz));}}GZ
X(v,z,f,o)l*v;{l*j,q=3-f,g=0,i,h,*k=v+z;if(*k==0)R(i=7;i>=0;i--){j=k+(h=r[i]);e(
X*j==q)j+=h;if(*j==f&&j-h!=k){if(!g){g=1;C;}e(j!=k)*((j-=h)+o)=f;}}Y g;}
//E*O*F ./1987/lievaart.c//

echo x - ./1987/lievaart.hint
sed -e 's/^X//' > "./1987/lievaart.hint" << '//E*O*F ./1987/lievaart.hint//'
XGrand Prize: <botter!rblieva> Roemer B. Lievaart
X
X	Roemer B. Lievaart
X	VU Informatica
X	Churchilllaan 173-IV
X	Amsterdam, The Netherlands
X
XWe believe that you too will be amazed at just how much power Mr. Lievaart
Xpacked into 1024 bytes!
X
XThis Plays the game of reversi (Othello)!  Compile and run.  It then
Xasks for a playing level. Enter 0-10 (easy-hard).  It then asks for
Xyour move. A move is a number within 11-88, or a 99 to pass.  Illegal
Xmoves (except for an illegal pass) are rejected.  Then the computer
Xdoes its move (or a 0 to pass), until the board is full.  It plays
Xrather well, for such a small program!  Lievaart had to leave out the
Xboard printing routine, so you'll have to take a real game board to
Xplay it. ...  Also due to space-limitations (the rules for 1987 had a
Xlimit of 1024 byes), Lievaart took out the passing-handler, which
Xmakes its ending-game rather poor.  But further it knows all the
Xrules, uses alpha-beta pruning, and it plays f.i. on mobility(!).
XMost important: it can play a pretty good game of Reversi!
X
XThe Author was kind enough to supply the fully functional version of the
Xprogram.  The file lievaart2.c contains what the program would have
Xbeen without the size restriction.  This version has the full end game 
Xlogic and displays the board after each move!
//E*O*F ./1987/lievaart.hint//

echo x - ./1987/lievaart2.c
sed -e 's/^X//' > "./1987/lievaart2.c" << '//E*O*F ./1987/lievaart2.c//'
X#define D define
X#D Y return
X#D R for
X#D e while
X#D I printf
X#D l int
X#D W if
X#D C y=v+111;H(x,v)*y++= *x
X#D H(a,b)R(a=b+11;a<b+89;a++)
X#D s(a)t=scanf("%d",&a)
X#D U Z I
X#D Z I("123\
X45678\n");H(x,V){putchar(".XO"[*x]);W((x-V)%10==8){x+=2;I("%d\n",(x-V)/10-1);}}
Xl V[1600],u,r[]={-1,-11,-10,-9,1,11,10,9},h[]={11,18,81,88},ih[]={22,27,72,77},
Xbz,lv=60,*x,*y,m,t;S(d,v,f,_,a,b)l*v;{l c=0,*n=v+100,j=d<u-1?a:-9000,w,z,i,g,q=
X3-f;W(d>u){R(w=i=0;i<4;i++)w+=(m=v[h[i]])==f?300:m==q?-300:(t=v[ih[i]])==f?-50:
Xt==q?50:0;Y w;}H(z,0){W(E(v,z,f,100)){c++;w= -S(d+1,n,q,0,-b,-j);W(w>j){g=bz=z;
Xj=w;W(w>=b||w>=8003)Y w;}}}W(!c){g=0;W(_){H(x,v)c+= *x==f?1:*x==3-f?-1:0;Y c>0?
X8000+c:c-8000;}C;j= -S(d+1,n,q,1,-b,-j);}bz=g;Y d>=u-1?j+(c<<3):j;}main(){R(;t<
X1600;t+=100)R(m=0;m<100;m++)V[t+m]=m<11||m>88||(m+1)%10<2?3:0;I("Level:");V[44]
X=V[55]=1;V[45]=V[54]=2;s(u);e(lv>0){Z do{I("You:");s(m);}e(!E(V,m,2,0)&&m!=99);
XW(m!=99)lv--;W(lv<15&&u<10)u+=2;U("Wait\n");I("Value:%d\n",S(0,V,1,0,-9000,9000
X));I("move: %d\n",(lv-=E(V,bz,1,0),bz));}}E(v,z,f,o)l*v;{l*j,q=3-f,g=0,i,w,*k=v
X+z;W(*k==0)R(i=7;i>=0;i--){j=k+(w=r[i]);e(*j==q)j+=w;W(*j==f&&j-w!=k){W(!g){g=1
X;C;}e(j!=k)*((j-=w)+o)=f;}}Y g;}
//E*O*F ./1987/lievaart2.c//

echo x - ./1987/rules
sed -e 's/^X//' > "./1987/rules" << '//E*O*F ./1987/rules//'
XWARNING: The rules and mailing address for the contest change from year
X         to year.  Be sure that you consult the current set of rules
X	 before submitting entries.
X------------------------------------------------------------------------------
X
XSubject: 4th International Obfuscated C Code Contest Rules
XNewsgroups: comp.lang.c,comp.unix.wizards
XKeywords: rules,1987,obfuscate,contest
X
XGOALS OF THE CONTEST:
X
X	* To write the most Obscure/Obfuscated C program under the rules below.
X	* To show what should NOT be done in C programs.
X	* To provide a safe forum for poor C code.  :-)
X
XRULES:
X	1) The source must be 1024 characters long or less.  NO EXCEPTIONS!
X
X	2) To help us process your entries, we ask that you submit entries
X	   in the following format:   (please include the --- lines)
X
X---start of header items---
Xname:
Xorg:
Xemail address:
Xpostal address:
Xenvironment:
Xremarks:
X---start of entry---
XX	<place obfuscated source of 1024 characters or less here>
XX	<add a leading X to each line to avoid problems with mailers>
XX	<leading X's do not count toward the source character count>
XX	<the first X of each source line will be removed prior to compilation>
XX	<newlines count as 1 character>
XX	<assume a standard 8 character tab stop>
X---end of entry---
X
X	3) Regarding the header items:
X
X	    * All header items except 'remark' are optional.  If you do not
X	      wish to answer an item, indicate so by the string:   ***NONE***
X	      Any text outside of the above format will be kept confidential.
X
X	    * You can remain anonymous.   If the name item is:  ***ANONYMOUS***
X	      all items except the 'remarks' item will not be relased.
X
X	    * Indicate the name of your Company or School in the 'org' item.
X
X	    * The 'email address' item asks for a network path from a major
X	      site (such as amdahl) to your mailbox.
X
X	    * If you give a 'postal address', please include your Country.
X
X	    * Give the machine and operating system (i.e., Un*x version) on
X	      which your program ran.
X
X	    * The 'remarks' item is not optional.  Please indicate:
X		- how to execute or compile if something special is required
X		- type of input or argument needed, if applicable
X		- what this program does
X		- any other remarks you wish to make
X
X	    * If you need more than one line on a header item, place
X	      tab or space characters at the beginning of each additional line.
X
X	4) The entry should be written in a common C. (K&R + common extensions)
X
X	5) The program must be of original work.  All programs must be
X	   in the public domain.  All copyrighted programs will be rejected.
X
X	6) Entries must be received before 30-May-87 0:00 GMT.
X	   Email your entries to:
X	   
X			...!amdahl!obfuscate
X
X	   Amdahl talks to hplabs, decwrl, pyramid, seismo and cbosgd.
X	   We will attempt to Email a confirmation of receipt of contest
X	   entries, however since Email is not reliable you may not receive it.
X	   People are encouraged to submit entries via Email, however
X	   one may mail entries the following postal address:
X
X		Landon Curt Noll
X		Amdahl Corp.
X		1250 E. Arques Ave.   M/S 316
X		P.O. Box 3470
X		Sunnyvale, CA
X		94088-3470
X		U.S.A.
X
X	  Write the words: "International Obfuscated C Code Contest" near the
X	  bottom left corner of the envelope.
X
X	8) Contest entries sent in by post should indicate where TAB characters
X	   are to be placed, otherwise space characters will be assumed.  Each
X	   line will be assumed to contain a newline character.  The leading
X	   'X' will serve to indicate where each source line starts.
X
X	9) Each person may submit up to 5 entries.  Multiple entries must
X	   be sent in separate Email letters or postal envelopes.
X
X	10) People are encouraged to examine winners of the previous
X	    contests.  A copy of these entries was posted to mod.sources
X	    on or about 12-Mar-87.  Contact the mod.sources moderator
X	    if you missed that article.  Keep in mind that rules change from
X	    year to year, so some winning entries may not be valid
X	    entries this year.  Also what was unique and novel one
X	    year can get 'old' the next year.
X
X
XANNOUNCEMENT OF WINNERS:
X
X	* First announcement will be at the Summer 87 Usenix BOF.
X
X	* An announcement will be posted to mod.announce near
X	  mid June 1987 stating to which newsgroup the winners
X	  have been posted.
X
X	* An article containing the winning entries will be published
X	  in a future issue of the "Micro/Systems Journal".
X
X	* Winners receive international fame and flames!  :-)
X
X
XJUDGING:
X	Awards will be given to the best entry in a number of categories.
X	The actual category list will vary depending on the types of entries
X	we receive.  At the moment, we are considering using the following:
X
X		* The best small one line program
X		* The most obscure algorithm
X		* The worst abuse of the C preprocessor  (note warnings below)
X		* The strangest source layout
X		* The most useful obfuscated program
X		* <anything else so strange that it deserves an award>
X
X	Extra points will be given for programs which:
X
X		* pass lint without complaint
X		* do something quasi-interesting
X		* are portable
X		* are unique in their obfuscation style
X		* are concise
X
X	Points will be taken away for programs that:
X
X		* are very hardware or Un*x version specific
X		* dump core or have compiler warnings
X		  (we won't take points away if you warn us in the remark item)
X		* fail to compile
X		* obfuscate only by overuse of #defines
X		  (you should do this ONLY if your use is unusual)
X		* are similar to previous winners
X		* are similar to previous losers  :-)
X
X	The Judging will be done by Landon Noll and Larry Bassel.  
X	Comments & questions (not entries) about the contest can be Emailed to:
X
X			 ...!amdahl!judges
X
Xchongo <Landon Curt Noll> /\cc/\
XLarry Bassel
//E*O*F ./1987/rules//

echo x - ./1987/wall.c
sed -e 's/^X//' > "./1987/wall.c" << '//E*O*F ./1987/wall.c//'
X#define iv 4 
X#define v ;(void
X#define XI(xi)int xi[iv*'V'];
X#define L(c,l,i)c(){d(l);m(i);}
X#include <stdio.h>
Xint*cc,c,i,ix='\t',exit(),X='\n'*'\d';XI(VI)XI(xi)extern(*vi[])(),(*
Xsignal())();char*V,cm,D['x'],M='\n',I,*gets();L(MV,V,(c+='d',ix))m(x){v)
Xsignal(X/'I',vi[x]);}d(x)char*x;{v)write(i,x,i);}L(MC,V,M+I)xv(){c>=i?m(
Xc/M/M+M):(d(&M),m(cm));}L(mi,V+cm,M)L(md,V,M)MM(){c=c*M%X;V-=cm;m(ix);}
XLXX(){gets(D)||(vi[iv])();c=atoi(D);while(c>=X){c-=X;d("m");}V="ivxlcdm"
X+iv;m(ix);}LV(){c-=c;while((i=cc[*D=getchar()])>-I)i?(c?(c<i&&l(-c-c,
X"%d"),l(i,"+%d")):l(i,"(%d")):(c&&l(M,")"),l(*D,"%c")),c=i;c&&l(X,")"),l
X(-i,"%c");m(iv-!(i&I));}L(ml,V,'\f')li(){m(cm+!isatty(i=I));}ii(){m(c=cm
X= ++I)v)pipe(VI);cc=xi+cm++;for(V="jWYmDEnX";*V;V++)xi[*V^' ']=c,xi[*V++]
X=c,c*=M,xi[*V^' ']=xi[*V]=c>>I;cc[-I]-=ix v)close(*VI);cc[M]-=M;}main(){
X(*vi)();for(;v)write(VI[I],V,M));}l(xl,lx)char*lx;{v)printf(lx,xl)v)
Xfflush(stdout);}L(xx,V+I,(c-=X/cm,ix))int(*vi[])()={ii,li,LXX,LV,exit,l,
Xd,l,d,xv,MM,md,MC,ml,MV,xx,xx,xx,xx,MV,mi};
//E*O*F ./1987/wall.c//

echo x - ./1987/wall.hint
sed -e 's/^X//' > "./1987/wall.hint" << '//E*O*F ./1987/wall.hint//'
XMost Useful Obfuscation: <sdcrdcf!lwall> Larry Wall
X
X	Larry Wall
X	Unisys - System Development Group Santa Monica
X	9132 Kester Ave
X	Panorama City, CA  91402  USA
X
XTry:	lwall | bc | lwall
Xinput:	x*x
Xinput:	c^2
X
XAlso try:  lwall | bc   and   lwall | cat
X
XWhat we found amazing was how the flow of control was transferred
Xbetween subroutines.  Careful inspection will show that the array of
Xpointers to functions named `vi' refers to functions which seem to not
Xbe directly called.  Even so, these pointers to functions are being
Xused as an argument to signal.  Can you determine why this is being
Xdone and how it is being exploited?
X
XSome compilers complained about this file, so we changed: '=++I' to '= ++I'.
//E*O*F ./1987/wall.hint//

echo x - ./1987/westley.c
sed -e 's/^X//' > "./1987/westley.c" << '//E*O*F ./1987/westley.c//'
X				char rahc
X				   [ ]
X				    =
X				  "\n/"
X				    ,
X				redivider
X				   [ ]
X				    =
X		       "Able was I ere I saw elbA"
X				    ,
X				    *
X			     deliver,reviled
X				    =
X				   1+1
X				    ,
X			       niam ; main
X				   ( )
X				  {/*\}
X				   \*/
X				 int tni
X				    =
X				   0x0
X				    ,
X			     rahctup,putchar
X				   ( )
X		           ,LACEDx0 = 0xDECAL,
X				rof ; for
X			     (;(int) (tni);)
X			       (int) (tni)
X			  = reviled ; deliver =
X				redivider
X				    ;
Xfor ((int)(tni)++,++reviled;reviled* *deliver;deliver++,++(int)(tni)) rof
X			            =
X			     (int) -1- (tni)
X		          ;reviled--;--deliver;
X			     (tni)  =  (int)
X			  - 0xDECAL + LACEDx0 -
X				rof ; for
X       (reviled--,(int)--(tni);(int) (tni);(int)--(tni),--deliver)
X			    rahctup = putchar
X			   (reviled* *deliver)
X				    ;
X			    rahctup * putchar
X			    ((char) * (rahc))
X				    ;
X				   /*\
X				  {\*/}
//E*O*F ./1987/westley.c//

echo x - ./1987/westley.hint
sed -e 's/^X//' > "./1987/westley.hint" << '//E*O*F ./1987/westley.hint//'
XBest Layout: <starfire!merlyn> Brian Westley
X
X	Brian Westley (aka Merlyn Leroy on usenet)
X	Starfire Consulting
X	1121 Hamline Ave. N. #17
X	St. Paul, MN
X	55108
X	USA
X
XPutchar must exist in the C library and not just as a macro.
XIf it fails to compile, add the line:  #include <stdio.h>  at the
Xtop of the program.
X
XLine by line symmetry performed better than any C beautifier.  Think
Xof if it as a C ink blot.  :-)
//E*O*F ./1987/westley.hint//

echo Possible errors detected by \'wc\' [hopefully none]:
temp=/tmp/shar$$
trap "rm -f $temp; exit" 0 1 2 3 15
cat > $temp <<\!!!
 40  112  726  Makefile
 15  136  816  README
 1  1  3  biggar.c
 32  191  1141  biggar.hint
 18  33  1021  heckbert.c
 14  76  430  heckbert.hint
 19  130  953  hines.c
 18  82  565  hines.hint
 1  3  70  korn.c
 44  242  1401  korn.hint
 20  44  1022  lievaart.c
 27  224  1303  lievaart.hint
 25  61  1175  lievaart2.c
 161  917  5745  rules
 18  30  1021  wall.c
 21  120  708  wall.hint
 48  93  908  westley.c
 15  73  412  westley.hint
 537  2568  19420  total
!!!
wc  ./1987/Makefile ./1987/README ./1987/biggar.c ./1987/biggar.hint ./1987/heckbert.c ./1987/heckbert.hint ./1987/hines.c ./1987/hines.hint ./1987/korn.c ./1987/korn.hint ./1987/lievaart.c ./1987/lievaart.hint ./1987/lievaart2.c ./1987/rules ./1987/wall.c ./1987/wall.hint ./1987/westley.c ./1987/westley.hint | sed 's=[^ ]*/==' | diff -b $temp -
exit 0

-- 
Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.