Improve situation with clang for 1989/westley

The alt code has been changed so that in addition to the main feature
working it will also generate ver0 and ver1 correctly; ver2 and ver3
cannot be compiled still. This is not perfect but it is progress. I will
look at this further later most likely.

Added compile.alt.sh to compile the alt code and generate the alt code
generated code. It generates it in the file name form alt.ver[0-3].c and
the code will be compiled as such.

Added try.sh to demonstrate the main (original) program. This is because
there are a lot of commands to try.

Added try.alt.sh to demonstrate the alt program (not trying the ver2 and
ver3, naturally). The rationale is the same as for try.sh.

The Makefile has been updated for these changes.

Updated .gitignore as a number of new files will be created when running
compile.alt.sh.

The bugs.md has been updated as there has been some progress made. The
hint was removed at this time as it's not applicable now; the problem of
main() args not being allowed is no longer true. However the status line
has not been updated because the root of the problem is this. There are
currently no hints because I do not have any yet.

The thanks file has also been updated for the new scripts as well as the
situation being changed.
This commit is contained in:
Cody Boone Ferguson committed 2023-10-26 08:32:00 -07:00
1 parent ff72c76ff1
commit 08a699bfe8
11 files changed
+261 -80

No files matched your search

+9
View File
@@ -1,11 +1,20 @@
alt.ver0
alt.ver0.c
ver0
ver0.c
alt.ver1
alt.ver1.c
ver1
ver1.c
alt.ver2
alt.ver2.c
ver2
ver2.c
alt.ver3
alt.ver3.c
ver3
ver3.c
westley
westley.alt
westley.orig
prog.orig
+22
View File
@@ -140,6 +140,9 @@ ${PROG}: ${PROG}.c
alt: data ${ALT_TARGET}
@${TRUE}
${ALT_TARGET}: ${PROG}.alt.c
${CC} ${CFLAGS} -Dznva=main $< -o $@ ${LDFLAGS}
ver0: ${PROG}
-./${PROG} < westley.c > ver0.c
-${CC} ${CFLAGS} ver0.c -o $@ ${LDFLAGS}
@@ -159,6 +162,25 @@ ver3: ${PROG}
@echo "** NOTE: this version will not compile with clang **"
-${CC} ${CFLAGS} ver3.c -o $@ ${LDFLAGS}
alt.ver0: ${PROG}.alt
-./${PROG}.alt < westley.alt.c > alt.ver0.c
-${CC} ${CFLAGS} -Dznva=main alt.ver0.c -o $@ ${LDFLAGS}
alt.ver1: ${PROG}.alt
-./${PROG}.alt 1 < westley.alt.c > alt.ver1.c
-${CC} ${CFLAGS} -Dznva=main alt.ver1.c -o $@ ${LDFLAGS}
alt.ver2: ${PROG}.alt
-./${PROG}.alt 1 2 < westley.alt.c > alt.ver2.c
@echo "** NOTE: this alt version will not currently compile **"
-${CC} ${CFLAGS} -Dznva=main alt.ver2.c -o $@ ${LDFLAGS}
alt.ver3: ${PROG}.alt
-./${PROG}.alt 1 2 3 < westley.alt.c > alt.ver3.c
@echo "** NOTE: this alt version will not currently compile **"
-${CC} ${CFLAGS} -Dznva=main alt.ver3.c -o $@ ${LDFLAGS}
# data files
#
data: ${DATA}
+15 -30
View File
@@ -30,17 +30,6 @@ Try compiling and running the 4 resulting programs like:
./compile.sh
```
This will remove the programs and then run:
```
./westley < westley.c > ver0.c
./westley 1 < westley.c > ver1.c
./westley 1 2 < westley.c > ver2.c
./westley 1 2 3 < westley.c > ver3.c
```
followed by compiling each version.
If you need to specify an alternate compiler path, say because your default
compiler is clang (or in the case of macOS gcc is clang) you can do so like:
@@ -60,39 +49,35 @@ Finally try:
./westley
# input some lines of text, sending EOF (usually ctrl-d) to end
echo IOCCC | ./westley
echo IOCCC | ./westley 1
echo IOCCC | ./westley 1 2
echo IOCCC | ./westley 1 2 3
echo IOCCC | ./ver0
echo Version 1 | ./ver1
echo Version 2 | ./ver2
echo Version 3 | ./ver3
./try.sh # demo of some input
```
## Alternate code:
The alternate code allows SOME of the features to work with clang but some of
the code it generates (see [compile.sh](compile.sh), which does not use this
version) is not compilable even in gcc let alone clang. Nevertheless the main
feature should work for clang.
the code it generates (see [compile.alt.sh](compile.alt.sh) is not compilable
even in gcc let alone clang. Nevertheless the main feature should work and the
same goes for the `alt.ver0` and `alt.ver1`; currently `alt.ver2` and `alt.ver3`
will not compile even with gcc but it is nonetheless generated for when it is
(hopefully) fixed.
### To build:
### Alternate build:
```sh
make alt
```
### Try:
### Alternate try:
```sh
echo IOCCC | ./westley.alt
echo IOCCC | ./westley.alt 1
echo IOCCC | ./westley.alt 1 2
echo IOCCC | ./westley.alt 1 2 3
```
./westley.alt
# input some text
# generate alt code versions:
./compile.alt.sh
./try.alt.sh # demo of some input
```
## Judges' remarks:
+62
View File
@@ -0,0 +1,62 @@
#!/usr/bin/env bash
#
# compile.sh - compile westley.alt.c, generate the alt versions and then attempt to
# compile them.
#
# To change what compiler is used you can do something like:
#
# CC=/path/to/cc ./compile.sh
#
# The following example was run on a MacBook Pro with the M1 Max which which
# could not normally compile everything because macOS's compiler, even when run
# as gcc, is actually clang:
#
# CC=/opt/local/bin/gcc-mp-12 ./compile.sh
#
# We sleep (by default) for approximately 1 second after each command so that
# the you can read what is being done. If this is too fast you can change it in
# a similar way to the above but using the variable DELAY like so:
#
# DELAY=2 ./compile.sh
#
# You can of course use both variables in the same command line like:
#
# CC=/opt/local/bin/gcc-mp-12 DELAY=2 ./compile.sh
# DELAY=2 CC=/opt/local/bin/gcc-mp-12 ./compile.sh
#
# ...and so on.
# get the compiler using default cc if not specified in the command line
#
# we cannot use the form '${CC:=cc}' because at least in some versions of bash
# it tries to invoke the command which would be an error by itself. Thus we just
# check if it's empty before we set it.
if [[ -z "$CC" ]]; then
CC="cc"
fi
# get sleep duration
# we cannot use the form '${DELAY:=5}' because at least in some versions of bash
# it tries to invoke the command and obviously that won't work. Thus we check if
# it's empty before setting the default.
if [[ -z "$DELAY" ]]; then
DELAY=0
fi
# make clobber to make the directory clean and then compile westley.alt which we
# need to run everything else. Exit if make westley.alt fails as there would be
# nothing further that could be done in that case:
echo "$ make clobber westley.alt"
sleep "$DELAY"
make CC="$CC" clobber westley.alt || exit 1
sleep "$DELAY"
# run commands previously in the try section of the README.md, showing what the
# commands are as we go:
# now generate and compile the files
#
echo "Generating and compiling alt versions ..." 1>&2
sleep "$DELAY"
echo "$ make CC=$CC alt.ver0 alt.ver1 alt.ver2 alt.ver3" 1>&2
make CC="$CC" alt.ver0 alt.ver1 alt.ver2 alt.ver3
+7 -5
View File
@@ -13,7 +13,9 @@
#
# CC=/opt/local/bin/gcc-mp-12 ./compile.sh
#
# If you wish to slow down the script you can use the DELAY variable like:
# We sleep (by default) for approximately 1 second after each command so that
# the you can read what is being done. If this is too fast you can change it in
# a similar way to the above but using the variable DELAY like so:
#
# DELAY=2 ./compile.sh
#
@@ -34,7 +36,7 @@ if [[ -z "$CC" ]]; then
fi
# get sleep duration
# we cannot use the form '${DELAY:=0}' because at least in some versions of bash
# we cannot use the form '${DELAY:=5}' because at least in some versions of bash
# it tries to invoke the command and obviously that won't work. Thus we check if
# it's empty before setting the default.
if [[ -z "$DELAY" ]]; then
@@ -68,8 +70,8 @@ sleep "$DELAY"
# now compile the files by running make alt
#
echo "Compiling alt versions ..." 1>&2
echo "Compiling generated versions ..." 1>&2
sleep "$DELAY"
echo "$ make CC=$CC alt" 1>&2
echo "$ make CC=$CC ver0 ver1 ver2 ver3" 1>&2
sleep "$DELAY"
make CC="$CC" alt
make CC="$CC" ver0 ver1 ver2 ver3
+39
View File
@@ -0,0 +1,39 @@
#!/usr/bin/env bash
make alt || exit 1
echo "$ echo IOCCC | ./westley.alt"
echo IOCCC | ./westley.alt
echo
echo "$ echo IOCCC | ./westley.alt 1"
echo IOCCC | ./westley.alt 1
echo
echo "$ echo IOCCC | ./westley.alt 1 2"
echo IOCCC | ./westley.alt 1 2
echo
echo "$ echo IOCCC | ./westley.alt 1 2 3"
echo IOCCC | ./westley.alt 1 2 3
echo
echo "$ echo IOCCC | ./alt.ver0"
echo IOCCC | ./alt.ver0
echo
echo "$ echo Version 1 | ./alt.ver1"
echo Version 1 | ./alt.ver1
echo
echo "$ echo Version 1 | ./alt.ver1 1"
echo Version 1 | ./alt.ver1 1
echo
echo "$ echo Version 1 | ./alt.ver1 1 2"
echo Version 1 | ./alt.ver1 1 2
echo
echo "$ echo Version 1 | ./alt.ver1 1 2 3"
echo Version 1 | ./alt.ver1 1 2 3
+70
View File
@@ -0,0 +1,70 @@
#!/usr/bin/env bash
make all || exit 1
echo "$ echo IOCCC | ./westley"
echo IOCCC | ./westley
echo
echo "$ echo IOCCC | ./westley 1"
echo IOCCC | ./westley 1
echo
echo "$ echo IOCCC | ./westley 1 2"
echo IOCCC | ./westley 1 2
echo
echo "$ echo IOCCC | ./westley 1 2 3"
echo IOCCC | ./westley 1 2 3
echo
echo "$ echo IOCCC | ./ver0"
echo IOCCC | ./ver0
echo
echo "$ echo Version 1 | ./ver1"
echo Version 1 | ./ver1
echo
echo "$ echo Version 1 | ./ver1 1"
echo Version 1 | ./ver1 1
echo
echo "$ echo Version 1 | ./ver1 1 2"
echo Version 1 | ./ver1 1 2
echo
echo "$ echo Version 1 | ./ver1 1 2 3"
echo Version 1 | ./ver1 1 2 3
echo
echo "$ echo Version 2 | ./ver2"
echo Version 2 | ./ver2
echo
echo "$ echo Version 2 | ./ver2 1"
echo Version 2 | ./ver2 1
echo
echo "$ echo Version 2 | ./ver2 1 2"
echo Version 2 | ./ver2 1 2
echo
echo "$ echo Version 2 | ./ver2 1 2 3"
echo Version 2 | ./ver2 1 2 3
echo
echo "$ echo Version 3 | ./ver3"
echo Version 3 | ./ver3
echo
echo "$ echo Version 3 | ./ver3 1"
echo Version 3 | ./ver3 1
echo
echo "$ echo Version 3 | ./ver3 1 2"
echo Version 3 | ./ver3 1 2
echo
echo "$ echo Version 3 | ./ver3 1 2 3"
echo Version 3 | ./ver3 1 2 3
+11 -11
View File
@@ -1,13 +1,12 @@
/**//*/};)/**/main(/*//**/tang ,gnat/**//*/,ABBA~,0-0(avnz;)0-0,tang,raeN
,ABBA(niam&&)))2-]--tang-[kri - =raeN(&&0<)/*clerk*/,noon,raeN)char
**gnat, **noon, **raeN;{int gn = gnat, ra = raeN, no = noon; (!tang&&
no!=-1&&(gn&2)&&((raeN&&( getchar(no+0)))||(1-ra&&(trgpune(no
)))))||tang&&znva(/*//**/tang ,tang,tang/**|**//*/((||)))0(enupgrt=raeN
/**//*/;)/**/pain(/*//**/tang ,gnat/**//*/,ABBA~,0-0(avnc-0,tang,raeN
,ABBA(niam&&)))2-]--tang-[kri - =raeN(&&0<)/*clerk*/,noon,raeN){(!tang&&
noon!=-1&&(gnat&2)&&((raeN&&( getchar(noon+0)))||(1-raeN&&(trgpune(noon
)))))||tang&&cnva(/*//**/tang ,tang/**|**//*/((||)))0(enupgrt=raeN
(&&tang!(||)))0(rahcteg=raeN( &&1==tang((&&1-^)gnat=raeN(;;;)tang,gnat
,ABBA,0(avnz;)gnat:46+]552&)191+gnat([kri?0>]652%)191+gnat([kri=gnat
,ABBA,0(avnc;)gnat:46+]552&)191+gnat([kri?0>]652%)191+gnat([kri=gnat
(&&)1-^gnat(&&)1& ABBA(!;)raeN,tang,gnat,ABBA(avnz&&0>ABBA{)raeN
,/**/);}znva(/*//**/tang,gnat,ABBA/**//*/(niam;}1-,78-,611-,321
,/**/);}cnva(/*//**/tang,gnat,ABBA/**//*/(niam;}1-,78-,611-,321
-,321-,001-,64-,43-,801-,001-,301-,321-,511-,53-,54,44,34,24
,14,04,93,83,73,63,53,43,33,85,75,65,55,45,35,25,15,05,94,84
,74,64,0,0,0,0,0,0,/**/){ABBA='N'==65;(ABBA&&(gnat=trgpune
@@ -15,11 +14,12 @@ no!=-1&&(gn&2)&&((raeN&&( getchar(no+0)))||(1-ra&&(trgpune(no
gnat&&gnat<='z'||'a'<=gnat&&gnat<='m'||'N'<=gnat&&gnat<='Z'
||'A'<=gnat&&gnat<='M'?(((gnat&/*//**/31/**//*/,21,11,01,9,8
,7,6,5,4,3,2,1,62,52,42,/**/)+12)%26)+(gnat&/*//**/32/**//*/,
22,12,02,91,81,71,61,51,41{=]652[kri};)/*pry*/)+65:gnat);main
22,12,02,91,81,71,61,51,41{=]652[kri};)/*pry*/)+65:gnat);pain
(/*//**\**/tang^tang/**//*/,/* */,~/*//*-*/tang,gnat,ABBA-
0/**//*/(niam&&ABBA||))))tang( rahcteg&&1-1=<enrA(||))tang(
enupgrt&&1==enrA((&&)2&gnat(&& )1-^tang(&&ABBA!(;)85- =tang
(&&)'a\'=gnat(&&)1-==gnat(&&)4 ==ABBA(&&tang!;))))0(enupgrt=
gnat(&&)tang!((||)))0(rahcteg =gnat(&&tang((&&ABBA;;)1-'A'=!
'Z'=tang(&&ABBA{)enrA/***/);gnat ^-1&&znva(tang+1,gnat,1+gnat);
main(ABBA&2/*//*\\**/,tang,gnat ,ABBA/**//*/(avnz/**/);}/*//**/
gnat(&&)tang!((||)))0(rahcteg =gnat(&&tang((&&ABBA)1-'A'=!
'Z'=tang(&&ABBA{)enrA/***/);gnat ^-1&&cnva(tang+1,gnat);
pain(ABBA&2/*//*\\**/,tang,gnat ,ABBA/**//*/(avnc/**/);}/*//**/
main(tang,gnat,noon)char**gnat,**noon;{pain(tang,gnat,noon,0);}
+1 -1
View File
@@ -20,5 +20,5 @@ gnat&&gnat<='z'||'a'<=gnat&&gnat<='m'||'N'<=gnat&&gnat<='Z'
enupgrt&&1==enrA((&&)2&gnat(&& )1-^tang(&&ABBA!(;)85- =tang
(&&)'a\'=gnat(&&)1-==gnat(&&)4 ==ABBA(&&tang!;))))0(enupgrt=
gnat(&&)tang!((||)))0(rahcteg =gnat(&&tang((&&ABBA;;)1-'A'=!
'Z'=tang(&&ABBA{)enrA/***/);gnat ^-1&&znva(tang+1,gnat,1+gnat);
'Z'=tang(&&ABBA{)enrA/***/);gnat ^-1&&znva(tang+1,gnat,1+gnat);
main(ABBA&2/*//*\\**/,tang,gnat ,ABBA/**//*/(avnz/**/);}/*//**/
+5 -22
View File
@@ -568,14 +568,10 @@ numbers with non-binary digits.
## [1989/westley](1989/westley/westley.c) ([README.md](1989/westley/README.md))
### STATUS: main() function args not allowed - please help us fix
This entry is a big problem for clang due to the way it is designed. Earlier a
change was made to let it compile with clang but although it appeared to work
with gcc, all generated versions (see the README.md for details), this was
either a mistake or it no longer does.
Thus the original was copied and this does not work at all in clang. It is very
easy to get the first one or two to work with clang but the others result in
compilation failures even besides clang.
This entry is a big problem for clang due to the way it is designed. An alt
code, added by Cody, was made that lets the program work and some of the
generated files work but as `ver2` and `ver3` cannot be compiled even with gcc
(syntax errors) this is in the alt version.
The problems with clang is that it does not allow `int` for any arg in `main()`
except the first one, argc, and some versions of clang do not even allow a
@@ -585,21 +581,8 @@ Cody noted that trying to fix it in some cases causes a segfault and in other
cases it fails to generate some of the files (others are okay) at all (empty
files). These changes were never committed.
Cody gives these tips on the problem: `main()`'s second, third and fourth args
(but on fourth arg see above) are supposed to be a `char **`. This didn't use to
be the case and some compilers like gcc don't complain. `clang` however does.
Cody was able to get `main()` to be correct BUT a feature is that it uses ROT13
to decrypt the function `znva` to be main in _generated files_ (see the
[README.md](1989/westley/README.md) for details).
Since that function does not have the correct types when converted to main() it
fails to compile. But as he said changing the type causes either a segfault,
files not generated at all or files ended up with syntax errors. `ver1`, `ver2`
and `ver3` are the problematic ones.
The file [westley.alt.c](1989/westley/westley.alt.c) will compile with clang
but although it can perform some of its functions it will generate code that
does not work.
but although it can perform some of its functions.
### STATUS: known bug - please help us fix
+20 -11
View File
@@ -641,20 +641,29 @@ not his only reason :-) )
## [1989/westley](1989/westley/westley.c) ([README.md](1989/westley/README.md]))
Cody got some of the versions (the original and `ver0`) to work with some
Cody got some of the versions (the original and `ver0` and `ver1`) to work with some
versions of `clang`. Unfortunately there are some defects in `clang` that break
this entry either in full or in part. Also, some of the code generated by it
cannot be compiled by gcc either. Thus these changes are in the alt code.
Nevertheless the main features of the program does work in the alt version, it
just cannot generate every C file correctly.
this entry either in full or in part. In particular the first arg to `main()`
has to be an int and the rest have to be a `char **` but some versions do not
allow four args. So to get past this another function was added, `pain()`, which
takes the place of `main()` and which `main()` calls.
Cody provided the compile.sh script to generate the files and then try and
compile them (which ones succeed depend on whether or not clang is the
compiler). The script allows one to change the path of the compiler if they have
another one. See the README.md for details.
This was added as alt code because some of the code generated cannot be compiled
by gcc either. To make use of this several scripts were added by Cody.
As there are some important notes on this in the README.md file we have left the
details in that file and further details are in the [bugs.md](bugs.md) file.
The [compile.sh](1989/westley/compile.sh) script that removes the generated
code, rebuilds the program and regenerates the other code and then compiles it
will work for compilers like gcc and one can then use the
[try.sh](1989/westley/try.sh) script to see example input and output.
The [compile.alt.sh](1989/westley/compile.alt.sh) script does the same but for
the alt code, which as noted above, can only compile the first two generated
versions, at least at this time. The [try.alt.sh](1989/westley/try.alt.sh)
script is like the [try.sh](1989/westley/try.sh) script but it uses the alt code
and alt generated versions instead.
Both scripts allow one to specify the compiler which is probably more useful for
`compile.sh`.
## [1990/baruch](1990/baruch/baruch.c) ([README.md](1990/baruch/README.md]))