fix Makefile and README.md for 2001/rosten

This commit is contained in:
Landon Curt Noll committed 2023-03-21 16:02:52 -07:00
1 parent 7630f0b135
commit c181c0446a
2 files changed
+363 -261

No files matched your search

+261 -169
View File
@@ -1,18 +1,9 @@
#!/usr/bin/env make
#
# IOCCC 2001 entry Makefile
# IOCCC 2001 winning entry - rosten
################################################################################
#
# An Historical Makefile NOTE:
#
# The orig.Makefile, if it exits, is the original Makefile before this IOCCC
# year directory was reworked so that entries are in separate directories.
# This also applies to any orig.ansi.mk and orig.common.mk files.
#
# Several Makefiles were modified / formed in 2022, and as such it may have
# elements that are not historically compatible with way entries were built.
#
# Regarding individual entries:
#
# IOCCC winning entry code may not work on your system. Even with standards,
@@ -45,192 +36,293 @@
# See: http://creativecommons.org/licenses/by-sa/3.0/
SHELL= /bin/sh
CAT= cat
RM= rm
SED= sed
TRUE= true
#CINCLUDE= -I ${HOMEBREW_PREFIX}/include/SDL2
# optimization
#############################
# shell used by this Makefile
#############################
#
# Most compiles will safely use -O2. Some can use only -O.
# A few compilers have broken optimizers and thus you may
# not want anything.
SHELL= bash
#######################
# common tool locations
#######################
#
include ../../var.mk
# Set X11_LIBDIR to the directory where the X11 library resides
#
#X11_LIBDIR= /usr/X11R6/lib
#X11_LIBDIR= /usr/X11/lib
X11_LIBDIR= /opt/X11/lib
# Set X11_INCLUDEDIR to the directory where the X11 include files reside
#
#X11_INCDIR= /usr/X11R6/include
#X11_INCDIR= /usr/X11/include
X11_INCDIR= /opt/X11/include
# Common C compiler warnings to silence
#
#CSILENCE=
CSILENCE= -Wno-logical-op-parentheses -Wno-parentheses -Wno-unused-value
# Common C compiler warning flags
#
#CWARN= ${CSILENCE}
#CWARN= -Wall ${CSILENCE}
#CWARN= -Wall -Wextra ${CSILENCE}
CWARN= -Wall -Wextra -pedantic ${CSILENCE}
# Compiler standard
#
#CSTD=
#CSTD= -ansi
CSTD= -std=gnu99
# Compiler bit architecture
#
# Some entries require 32-bitness:
# ARCH= -m32
#
# Some entries require 64-bitness:
# ARCH= -m64
#
# By default we assume nothing:
#
ARCH=
# Defines that are needed to compile
#
CDEFINE=
#CDEFINE= -DIOCCC
# Include files that are needed to compile
#
#CINCLUDE=
#CINCLUDE= -include stdlib.h
#CINCLUDE= -include stdio.h
#CINCLUDE= -include stdlib.h -include stdio.h
CINCLUDE= -I ${X11_INCDIR} -I ${X11_INCDIR}/X11
#CINCLUDE= `${SDL2_CONFIG} --cflags`
# Optimization
#
# Most compiles will safely use -O2. Some can use only -O1 or -O.
# A few compilers have broken optimizers or this entry make break
# under those buggy optimizers and thus you may not want anything.
# Reasonable compilers will allow for -O3.
#
#OPT=
#OPT= -O
OPT= -O2
#OPT= -O1
#OPT= -O2
OPT= -O3
# flags for ANSI compiles
# Default flags for ANSI C compilation
#
# NOTE: Some ANSI compilers make use of -Xa to turn on ANSI mode,
# others such as gcc may want -ansi, others (Compaq Tru64 Unix)
# want -std1, and others may want nothing at all.
# Adjust the CFLAGS line as needed.
#
# NOTE: Some compilers cannot optimize, or optimize some entries
# incorrectly. You might want to turn on -O to see if your
# compiler can handle them.
#
#
#CFLAGS= -Xa ${OPT}
#CFLAGS= -std1 $(OPT)
CFLAGS= -ansi ${OPT}
CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT}
# NOTE: On some systems, the library path does not include the location
# of the X11 libraries. You might need to use a -L/path/to/X11/lib/dir
# in order to compile with these libs.
# Libraries needed to build
#
X11CCFLAGS= -I/usr/X11R6/include -I/usr/X11R6/include/X11 -I/usr/include/X11
#X11CCFLAGS=
X11LDFLAGS= -L/usr/X11R6/lib -Wl,-R/usr/X11R6/lib
#X11LDFLAGS=
#LIBS=
#LIBS= -lm
LIBS= -L ${X11_LIBDIR} -lX11
#LIBS= `${SDL2_CONFIG} --libs`
# ANSI compiler
#
# Set CC to the name of your ANSI compiler.
#
# Some entries seem to need gcc. If you have gcc, set
# both CC and MAY_NEED_GCC to gcc.
#
# If you do not have gcc, set CC to the name of your ANSI compiler, and
# set MAY_NEED_GCC to either ${CC} (and hope for the best) or to just :
# to disable such programs.
# C compiler to use
#
CC= cc
MAY_NEED_GCC= gcc
#CC=clang
#CC=gcc
# winners that compile under ANSI C
# Compiler add-ons or replacements for clang only
#
WINNERS= anonymous bellard bellard.otccex cheong coupard \
ctk dgbeards herrmann1 herrmann2 jason kev ollinger rosten \
schweikh westley williams
ALT_NAMES= westley.orig
DATA_FILES= anonymous_files bellard_files herrmann1_files herrmann2_files
all: ${WINNERS}
# Most likely to amaze
ifeq ($(CC),clang)
#
anonymous: anonymous.c
magic='${MAY_NEED_GCC} -O1'; \
X='-DA(X)=#X'; \
warning='-pedantic -Dprocessor'; \
$$magic $$warning -Dmagic= $$X "-DX=A($$magic \"$$X\")" \
-o anonymous anonymous.c
anonymous_files: anonymous.ten.c
# Best abuse of the rules
CSILENCE+= -Wno-comma -Wno-double-promotion -Wno-float-conversion -Wno-float-equal \
-Wno-implicit-float-conversion -Wno-missing-prototypes \
-Wno-missing-variable-declarations -Wno-poison-system-directories \
-Wno-sign-conversion -Wno-strict-prototypes -Wno-unreachable-code
#
bellard: bellard.c
${CC} -rdynamic ${CFLAGS} bellard.c -o bellard -ldl
bellard_files: bellard.otccex.c
# Best short program
CWARN+= -Weverything
#
cheong: cheong.c
${CC} ${CFLAGS} cheong.c -o cheong
endif
# Most obfuscated sound
# Specific add-ons or replacements for gcc only
#
coupard: coupard.c
${CC} ${CFLAGS} -o coupard coupard.c
# Worst Driver
ifeq ($(CC),gcc)
#
ctk: ctk.c
${CC} ${CFLAGS} -o ctk ctk.c
# Worst AI
#CSILENCE+=
#
dgbeards: dgbeards.c
${CC} ${CFLAGS} -DE=break -DF=char -DK=case -DP=int -DR=return \
-DI=0xFFFF dgbeards.c -o dgbeards
# Best abuse of the C preprocessor
#CWARN+=
#
herrmann1: herrmann1.c herrmann1.sh
@echo "NOTE: $@ must be built/run using the script $@.sh"
${SHELL} ./herrmann1.sh
endif
herrmann1_files: herrmann1.gcd herrmann1.sh herrmann1.times2
# Most eye-crossing
##############################
# Special flags for this entry
##############################
#
# This entry requires the GCC -include feature.
ENTRY= rosten
PROG= ${ENTRY}
#
herrmann2: herrmann2.c
${MAY_NEED_GCC} ${CFLAGS} herrmann2.c -o herrmann2 \
-include /usr/include/stdlib.h -include /usr/include/stdio.h \
-include /usr/include/time.h -include /usr/include/unistd.h
herrmann2_files: herrmann2.cup herrmann2.ioccc
# Best Of Show
OBJ= ${PROG}.o
DATA=
TARGET= ${PROG}
#
jason: jason.c
${CC} ${CFLAGS} -o jason jason.c
ALT_OBJ=
ALT_TARGET=
# Best Curses Game
#################
# build the entry
#################
#
kev: kev.c
${CC} ${CFLAGS} -DPORT=5455 -DSPEED=50 -o kev kev.c \
-lcurses -ltermcap \
-Dl_="socket(il.sin_family=AF_INET,SOCK_STREAM,0)"
# Best primal ASCII graphics
#
ollinger: ollinger.c
${CC} ${CFLAGS} ollinger.c -o ollinger
# Best abuse of the user
#
rosten: rosten.c
${CC} ${CFLAGS} rosten.c ${X11CCFLAGS} ${X11LDFLAGS} -pedantic -lX11 \
-o rosten
# Best one-liner
#
schweikh: schweikh.c
${CC} ${CFLAGS} schweikh.c -o schweikh
# Best position-independant code
#
westley: westley.c
${CC} ${CFLAGS} westley.c -o westley
westley.orig: westley.orig.c
${CC} ${CFLAGS} westley.orig.c -o westley.orig
# Best position-independant code
#
williams: williams.c
${CC} williams.c ${X11CCFLAGS} ${X11LDFLAGS} -lX11 -o williams
everything: ${WINNERS} ${ALT_NAMES} ${DATA_FILES}
love:
@echo 'not war?'
haste:
${MAKE} waste
waste:
@echo 'waste'
clean:
${RM} -f *.o a.out core ${WINNERS}
clobber: clean
${RM} -f ${WINNERS}
${RM} -f ${ALT_NAMES}
nuke: clobber
all: data ${TARGET}
@${TRUE}
install: all
${CAT} ${WINNERS} ${ALT_NAMES} > /dev/null
.PHONY: all alt data everything clean clobber install \
love haste waste maker easter_egg sandwich \
supernova deep_magic magic charon pluto
${PROG}: ${PROG}.c
${CC} ${CFLAGS} $< -o $@ ${LIBS}
# alternative executable
#
alt: data ${ALT_TARGET}
@${TRUE}
# data files
#
data: ${DATA}
@${TRUE}
# both all and alt
#
everything: all alt
###############
# utility rules
###############
#
clean:
${RM} -f ${OBJ} ${ALT_OBJ}
@-if [ -f indent.c ]; then \
echo ${RM} -f indent.c; \
${RM} -f indent.c; \
fi
clobber: clean
${RM} -f ${TARGET} ${ALT_TARGET}
@-if [ -e sandwich ]; then \
${RM} -f sandwich; \
echo 'ate sandwich'; \
fi
install:
@echo "Dr. Spock says that is not logical!"
@${TRUE}
# you may be able to misunderstand the source by reading indent.c
#
indent.c: ${PROG}.c
@if which "${GINDENT}" >/dev/null 2>&1; then \
echo ${RM} -f $@; \
${RM} -f $@; \
echo "${GINDENT} < $< > $@"; \
${GINDENT} < $< > $@; \
elif which "${INDENT}" >/dev/null 2>&1; then \
echo ${RM} -f $@; \
${RM} -f $@; \
echo "${INDENT} < $< > $@"; \
${INDENT} < $< > $@; \
else \
echo "no intent tool found, ident $< yourself, sorry"; \
echo "exit 1"; \
exit 1; \
fi
##################
# 133t hacker rulz
##################
#
love:
@echo 'not war?'
@${TRUE}
haste:
$(MAKE) waste
@${TRUE}
waste:
@echo 'haste'
@${TRUE}
maker:
@echo 'Participate in a maker faire'
@${TRUE}
easter_egg:
@echo "you expected to often misunderstand this $${RANDOM} magic"
@echo "chongo '<was here>' /\\oo/\\"
@echo "Eggy"
sandwich: easter_egg
@if [ `id -u` -eq 0 ]; then \
echo 'Okay.'; \
echo "$${RANDOM}`date +%s`$${RANDOM}" > $@; \
else \
echo 'What? Make it yourself.'; \
exit 1; \
fi
# Understand the history of the Homebrew Computer Club
# as well as the West Coast Computer Faire and
# you might be confused different. :-)
#
supernova: sandwich
@-if [ -r .code_anal ]; then \
${RM} -f .code_anal_v6; \
else \
echo "planet deniers, like some members of the IAU, are so cute when they try to defend their logic"; \
fi
@echo "A $@ helps ${MAKE} the elements that help form planets"
@${TRUE}
deep_magic: supernova
@-if [ -r .code_anal ]; then \
ccode_analysis --deep_magic 7889066cdbdf09b0408021754586e895be641cc9be29e7eafd3ca65359541f17 \
--FNV1a_hash_512_bit -v2 "${PROG}" "${PROG}.c"; \
else \
echo "Wrong! Do it again!"; \
sleep 2; \
echo "Wrong! Do it again!"; \
sleep 2; \
echo "Wrong! Do it again!"; \
fi
@${TRUE}
magic: deep_magic
@-if [ -r .code_anal ]; then \
ccode_analysis --level 20003 --mode 5717175 --FNV1a_hash_512_bit -v2 "${PROG}" "${PROG}.c"; \
else \
echo "If you don't eat yer meat, you can't have any pudding!"; \
echo "How can you have any pudding if you don't eat yer meat?!"; \
fi
@${TRUE}
# The IOCCC resident astronomer states
#
charon: magic
@echo "$@ is a dwarf planet"
@echo "dwarf is a type of planet"
@echo "therefore IAU, $@ is a planet"
pluto: charon
${MAKE} charon
@echo "$@ is a dwarf planet"
@echo "dwarf is a type of planet"
@echo "therefore, $@ is a planet"
@echo "having lots of planets is good feature because supernovae can help ${MAKE} a lot of them"
+102 -92
View File
@@ -1,4 +1,4 @@
Best abuse of the user:
# Best abuse of the user:
Edward Rosten
Oxford University
@@ -10,134 +10,144 @@ Best abuse of the user:
http://users.ox.ac.uk/~scat1148
# To build:
Judges' Comments:
```sh
make
```
To build:
### To run:
make rosten
```sh
./rosten number
```
Try:
### Try:
./rosten 1.03
./rosten 1.00
```sh
./rosten 1.03
./rosten 1.00
```
For some abuse, try:
For some abuse, try:
./rosten 0.99
```sh
./rosten 0.99
```
Friction can be your friend if it does not rub you (or your mouse
cursor) in the wrong way. :-)
## Judges' comments:
Friction can be your friend if it does not rub you (or your mouse
cursor) in the wrong way. :-)
## Author's comments:
NAME
rosten - make the mouse act as if it has been greased
SYNOPSIS
rosten [greasiness]
Selected Author's Comments:
DESCRIPTION
NAME
This program is designed primarily to make your X windows interface more
obfuscated. Try doing something mouse driven (such as using a mouse
driven editor on this program) whilst it is running. If you're not sure
what it does, looking at the code should give a fair idea.
rosten - make the mouse act as if it has been greased
SYNOPSIS
rosten [greasiness]
It also has a [cat] man page if you want to install it as a `utility'.
DESCRIPTION
OPTIONS
This program is designed primarily to make your X windows interface more
obfuscated. Try doing something mouse driven (such as using a mouse
driven editor on this program) whilst it is running. If you're not sure
what it does, looking at the code should give a fair idea.
It only takes one optional option: the greasiness factor. This is the
number that the speed is divided by on each iteration. The default is
1.03. A setting of 1 (no friction is fun), as is 0.99.
It also has a [cat] man page if you want to install it as a `utility'.
Being an X program, it recognised the DISPLAY variable.
OPTIONS
PORTABILITY
It only takes one optional option: the greasiness factor. This is the
number that the speed is divided by on each iteration. The default is
1.03. A setting of 1 (no friction is fun), as is 0.99.
Being an X program, it recognised the DISPLAY variable.
The program is very portable, even to non X architectures. All that is
required is a large desk and some good grease.
PORTABILITY
COMMENTS
The program is very portable, even to non X architectures. All that is
required is a large desk and some good grease.
It is really rather surprising that code like this should not only be
portable, but compile with almost no warnings on most of the compilers
tested. It's a kind of shame that none of the compilers do anything
like this:
$make greasymouse
cc greasymouse.c -o greasymouse -lX11
greasymouse.c:30: This macro should have more text and spaces in it
greasymouse.c:32: This is a really stupid way to perform this operation
greasymouse.c:42: This program would look better with a newline here
greasymouse.c:48: That's a really silly thing to do
greasymouse.c:55: So is that
...
greasymouse.c:58: This program is rubbish. I'm not going to link it.
The code is best viewed with tabstops every 8 spaces.
COMMENTS
BUGS
It is really rather surprising that code like this should not only be
portable, but compile with almost no warnings on most of the compilers
tested. It's a kind of shame that none of the compilers do anything
like this:
The mouse gets stuck completely if you give it an option of less
than 1 and leave it for too long. This is quite annoying if it
didn't leave the terminal if was run from in focus.
$make greasymouse
cc greasymouse.c -o greasymouse -lX11
greasymouse.c:30: This macro should have more text and spaces in it
greasymouse.c:32: This is a really stupid way to perform this operation
greasymouse.c:42: This program would look better with a newline here
greasymouse.c:48: That's a really silly thing to do
greasymouse.c:55: So is that
...
greasymouse.c:58: This program is rubbish. I'm not going to link it.
It gets very jerky if the processor is being used. There are
better time functions than clock() but I haven't used them.
The code is best viewed with tabstops every 8 spaces.
It deflects slightly when it gets very slow.
It annoys other people if you run it on their display too
often. Maybe I should make future versions print funny jokes to
keep the humor fresh.
It's pretty ropey over a 56K modem.
It's even ropier over a 56K modem and tunneled through 3 ssh links.
BUGS
WARNINGS
The mouse gets stuck completely if you give it an option of less
than 1 and leave it for too long. This is quite annoying if it
didn't leave the terminal if was run from in focus.
Pages and pages and pages of things, with GCC at any rate.
It gets very jerky if the processor is being used. There are
better time functions than clock() but I haven't used them.
It suggests loads of ()'s where they're not needed.
It deflects slightly when it gets very slow.
It reckons I have not used some of the values I have computed. I
would never do a thing like that: I just haven't used them in
the way it's used to.
It annoys other people if you run it on their display too
often. Maybe I should make future versions print funny jokes to
keep the humor fresh.
The MIPS compiler suggests an == instead of an = in expressions
such as:
It's pretty ropey over a 56K modem.
&&(a=b)
It's even ropier over a 56K modem and tunneled through 3 ssh links.
but I its suggestions would break my program. It also reckons
that r() has no prototype.
Giving the -pedantic option to the MIPS compiler causes it to generate
warnings about its own header files, but not any extra ones with this
program.
With all warnings enabled, the DEC compiler, oddly enough finds some
problems with its own include files, but none with my program.
WARNINGS
ERRORS
Pages and pages and pages of things, with GCC at any rate.
The DEC compiler of this version:
It suggests loads of ()'s where they're not needed.
DEC C V5.6-079 on Digital UNIX V4.0 (Rev. 878)
It reckons I have not used some of the values I have computed. I
would never do a thing like that: I just haven't used them in
the way it's used to.
The MIPS compiler suggests an == instead of an = in expressions
such as:
&&(a=b)
but I its suggestions would break my program. It also reckons
that r() has no prototype.
Giving the -pedantic option to the MIPS compiler causes it to generate
warnings about its own header files, but not any extra ones with this
program.
With all warnings enabled, the DEC compiler, oddly enough finds some
problems with its own include files, but none with my program.
ERRORS
The DEC compiler of this version:
DEC C V5.6-079 on Digital UNIX V4.0 (Rev. 878)
can't compile the code. It thinks that preprocessor lines can not have
whitespace preceding the #. Moving the preprocessor directives to the
beginning of the line wrecks the layout but makes it compile.
can't compile the code. It thinks that preprocessor lines can not have
whitespace preceding the #. Moving the preprocessor directives to the
beginning of the line wrecks the layout but makes it compile.