Merge pull request #1107 from xexyl/1988-phillipps-fix-update

Improve my fix to 1988/phillipps
This commit is contained in:
Landon Curt Noll authored and GitHub committed 2023-10-18 12:39:39 -07:00
commit 3b004b4514
25 files changed
+288 -162

No files matched your search

+1 -1
View File
@@ -21,7 +21,7 @@ int dup, signal;
goto _0;
_O: while (!(k['a'] <<= - dup)) { /*/*\*/
static struct tag u = {4};
union tag u x{4};
}
}
+5 -1
View File
@@ -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}
+6 -1
View File
@@ -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:
+6 -9
View File
@@ -1,10 +1,6 @@
# Worst Style
Spencer Hines
OnLine Computer Systems
4200 Farragut Street
Hyattsville, MD
20781
Spencer Hines<br>
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.
+15 -10
View File
@@ -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:
+27 -17
View File
@@ -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:
+1
View File
@@ -1,3 +1,4 @@
#define D define
#define Y return
#define R for
#define e while
+1
View File
@@ -1,3 +1,4 @@
#define D define
#define Y return
#define R for
#define e while
+7 -7
View File
@@ -1,6 +1,6 @@
# Most Useful Obfuscation
Larry Wall
Larry Wall<br>
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`.
+2 -2
View File
@@ -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
#
+2 -4
View File
@@ -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 <stdio.h>` 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.
+2 -2
View File
@@ -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;
+2 -2
View File
@@ -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
+26 -11
View File
@@ -1,7 +1,7 @@
# Best of show
Jack Applin
US
Jack Applin<br>
US<br>
<https://www.cs.colostate.edu/~applin/>
## 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.
+3 -2
View File
@@ -1,6 +1,6 @@
# Best abuse of system calls
Paul Dale
Paul Dale<br>
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
+30 -17
View File
@@ -1,11 +1,7 @@
# Best visuals
Mark Isaak
Imagen Corporation
2650 San Tomas Expy.
Santa Clara, CA
95052-8101
US
Mark Isaak<br>
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 <stdio.h>` 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.
+19 -10
View File
@@ -1,6 +1,6 @@
# Best small program
Maarten Litmaath
Maarten Litmaath<br>
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 (<condition>)
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.
+2 -7
View File
@@ -1,12 +1,7 @@
# Least likely to compile successfully
Ian Phillipps
Cambridge Consultants Ltd
Science Park
Milton Road
Cambridge CB4 4DW
England
Ian Phillipps<br>
UK
## To build:
+10 -1
View File
@@ -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);}
+10 -5
View File
@@ -1,10 +1,7 @@
# Most useful Obfuscated C program
Amperif Corporation
9232 Eton Avenue
Chatsworth, CA
91311
U.S.A.
Gopi Reddy<br>
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:
+4 -8
View File
@@ -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<br>
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.
+4 -4
View File
@@ -1,8 +1,8 @@
# Best abuse of the rules
Diomidis Spinellis
Greece
<https://www.spinellis.gr/>
Diomidis Spinellis<br>
GR<br>
<https://www.spinellis.gr/><br>
Mastodon: <https://mstdn.social/@DSpinellis>
## 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.
+10 -2
View File
@@ -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
+15
View File
@@ -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
+78 -39
View File
@@ -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]))