diff --git a/1984/decot/decot.c b/1984/decot/decot.c index 1069eb7d9..7aa30e532 100644 --- a/1984/decot/decot.c +++ b/1984/decot/decot.c @@ -21,7 +21,7 @@ int dup, signal; goto _0; _O: while (!(k['a'] <<= - dup)) { /*/*\*/ - static struct tag u = {4}; + union tag u x{4}; } } diff --git a/1986/wall/Makefile b/1986/wall/Makefile index 4ce40ac19..22cb187b8 100644 --- a/1986/wall/Makefile +++ b/1986/wall/Makefile @@ -103,6 +103,7 @@ ifeq ($(CC),gcc) # #CWARN+= # +CFLAGS+= -traditional-cpp endif @@ -136,9 +137,12 @@ ${PROG}: ${PROG}.c # alternative executable # -alt: data ${ALT_TARGET} +alt: ${ALT_TARGET} @${TRUE} +${PROG}.alt: ${PROG}.alt.c + ${CC} ${CFLAGS} $< -o $@ ${LDFLAGS} + # data files # data: ${DATA} diff --git a/1986/wall/README.md b/1986/wall/README.md index d6b18ed0e..8ea1ca22d 100644 --- a/1986/wall/README.md +++ b/1986/wall/README.md @@ -26,10 +26,15 @@ might enjoy looking at the original source in [wall.alt.c](wall.alt.c). # if you have an old enough compiler: make alt -# or with gcc: +# or if you have gcc: +make CC=gcc alt + +# or if you have a compiler that supports -traditional-cpp that's not gcc: make CFLAGS+="-traditional-cpp" alt ``` +NOTE: gcc in macOS is actually clang even the binary `/usr/bin/gcc`. + Use `./wall.alt` as you would `./wall`. ## Judges' remarks: diff --git a/1987/hines/README.md b/1987/hines/README.md index f4d8126fa..fc3d3bf84 100644 --- a/1987/hines/README.md +++ b/1987/hines/README.md @@ -1,10 +1,6 @@ # Worst Style -Spencer Hines -OnLine Computer Systems -4200 Farragut Street -Hyattsville, MD -20781 +Spencer Hines
US ## To build: @@ -27,8 +23,8 @@ make all ### Alternate code: -An alternate version of this entry is in [hines.alt.c](hines.alt.c). With older compilers you -can try the alt version: +An alternate version of this entry is in [hines.alt.c](hines.alt.c). With older +compilers you can try the alt version: ```sh make alt @@ -39,11 +35,12 @@ Use `hines.alt` as you would `hines` above. ## Judges' remarks: This program was designed to maximize the bother function for -structured programmers. This program takes goto statements to their +structured programmers. This program takes `goto` statements to their logical conclusion. The layout and choice of names are classic. We consider this to be a beautiful counter-example for Frank Rubin's -letter to ACM form titled: _"'GOTO Considered Harmful' Considered Harmful"_. +letter to ACM form titled: _["'GOTO Considered Harmful' Considered +Harmful"](https://web.archive.org/web/20090320002214/http://www.ecn.purdue.edu/ParaMount/papers/rubin87goto.pdf)_. See the Communications of the ACM, March 1987, Page 195-196. diff --git a/1987/korn/README.md b/1987/korn/README.md index a5f3bced8..260c39d92 100644 --- a/1987/korn/README.md +++ b/1987/korn/README.md @@ -1,10 +1,6 @@ # Best One Liner David Korn -AT&T Bell Labs -MH 3C-526B, AT&T Bell Labs -Murray Hill, NJ -07974 US ## To build: @@ -13,15 +9,21 @@ US make all ``` +## To use: + +```sh +./korn +``` + ## Judges' remarks: The Judges believe that this is the best one line entry ever received. -Compile on a `UNIX` system, or at least using a C implementation that +Compile on a UNIX system, or at least one using a C implementation that fakes it. Very few people are able to determine what this program does by visual inspection. I suggest that you stop reading this section right now and see if you are one of the few people who can. -Several points are important to understand in this program: +Several points are important to understand this program: 1. What is the symbol `unix` and what is its value in the program? Clearly `unix` is not a function, and since `unix` is not declared to be a data type @@ -34,10 +36,9 @@ characters, or `'h'`, or a string) Consider the fact that: char *x; - defines a pointer to a character (i.e. an address), and that the `=` assigns + defines a pointer to a `char` (i.e. an address), and that the `=` assigns things of compatible types. Since: - x = "have"; is legal C, what type of value is `"have"`? @@ -53,8 +54,12 @@ characters, or `'h'`, or a string) Consider the fact that: ? -David Korn's `/bin/ksh` provides us with a greatly improved version of -the /bin/sh. The source for v7's /bin/sh greatly inspired this contest. +[David +Korn](https://news.slashdot.org/story/01/02/06/2030205/david-korn-tells-all)'s +[/bin/ksh](https://en.wikipedia.org/wiki/KornShell) provides us with a greatly +improved version of the [/bin/sh](https://en.wikipedia.org/wiki/Bourne_shell). +The source for [v7](https://en.wikipedia.org/wiki/Version_7_Unix)'s /bin/sh +greatly inspired this contest. ## Author's remarks: diff --git a/1987/lievaart/README.md b/1987/lievaart/README.md index 919ac5b5a..10822ef6b 100644 --- a/1987/lievaart/README.md +++ b/1987/lievaart/README.md @@ -9,8 +9,8 @@ Netherlands make all ``` -NOTE: The original entry may be built with "make alt" if you have an old enough -compiler. +There is [Alternate code](#alternate-code) available for if you have an old +enough compiler. ## To run: @@ -19,12 +19,6 @@ compiler. # enter a level and start playing as described below ``` -### INABIAF - it's not a bug it's a feature! :-) - -If you enter invalid input the program will enter an infinite loop displaying a -string like `"You:"` repeatedly (for instance if you input `.`). If you enter an -incorrect value it will prompt you again until you input a proper value. - ## Try: To see what it would have looked like without the size restrictions: @@ -34,30 +28,46 @@ To see what it would have looked like without the size restrictions: # enter a level and start playing as described below ``` +## Alternate code: + +If you have an old enough compiler you might wish to try using it. To use: + +```sh +make alt +``` + +Use `./lievaart.alt` as you would `./lievaart` above. + +### INABIAF - it's not a bug it's a feature! :-) + +If you enter invalid input the program will enter an infinite loop displaying a +string like `"You:"` repeatedly (for instance if you input `.`). If you enter an +incorrect value it will prompt you again until you input a proper value. ## Judges' remarks: We believe that you too will be amazed at just how much power Mr. Lievaart packed into 1024 bytes! -This Plays the game of Reversi (Othello)! Compile and run. It then +This Plays the game of [Reversi +(Othello)](https://en.wikipedia.org/wiki/Reversi)! Compile and run. It then asks for a playing level. Enter 0-10 (easy-hard). It then asks for -your move. A move is a number within 11-88, or a 99 to pass. Illegal +your move. A move is a number within 11-88, or 99 to pass. Illegal moves (except for an illegal pass) are rejected. Then the computer does its move (or a 0 to pass), until the board is full. -It plays rather well, for such a small program! Lievaart had to leave out the +It plays rather well, for such a small program! Lievaart had to leave out the board printing routine, so you'll have to take a real game board to play it (or see below). ... Also due to space-limitations (the rules for 1987 had a limit of 1024 byes), Lievaart took out the passing-handler, which makes its -ending-game rather poor. But further it knows all the rules, uses alpha-beta -pruning, and it plays f.i. on mobility(!). Most important: it can play a pretty -good game of Reversi! +ending-game rather poor. But further it knows all the rules, uses [alpha-beta +pruning](https://en.wikipedia.org/wiki/Alpha-beta_pruning), and it plays for +instance on mobility(!). Most important: it can play a pretty good game of Reversi! The Author was kind enough to supply the fully functional version of the -program. The file lievaart2.c contains what the program would have -been without the size restriction. This version has the full end game -logic and displays the board after each move! +program. The file [lievaart2.c](lievaart2.c) contains what the program would +have been without the size restriction. This version has the full end game +logic and displays the board after each move! See above for how to use this. ## Author's remarks: diff --git a/1987/lievaart/lievaart.c b/1987/lievaart/lievaart.c index 90df1a3fa..eb18d37b5 100644 --- a/1987/lievaart/lievaart.c +++ b/1987/lievaart/lievaart.c @@ -1,3 +1,4 @@ +#define D define #define Y return #define R for #define e while diff --git a/1987/lievaart/lievaart2.c b/1987/lievaart/lievaart2.c index cb05bfc59..27c34bcc8 100644 --- a/1987/lievaart/lievaart2.c +++ b/1987/lievaart/lievaart2.c @@ -1,3 +1,4 @@ +#define D define #define Y return #define R for #define e while diff --git a/1987/wall/README.md b/1987/wall/README.md index 152f28736..4a19a9aa3 100644 --- a/1987/wall/README.md +++ b/1987/wall/README.md @@ -1,6 +1,6 @@ # Most Useful Obfuscation -Larry Wall +Larry Wall
US ## To build: @@ -59,12 +59,12 @@ quit # for the cat version ## Judges' remarks: -What we found amazing was how the flow of control was transferred -between subroutines. Careful inspection will show that the array of -pointers to functions named `vi` refers to functions which seem to not -be directly called. Even so, these pointers to functions are being -used as an argument to `signal()` (used both with and without an arg - but -how?). Can you determine why this is being done and how it is being exploited? +What we found amazing was how the flow of control was transferred between +subroutines. Careful inspection will show that the array of pointers to +functions named `vi` refers to functions which seem to not be directly called. +Even so, these pointers to functions are being used as an argument to +`signal(3)` (used both with and without an arg - but how?). Can you determine +why this is being done and how it is being exploited? Some compilers complained about this file, so we changed: `=++I` to `= ++I`. diff --git a/1987/westley/Makefile b/1987/westley/Makefile index f69ac9fb3..c2c2d8377 100644 --- a/1987/westley/Makefile +++ b/1987/westley/Makefile @@ -39,7 +39,7 @@ include ../../var.mk # Common C compiler warnings to silence # CSILENCE= -Wno-for-loop-analysis -Wno-unused-value \ - -Wno-deprecated-non-prototype -Wno-strict-prototypes + -Wno-deprecated-non-prototype -Wno-strict-prototypes -Wno-implicit-int # Common C compiler warning flags # @@ -62,7 +62,7 @@ CDEFINE= # Include files that are needed to compile # -CINCLUDE= +CINCLUDE= -include stdio.h # Optimization # diff --git a/1987/westley/README.md b/1987/westley/README.md index b4048c4fa..f13e98662 100644 --- a/1987/westley/README.md +++ b/1987/westley/README.md @@ -30,14 +30,12 @@ Use `westley.alt` as you would `westley` above. ## Judges' remarks: -Putchar must exist in the C library and not just as a macro. -If it fails to compile, add the line: `#include ` at the -top of the program. +`putchar()` must exist in the C library and not just as a macro. +If it fails to compile, bug your OS/compiler vendor. Line by line symmetry performed better than any C beautifier. Think of if it as a C ink blot. :-) - ## Author's remarks: No remarks were provided by the author. diff --git a/1987/westley/westley.c b/1987/westley/westley.c index 6db527893..f58cb3251 100644 --- a/1987/westley/westley.c +++ b/1987/westley/westley.c @@ -26,11 +26,11 @@ ,LACEDx0 = 0xDECAL, rof ; for (;(int) (tni);) - /* (int)*/(tni) + (tni) = reviled ; deliver = redivider ; -for ((int)(tni)++,++reviled;reviled* *deliver;deliver++,++/*(int)*/(tni)) rof + for ((tni)++,++reviled;reviled**deliver;deliver++,++(tni)) rof = (int) -1- (tni) ;reviled--;--deliver; diff --git a/1988/applin/Makefile b/1988/applin/Makefile index 173ce47cc..1673422cd 100644 --- a/1988/applin/Makefile +++ b/1988/applin/Makefile @@ -131,9 +131,9 @@ all: data ${TARGET} # # This entry took 75 minutes to compile on a Amdahl 5980-300E # (a 55658 Dhyrstone/sec/cpu machine) using the System V cpp. -# (The GNU cpp when defined as BIG_CPP took only 45 seconds) +# (The GNU cpp when defined as BIG_CPP took only 45 seconds.) # Your cpp may not be able to compile it due to a common bug -# that results in ${CPP} running out of space. The routine +# that results in cpp running out of space. The routine # 'zsmall' is a smaller version of the applin.c entry. # ${PROG}: ${PROG}.c diff --git a/1988/applin/README.md b/1988/applin/README.md index 187729cdf..baee1b29a 100644 --- a/1988/applin/README.md +++ b/1988/applin/README.md @@ -1,7 +1,7 @@ # Best of show -Jack Applin -US +Jack Applin
+US
## To build: @@ -10,9 +10,10 @@ US make all ``` -A smaller version, originally called `zsmall.c`, of [applin.c](applin.c) can be -found in [applin.alt.c](applin.alt.c). Your machine may have an easier time -with this program. See the Alternate code section below for details. +A smaller version, originally called `zsmall.c` (and still exists as such, as +the source of the alt code), of [applin.c](applin.c), can be found in +[applin.alt.c](applin.alt.c). Your machine may have an easier time with this +program. See the [Alternate code](#alternate-code) section below for details. ## Try: @@ -22,8 +23,10 @@ with this program. See the Alternate code section below for details. ### Alternate code: -As noted above a smaller version can be used in case your cpp has a hard time -with this entry. To use: +As noted above a smaller version can be used in case your `cpp` has a hard time +with this entry. + +#### To build: ```sh make alt @@ -31,22 +34,34 @@ make alt Use `applin.alt` as you would `applin` above. +#### History about the smaller version: + +Way back in 1988 .. + +This entry took 75 minutes to compile on a Amdahl 5980-300E (a 55658 +Dhyrstone/sec/cpu machine) using the System V `cpp`. (The GNU `cpp` when defined as +`BIG_CPP` took only 45 seconds.) + +Your `cpp` may not be able to compile it due to a common bug that results in +`cpp` running out of space. The routine [zsmall](zsmall.c) is a smaller version +of the [applin.c](applin.c) entry. + ## Judges' remarks: This entry is by far the most unusual abuse of the C preprocessor that we have received thus far. Nearly all of the real work is done in the -preprocessor! +C preprocessor! When we compiled [applin.c](applin.c) on an [Amdahl](https://en.wikipedia.org/wiki/Amdahl_Corporation) 5890-300E, we found that it spent over 75 minutes in the System V C preprocessor! Besides showing that the -standard System V cpp is slow, it showed that it contained a memory usage +standard System V `cpp` is slow, it showed that it contained a memory usage problem. The [applin.c](applin.c) only uses 29 different preprocessor symbols (besides `stdio.h`) and yet the preprocessor ran out of space! -The GNU C preprocessor took less than 45 seconds to perform the 2nd pass -on the Amdahl 5890-300E. But due to the ANSI-likeness of GNU cpp (v. 1-21), +The GNU C preprocessor took under 45 seconds to perform the 2nd pass +on the Amdahl 5890-300E. But due to the ANSI-likeness of GNU `cpp` (v. 1-21), it was not able to cleanly substitute a symbol that began with a '#'. Clearly the GNU C preprocessor is faster. diff --git a/1988/dale/README.md b/1988/dale/README.md index 5ba311efe..35e49fa2b 100644 --- a/1988/dale/README.md +++ b/1988/dale/README.md @@ -1,6 +1,6 @@ # Best abuse of system calls -Paul Dale +Paul Dale
Australia ## To build: @@ -40,7 +40,8 @@ If you have an old enough compiler you can try the original version in make clobber alt ``` -Use `dale.alt` as you would `dale` above. +Use `dale.alt` as you would `dale` above. To understand the differences in more +detail, see [thanks-for-fixes.md](/thanks-for-fixes.md). ## Judges' remarks diff --git a/1988/isaak/README.md b/1988/isaak/README.md index f5b343693..a93747e76 100644 --- a/1988/isaak/README.md +++ b/1988/isaak/README.md @@ -1,11 +1,7 @@ # Best visuals -Mark Isaak -Imagen Corporation -2650 San Tomas Expy. -Santa Clara, CA -95052-8101 -US +Mark Isaak
+US ## To build: @@ -13,6 +9,10 @@ US make all ``` +There is an alternate version, the original, that can't be compiled in modern +systems but can be if you have an old enough compiler. See [Alternate +code](#alternate-code) below. + ## To run: ```sh @@ -29,28 +29,41 @@ The original entry starts with the line: ``` This works on some systems. Why? Note that `#include ` is given on -the last line. Why is this needed? Note the unusual calls to sprintf. +the last line. Why is this needed? Note the unusual calls to `sprintf(3)`. This version also relied on being able to define `#define` to something else and -using that macro for `#define`. This version will not likely work on modern -systems if you can even get it to compile. +using that macro for `#define`. +This version will not likely work on modern systems if you can even get it to +compile. + +#### To build: + +```sh +make alt +``` + +Use `isaak.alt` as you would `isaak` above. ## Judges' remarks: -NOTE: The program relies heavily on ASCII. Don't even think of running it on -an EBCDIC machine. If you named the file anything other than [isaak.c](isaak.c), -you had to change the `#include` on line 6. This limitation has been fixed by -using the `__FILE__` macro. +The program relies heavily on ASCII. Don't even think of running it on +an EBCDIC machine. + +### Historical notes about the original entry: + +NOTE: If you named the file anything other than [isaak.c](isaak.c), you had to +change the `#include` on line 6. This limitation has been fixed by using the +`__FILE__` macro. NOTE: The use of null comments to separate macros to construct different tokens from a single macro (e.g., `"O/**/O"` creates either `++` or `--` by defining `O` to be `+` or `-`) may cause some strict ANSI C preprocessors to object. NOTE: Most System V machines were not be able to execute this program correctly -due to the fact that BSD style systems have an sprintf() that returns a `char *`. -Due to the above problems, we placed the output of this program in the file: -isaak.encode. To read this file do: +due to the fact that BSD style systems have an `sprintf(3)` that returns a `char +*`. Due to the above problems, we placed the output of this program in the +file: isaak.encode. To read this file do. ```sh uudecode < isaak.encode @@ -58,7 +71,7 @@ cat isaak.output ``` Since this was fixed, this file is not strictly necessary. See the -[isaak.orig.c](isaak.orig.c) for the original source. +[isaak.alt.c](isaak.alt.c) for the original source. FYI: We are likely to be more strict about portability in the future. diff --git a/1988/litmaath/README.md b/1988/litmaath/README.md index 0e801e4ca..9e57ad8cd 100644 --- a/1988/litmaath/README.md +++ b/1988/litmaath/README.md @@ -1,6 +1,6 @@ # Best small program -Maarten Litmaath +Maarten Litmaath
The Netherlands ## To build: @@ -15,7 +15,8 @@ make ./litmaath some text ``` -There is an alternate version provided. See the Alternate code section below. +There is an alternate version provided. See the [Alternate +code](#alternate-code) section below. ## Try: @@ -25,9 +26,13 @@ There is an alternate version provided. See the Alternate code section below. ### Alternate code: -[Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) added the -[litmaath.alt.c](litmaath.alt.c) which we described in our remarks below. To -use: + +This alternate code, added to help understand the entry and for fun, is code +that we suggested at the time of the entry publication but which we never put in +a file. + +#### To build: + ```sh make alt @@ -35,7 +40,11 @@ make alt Use `litmaath.alt` as you would `litmaath` above. -Thank you Cody! +#### Try: + +```sh +./litmaath.alt six was afraid of seven because seven eight nine +``` ## Judges' remarks: @@ -50,10 +59,12 @@ while () Did you notice that the body is empty? +Furthermore, it's interesting to note that only two variables are +used to achieve everything. The best one can do to understand how the program works is to give it two small strings as arguments, and follow the program closely. One -could make the body of the 'while' loop an 'fprintf' with interesting +could make the body of the `while` loop an `fprintf` with interesting variables like: @@ -64,15 +75,13 @@ fprintf(stderr, (long) argv[1], argv[1] && *argv[1] ? *argv[1] : '@', argc); ``` +... which is what the [alternate code](#alternate-code) is. -Furthermore, it's interesting to note that only two variables are -used to achieve everything. ## Author's remarks: No remarks were provided by the author. - ## Copyright and CC BY-SA 4.0 License: This file is Copyright (c) 2023 by Landon Curt Noll. All Rights Reserved. diff --git a/1988/phillipps/README.md b/1988/phillipps/README.md index 5340c1e6f..8f410d3ce 100644 --- a/1988/phillipps/README.md +++ b/1988/phillipps/README.md @@ -1,12 +1,7 @@ # Least likely to compile successfully -Ian Phillipps -Cambridge Consultants Ltd -Science Park -Milton Road -Cambridge CB4 4DW -England - +Ian Phillipps
+UK ## To build: diff --git a/1988/phillipps/phillipps.c b/1988/phillipps/phillipps.c index 9b6832545..bb0d506f0 100644 --- a/1988/phillipps/phillipps.c +++ b/1988/phillipps/phillipps.c @@ -51,4 +51,13 @@ pain(0, pain(-61,*a, "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry") ,a+1);} -main(int t,char **_,char **a){return pain(t,(int)_,(char *)a);} +main(t,_,a ) +char +** +_, +** +a; +{ + return! +pain(t,(int)_, +(char *)a);} diff --git a/1988/reddy/README.md b/1988/reddy/README.md index 2d4347270..bcdc3baf6 100644 --- a/1988/reddy/README.md +++ b/1988/reddy/README.md @@ -1,10 +1,7 @@ # Most useful Obfuscated C program -Amperif Corporation -9232 Eton Avenue -Chatsworth, CA -91311 -U.S.A. +Gopi Reddy
+US ## To build: @@ -19,8 +16,16 @@ make all ```sh ./reddy char *(*(fun[16])(); +char *(*(*(*(*(*fun[32])))))(); ``` +What happens if you input: + +``` +char *(*(*(*(*(*fun[32])))))()); +``` + +? What can you do about it? ## Judges' remarks: diff --git a/1988/robison/README.md b/1988/robison/README.md index 8e59ddfea..5af451ca9 100644 --- a/1988/robison/README.md +++ b/1988/robison/README.md @@ -1,10 +1,6 @@ # Best abuse of C constructs -Arch D. Robison -University of Illinois at Urbana-Champaign -1304 W. Springfield Ave. -Urbana IL -61801 +Arch D. Robison
US ## To build: @@ -46,9 +42,9 @@ not take a while to execute? ## Author's remarks: This program shows that C has many unnecessary constructs, in fact -only "while","--", and ">=" are required. (The two assignments at -the beginning could be avoided if "atoi" was rewritten with this -new paradigm.) Note that the lack of both the controversial "goto" +only `while`,`--`, and `>=` are required. (The two assignments at +the beginning could be avoided if `atoi(3)` was rewritten with this +new paradigm.) Note that the lack of both the controversial `goto` and assignment statements makes the meaning crystal clear. The current ANSI committee should look into this practical simplification of C. diff --git a/1988/spinellis/README.md b/1988/spinellis/README.md index d92fefa1f..2aa122781 100644 --- a/1988/spinellis/README.md +++ b/1988/spinellis/README.md @@ -1,8 +1,8 @@ # Best abuse of the rules -Diomidis Spinellis -Greece - +Diomidis Spinellis
+GR
+
Mastodon: ## To build: @@ -46,7 +46,7 @@ be compiled from within a Makefile without the need of human intervention. ## Author's remarks: This program can be configured to do almost everything. The configuration is -done during compile time by typing in, C code, that one would like the program +done during compile time by typing in C code that one would like the program to perform. A trivial example is given in the `how to compile' section but the possibilities are clearly limited only by your imagination and programming skills. diff --git a/1988/westley/README.md b/1988/westley/README.md index cea7c3418..9aa04f881 100644 --- a/1988/westley/README.md +++ b/1988/westley/README.md @@ -10,8 +10,8 @@ US make all ``` -NOTE: this version is a fixed version for modern C compilers. See the Alternate -code section below for how to use the original. +NOTE: this version is a fixed version for modern C compilers. See the [Alternate +code](#alternate-code) section below for how to use the original. ## Try: @@ -20,6 +20,14 @@ code section below for how to use the original. ./westley ``` +Also try: + +```sh +./demo.sh +``` + +to show the code with followed by the result so you can truly see the magic. + ## Judges' remarks: Your compiler must parse diff --git a/1988/westley/demo.sh b/1988/westley/demo.sh new file mode 100755 index 000000000..b14f9975e --- /dev/null +++ b/1988/westley/demo.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +clear +echo "$ cat westley.c" +cat westley.c + +sleep 1 + +echo "$ cc westley.c -o westley" +cc -std=gnu89 -Wno-error -Wno-implicit-function-declaration -Wno-return-type -O3 westley.c -o westley || exit 1 + +echo "$ ./westley" +./westley + +echo diff --git a/thanks-for-fixes.md b/thanks-for-fixes.md index 2b90d3c5a..2f5a6d2ca 100644 --- a/thanks-for-fixes.md +++ b/thanks-for-fixes.md @@ -11,28 +11,28 @@ contributed thousands, that we wish to thank. We call out the extensive contributions of [Cody Boone Ferguson](https://www.ioccc.org/winners.html#Cody_Boone_Ferguson) who is -responsible for many of the improvements including many, many **very complicated -bug fixes** such as [2001/anonymous](2001/anonymous/README.md) and -[2004/burley](2004/burley/README.md), making entries not require -`-traditional-cpp` (which are **very complicated fixes**), fixing entries to -compile with clang, fixing entries to work with macOS (some of which are **very -complicated** such as [1998/schweikh1](1998/schweikh1/README.md)), fixing code -to work with both 32-bit and 64-bit (such as -[2001/herrmann2](2001/herrmann2/README.md)) which *can be* **quite complicated -too** (though not always even if it seems it), providing alternate code where -useful or necessary, fixing where possible dead links and otherwise removing -them, typo and consistency fixes, improving **ALL _Makefiles_** and writing the -[sgit tool](https://github.com/xexyl/sgit) that we installed locally and have -used to easily run `sed` on files in the repository to help build the website. -Thank you **very much** for your extensive efforts in helping improve the IOCCC -presentation of past IOCCC winners and making many many past entries work with -modern systems! +responsible for many of the improvements including many **very complicated bug +fixes** like [1988/phillipps](1988/phillipps/README.md), +[2001/anonymous](2001/anonymous/README.md) and +[2004/burley](2004/burley/README.md), making entries like +[1986/wall](1986/wall/README.md) not require `-traditional-cpp` (all **very +complicated fixes**), fixing entries to compile with clang, porting entries to +macOS, some being **very complicated** like +[1998/schweikh1](1998/schweikh1/README.md), fixing code like +[2001/herrmann2](2001/herrmann2/README.md) to work in both 32-bit/64-bit which +*can be* **very complicated**, providing alternate code where useful/necessary, +fixing where possible dead links or removing them, typo/consistency fixes, +improving **ALL _Makefiles_** and writing [sgit](https://github.com/xexyl/sgit) +that we installed locally to easily run `sed` on files in the repo to help build +the website. **Thank you very much** for your extensive efforts in helping +improve the IOCCC presentation of past IOCCC winners and fixing almost all past +entries for modern systems! [Yusuke Endoh](https://www.ioccc.org/winners.html#Yusuke_Endoh) supplied a number of important bug fixes to a number of past IOCCC winners. Some of those fixes were **very technically challenging** such as [1989/robison](1989/robison/README.md), [1990/cmills](1990/cmills/README.md), -[1992/lush](1992/lush/README.md) and [2001/ctk](2001/ctk/README.md). Thank you **very +[1992/lush](1992/lush/README.md) and [2001/ctk](2001/ctk/README.md). **Thank you very much** for your help! A good number of the [past winners of the @@ -127,6 +127,10 @@ char x {sizeof( and changing the type of `k` to be an `int`. +Additionally, because of the `#define union static struct` there is no need to +have in the code `static struct` as we can have it like the original code which +has it as `union`. + Originally Yusuke supplied a patch so that this entry would compile with gcc - but not clang - or at least some versions. @@ -262,15 +266,16 @@ noted earlier, very complicated, but we encourage you to look at [original code](1986/wall/wall.orig.c) to see how different C was in 1986. Yusuke originally patched this to use `strdup()` on two strings and this let it -work with gcc but it still requires `-traditional-cpp`. The [alternate +work with gcc but it still required `-traditional-cpp`. The [alternate code](1986/wall/wall.alt.c) is the version patched by Yusuke should you wish to -try it with a compiler that has the `-traditional-cpp`. +try it with a compiler that has the `-traditional-cpp`. See the README.md file +for details. If you'd like to see the difference between the version that requires `-traditional-cpp` and the fixed version, try: ```sh -git diff 82cbf069a781d64802fc59b36778c0b02be4043e..a74abb69b7e9b87e305b529941bf46f97ffff341 1986/wall/wall.c +diff 1986/wall/wall.alt.c 1986/wall/wall.c ``` ## [1987/heckbert](1987/heckbert/heckbert.c) ([README.md](1987/heckbert/README.md)) @@ -283,6 +288,12 @@ of `strings.h` and because it's identical in use to `strchr(3)` (and we noted that for System V we had to do this) Cody added to the Makefile `-Dindex=strchr`. +## [1987/lievaart](1987/lievaart/lievaart.c) ([README.md](1987/lievaart/README.md)) + +Cody made this ever so slightly like the original code by adding back the +`#define D define` even though it's unused. This was done for both versions as +well (the one with the board and the one without, the entry itself with the +limitations of the contest). ## [1987/wall](1987/wall/wall.c) ([README.md](1987/wall/README.md])) @@ -301,8 +312,15 @@ the code can refer to `gets()` instead. Cody fixed this for modern systems. The problem was `'assignment to cast is illegal, lvalue casts are not supported'`. For the original file see the -README.md file. +README.md file. Unfortunately this ruins some symmetry. To try and resolve this +as much as possible at first code was commented out but later on the commented +out code was removed and another part changed so that, although it has some code +no longer there, it has a closer match in symmetry and since the code was +commented out it's probably not a big deal to have it removed instead as it does +look more symmetrical now. +Cody also added to the Makefile `-include stdio.h` in the nowadays very +unlikely(?) but nevertheless suggested case that `putchar()` is not available. ## [1988/dale](1988/dale/dale.c) ([README.md](1988/dale/README.md])) @@ -351,7 +369,7 @@ for/*/(;;);/*/k()){O/*/*/c); ``` cannot form `fork())` in modern C compilers. Since it was not done through a -macro it was simply changed to be 'fork()', rather than adding a new macro. +macro it was simply changed to be `fork()`, rather than adding a new macro. (What is quite fun is that at least some C pre-processors can form these constructs! Can you figure out why this is?) @@ -361,16 +379,19 @@ modern compilers do not allow directives like: ```c #define _ define -+#_ P char -+#_ p int -+#_ O close( -... +#_ P char +#_ p int +#_ O close( +/* ... */ ``` so Cody changed the lines to be in the form of: ```c -#define foo bar +#define P char +#define p int +#define O close( +/* ... */ ``` However, to keep the entry as close to as possible in look, Cody kept the `_` @@ -387,31 +408,46 @@ function, a redefinition of `exit()`, was not being called in main(). The original version is in [1988/isaak/isaak.alt.c](1988/isaak/isaak.alt.c). See the README.md file for more details. +## [1988/litmaath](1988/litmaath/litmaath.c) ([README.md](1988/litmaath/README.md)) + +Cody added the alt code which is code that we suggested at the time of +publication, in the remarks, to help understand the entry, and for fun. ## [1988/phillipps](1988/phillipps/phillipps.c) ([README.md](1988/phillipps/README.md])) Cody fixed this for modern systems. It did not compile with clang because it requires the second and third args of `main()` to be `char **` but even before -that with gcc it printed random characters. After fixing it for clang by -changing `main()` to call the new function `pain()` (chosen because it's a pain -that clang requires these args to be `char **` :-) ) with the correct args it -now works. +that with gcc it printed random characters. + +After fixing it for clang by changing `main()` to call the new function `pain()` +(chosen because it's a pain that clang requires these args to be `char **` :-) ) +with the correct args it now works with gcc and clang. + +Later Cody improved the fix to make it look a bit more like the original, using +K&R style functions, and trying to match the format as best as possible of what +`main()` used to look like but without the full body that cannot exist as it +once did. The format of `pain()` is exactly like how `main()` was as it's the +same code. Additionally, `main()` returns `!pain(...)` like `main()` used to do +to itself and `pain()` does now. ## [1988/reddy](1988/reddy/reddy.c) ([README.md](1988/reddy/README.md)) Cody made this use `fgets()` to prevent annoying warnings during compiling, linking and runtime, the latter of which being the most annoying. +Cody also restored the name of the winner in the README.md file that was missing +by some crazy chance. ## [1988/spinellis](1988/spinellis/spinellis.c) ([README.md](1988/spinellis/README.md])) Cody provided an [alternate version](1988/spinellis/spinellis.alt.c) so that this will work with compilers like clang. An alternate version had to be -provided because not doing so would be tampering with the file too much. It -would work but it would not show the same creativity. The original file exploits -a fun mis-feature that works with gcc but not clang. This resulted in a change -of rules which is another reason to not modify the original. See the README.md -file for details on the alternate code. +provided because not doing so would be tampering with the entry too much. It +would work but it would not show the same creativity and cleverness. + +The original entry exploits a fun mis-feature that works with gcc but not clang. +This resulted in a change of rules which is another reason to not modify the +original. See the README.md file for details on the alternate code. Meanwhile Cody was twisted enough to point out (though to be fair he felt sick doing this) that with a slight modification this entry can be C++ instead. We don't @@ -425,6 +461,9 @@ was fixed by Misha Dynin, based on the judges' remarks, so that this would work with modern C compilers. We encourage you to try the alternate version to see what happens with current compilers! See the README.md files for details. +Cody added the [demo.sh](1988/westley/demo.sh) script to show the magic of the +entry as seeing the code with the result at once is far more beautiful. + ## [1989/fubar](1989/fubar/fubar.c) ([README.md](1989/fubar/README.md])) @@ -458,9 +497,9 @@ author's remarks. See the README.md for details. ## [1989/paul](1989/paul/paul.c) ([README.md](1989/paul/README.md])) -Cody fixed a segfault under macOS. The problem was that the int (from `#define -f`) should be a long. This became apparent when he was using lldb and saw that -the type of a pointer was too `long` :-) +Cody fixed a segfault under macOS that prevented it from working. The problem +was that the int (from `#define f`) should be a long. This became apparent when +he was using lldb and saw that the type of a pointer was too `long` :-) ## [1989/robison](1989/robison/robison.c) ([README.md](1989/robison/README.md]))