fix Makefile, README.md and bash script for 2001/herrmann1

This commit is contained in:
Landon Curt Noll committed 2023-03-17 15:11:42 -07:00
1 parent 7621291e2f
commit bad0cd868f
3 files changed
+295 -208

No files matched your search

+258 -169
View File
@@ -1,18 +1,9 @@
#!/usr/bin/env make #!/usr/bin/env make
# #
# IOCCC 2001 entry Makefile # IOCCC 2001 winning entry - herrmann1
################################################################################ ################################################################################
# #
# 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: # Regarding individual entries:
# #
# IOCCC winning entry code may not work on your system. Even with standards, # IOCCC winning entry code may not work on your system. Even with standards,
@@ -45,192 +36,290 @@
# See: http://creativecommons.org/licenses/by-sa/3.0/ # See: http://creativecommons.org/licenses/by-sa/3.0/
SHELL= /bin/sh #############################
CAT= cat # shell used by this Makefile
RM= rm #############################
SED= sed
TRUE= true
#CINCLUDE= -I ${HOMEBREW_PREFIX}/include/SDL2
# optimization
# #
# Most compiles will safely use -O2. Some can use only -O. SHELL= bash
# A few compilers have broken optimizers and thus you may
# not want anything. #######################
# 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-implicit-int
# 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=
#OPT= -O #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, CFLAGS= ${CSTD} ${CWARN} ${ARCH} ${CDEFINE} ${CINCLUDE} ${OPT}
# 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}
# NOTE: On some systems, the library path does not include the location # Libraries needed to build
# of the X11 libraries. You might need to use a -L/path/to/X11/lib/dir
# in order to compile with these libs.
# #
X11CCFLAGS= -I/usr/X11R6/include -I/usr/X11R6/include/X11 -I/usr/include/X11 LIBS=
#X11CCFLAGS= #LIBS= -lm
X11LDFLAGS= -L/usr/X11R6/lib -Wl,-R/usr/X11R6/lib #LIBS= -L ${X11_LIBDIR} -lX11
#X11LDFLAGS= #LIBS= `${SDL2_CONFIG} --libs`
# ANSI compiler # C compiler to use
#
# 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.
# #
CC= cc 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 \ ifeq ($(CC),clang)
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
# #
anonymous: anonymous.c #CSILENCE+=
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
# #
bellard: bellard.c CWARN+= -Weverything
${CC} -rdynamic ${CFLAGS} bellard.c -o bellard -ldl
bellard_files: bellard.otccex.c
# Best short program
# #
cheong: cheong.c endif
${CC} ${CFLAGS} cheong.c -o cheong
# Most obfuscated sound # Specific add-ons or replacements for gcc only
# #
coupard: coupard.c ifeq ($(CC),gcc)
${CC} ${CFLAGS} -o coupard coupard.c
# Worst Driver
# #
ctk: ctk.c #CSILENCE+=
${CC} ${CFLAGS} -o ctk ctk.c
# Worst AI
# #
dgbeards: dgbeards.c #CWARN+=
${CC} ${CFLAGS} -DE=break -DF=char -DK=case -DP=int -DR=return \
-DI=0xFFFF dgbeards.c -o dgbeards
# Best abuse of the C preprocessor
# #
herrmann1: herrmann1.c herrmann1.sh endif
@echo "NOTE: $@ must be built/run using the script $@.sh"
${SHELL} ./herrmann1.sh
herrmann1_files: herrmann1.gcd herrmann1.sh herrmann1.times2
# Most eye-crossing ##############################
# Special flags for this entry
##############################
# #
# This entry requires the GCC -include feature. ENTRY= herrmann1
PROG= ${ENTRY}
# #
herrmann2: herrmann2.c OBJ= ${PROG}.o
${MAY_NEED_GCC} ${CFLAGS} herrmann2.c -o herrmann2 \ DATA= herrmann1.gcd herrmann1.sh herrmann1.times2
-include /usr/include/stdlib.h -include /usr/include/stdio.h \ TARGET= ${PROG}
-include /usr/include/time.h -include /usr/include/unistd.h
herrmann2_files: herrmann2.cup herrmann2.ioccc
# Best Of Show
# #
jason: jason.c ALT_OBJ=
${CC} ${CFLAGS} -o jason jason.c ALT_TARGET=
# Best Curses Game
#################
# build the entry
#################
# #
kev: kev.c all: data ${TARGET}
${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
@${TRUE} @${TRUE}
install: all .PHONY: all alt data everything clean clobber install \
${CAT} ${WINNERS} ${ALT_NAMES} > /dev/null love haste waste maker easter_egg sandwich \
supernova deep_magic magic charon pluto
${PROG}: ${PROG}.c ${PROG}.sh
${SHELL} ./herrmann1.sh
# 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"
+36 -38
View File
@@ -1,4 +1,4 @@
Best abuse of the C preprocessor: # Best abuse of the C preprocessor:
Immanuel Herrmann Immanuel Herrmann
University of Freiburg, Germany University of Freiburg, Germany
@@ -8,17 +8,31 @@ Best abuse of the C preprocessor:
http://pcpool.mathematik.uni-freiburg.de/~immi/ http://pcpool.mathematik.uni-freiburg.de/~immi/
# To build:
Judges' Comments: ```sh
make
```
To build: ### To run:
Running and building are combined for this entry. ```sh
./herrmann1.sh 'prg=file'
```
Try: ### Try:
```sh
./herrmann1.sh 'prg=herrmann1.times2' ./herrmann1.sh 'prg=herrmann1.times2'
```
-or- -or-
```sh
./herrmann1.sh 'prg=herrmann1.gcd' ./herrmann1.sh 'prg=herrmann1.gcd'
```
## Judges' comments:
There are some clear hints in the source code as to the There are some clear hints in the source code as to the
purpose of this program. Perhaps the only way to figure out what is purpose of this program. Perhaps the only way to figure out what is
@@ -26,8 +40,7 @@ Judges' Comments:
preprocessor! Computer Science students should recognize what is going preprocessor! Computer Science students should recognize what is going
on. on.
## Author's comments:
Selected Author's Comments:
Many cool things have been done with the preprocessor, Many cool things have been done with the preprocessor,
e. g. calculation of prime numbers or the tower of Hanoi. However, e. g. calculation of prime numbers or the tower of Hanoi. However,
@@ -60,10 +73,7 @@ Selected Author's Comments:
Turing machine running over the tape and doing its work in your Turing machine running over the tape and doing its work in your
terminal! terminal!
### How to use it
How to use it
=============
For the impatient For the impatient
----------------- -----------------
@@ -71,7 +81,9 @@ Selected Author's Comments:
The info files "herrmann1.turing" and "herrmann1.gcd" are sample The info files "herrmann1.turing" and "herrmann1.gcd" are sample
programs for the Turing machine. For example, type programs for the Turing machine. For example, type
```sh
./herrmann1.sh 'prg=herrmann1.times2' ./herrmann1.sh 'prg=herrmann1.times2'
```
and watch the animated Turing machine multiply 8 by two (in and watch the animated Turing machine multiply 8 by two (in
unary representation). Here's a screen shot during compilation: unary representation). Here's a screen shot during compilation:
@@ -111,8 +123,12 @@ Selected Author's Comments:
provide only a finite portion of the tape, like I did above. In provide only a finite portion of the tape, like I did above. In
this case, the remainder of the tape is filled with O's. ;-) this case, the remainder of the tape is filled with O's. ;-)
If you just type If you just type:
```
./build ./build
```
and run the program, you'll get a usage message (and the return and run the program, you'll get a usage message (and the return
code will be 2). code will be 2).
@@ -121,10 +137,7 @@ Selected Author's Comments:
kde terminal "konsole" or the text console under linux are much kde terminal "konsole" or the text console under linux are much
better. Simply try some out.) better. Simply try some out.)
### Writing your own programs
Writing your own programs
-------------------------
Now, let's assume you want to write a program which adds 1 to a Now, let's assume you want to write a program which adds 1 to a
number in unary representation. (That is, a row of I's is number in unary representation. (That is, a row of I's is
@@ -151,7 +164,9 @@ Selected Author's Comments:
Now, the program can be used with Now, the program can be used with
```sh
./herrmann1.sh 'prg=plus1.turing' 'tape="I I I"' ./herrmann1.sh 'prg=plus1.turing' 'tape="I I I"'
```
But what happens if no tape is provided? Up to now, the Turing But what happens if no tape is provided? Up to now, the Turing
machine would start on an empty tape (that is, a tape filled with machine would start on an empty tape (that is, a tape filled with
@@ -163,10 +178,7 @@ Selected Author's Comments:
to your program. to your program.
### Debugging
Debugging
---------
When writing long programs, the most common errors are to forget When writing long programs, the most common errors are to forget
to define a state or to misspell one. Let's assume you forgot the to define a state or to misspell one. Let's assume you forgot the
@@ -196,11 +208,7 @@ Selected Author's Comments:
If this happens, the build script will write the error message of If this happens, the build script will write the error message of
gcc into a file called "error" and then exit. gcc into a file called "error" and then exit.
### What the build script does
What the build script does
==========================
In principle, the build script simply runs the preprocessor over In principle, the build script simply runs the preprocessor over
and over again, until nothing changes anymore; then, the program and over again, until nothing changes anymore; then, the program
@@ -220,9 +228,7 @@ Selected Author's Comments:
(gcc would even insert #line directives if I didn't suppress (gcc would even insert #line directives if I didn't suppress
them with the -P option.) them with the -P option.)
### Some more details
Some more details
-----------------
- The arguments passed to the build script are passed on to gcc - The arguments passed to the build script are passed on to gcc
with a "-D" before. I had a slight technical problem doing this with a "-D" before. I had a slight technical problem doing this
@@ -245,11 +251,7 @@ Selected Author's Comments:
could have made the compile script output the error file in case could have made the compile script output the error file in case
of an error, but I didn't want to make it yet longer.) of an error, but I didn't want to make it yet longer.)
### Some technical details / obfuscations
Some technical details / obfuscations
====================================
- The program is compressed. In the first three preprocessing - The program is compressed. In the first three preprocessing
passes, it uncompresses itself and initializes the passes, it uncompresses itself and initializes the
@@ -303,11 +305,7 @@ Selected Author's Comments:
"modern art of programming" - a mixture of program-like "modern art of programming" - a mixture of program-like
indenting and modern art. There are even some comments... indenting and modern art. There are even some comments...
### Compatibility
Compatibility
=============
- It works with many versions of gcc. I tested it with versions - It works with many versions of gcc. I tested it with versions
2.7.2.1, 2.8.1, 2.95.2, and ecgs-2.91.66. However, an old version 2.7.2.1, 2.8.1, 2.95.2, and ecgs-2.91.66. However, an old version
+1 -1
View File
@@ -1,4 +1,4 @@
#!/bin/sh #!/usr/bin/env bash
name=herrmann1 name=herrmann1