Merge pull request #70 from xexyl/1989-westley

Get 1989/westley to compile with clang
This commit is contained in:
Landon Curt Noll authored and GitHub committed 2023-03-17 10:49:16 -07:00
commit 37c48a4363
4 files changed
+56 -18

No files matched your search

+8
View File
@@ -1 +1,9 @@
ver0
ver0.c
ver1
ver1.c
ver2
ver2.c
ver3
ver3.c
westley westley
+1 -1
View File
@@ -94,7 +94,7 @@ ARCH=
# Defines that are needed to compile # Defines that are needed to compile
# #
#CDEFINE= #CDEFINE=
CDEFINE= -Dtrgpune=putchar CDEFINE= -Dtrgpune=putchar -Dpune=char -Dvag=int
# Include files that are needed to compile # Include files that are needed to compile
# #
+44 -15
View File
@@ -1,4 +1,4 @@
Most algorithms in one program: # Most algorithms in one program:
Merlyn LeRoy (Brian Westley) Merlyn LeRoy (Brian Westley)
Starfire Consulting Starfire Consulting
@@ -7,21 +7,50 @@ Most algorithms in one program:
55104 55104
USA USA
Judges notes: ## To build:
make all
NOTE: [Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) was able to get
this to partially work with clang; clang requires that the second, third and
fourth args to main() be `char **`. Only `westley.c` and `ver0.c` (see below) will
compile with clang. It's possible to get ver1.c to compile too but this causes
problems with generating the output of the remaining files so we have opted, at
least for now, to not do that, as it does not have to output just source code.
He notes that the original source code sometimes segfaults with `ver2` which
also happens with the fix but it'll only compile with a compiler that
does not require the second, third and fourth args of main() to be a `char **`.
Thank you Cody for your help!
## Try:
./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
Try compiling and running the 4 resulting programs. To compile try:
make ver0
make ver1
make ver2
make ver3
## Judges notes:
There is a secret way to get ONE of the versions to print out There is a secret way to get ONE of the versions to print out
"Hello, world!\n". Can you find how to do it? "Hello, world!\n". Can you find how to do it?
Try the following commands:
westley < westley.c > ver0.c ## Selected notes from the author:
westley 1 < westley.c > ver1.c
westley 1 2 < westley.c > ver2.c
westley 1 2 3 < westley.c > ver3.c
Try compiling and running the 4 resulting programs.
Selected notes from the author:
This is a filter. If it is run with no arguments, it copies This is a filter. If it is run with no arguments, it copies
stdin to stdout. With one argument, it ROT13's stdin to stdin to stdout. With one argument, it ROT13's stdin to
@@ -36,17 +65,17 @@ Selected notes from the author:
(ROT13 and reversed)). (ROT13 and reversed)).
When compiling these versions, one needs to define 'trgpune' When compiling these versions, one needs to define 'trgpune'
in the compile line. Example: in the compile line (which the Makefile now has). Example:
cc -Dtrgpune=putchar ver3.c -o ver3 cc -Dtrgpune=putchar ver3.c -o ver3
"trgpune" is the ROT13 of getchar(), so getchar() and putchar() "trgpune" is the ROT13 of getchar(), so getchar() and putchar()
are exchanged in the ROT13 counterpart. It is easy to see that are exchanged in the ROT13 counterpart. It is easy to see that
this is unavoidable. I must have a #define for a library this is unavoidable. I must have a #define for a library
function; otherwise I would have an unidentifed extern for the function; otherwise I would have an unidentified extern for the
ROT13 version. If I then define this function, it won't link ROT13 version. If I then define this function, it won't link
in the library version for the ORIGINAL code, since my in the library version for the ORIGINAL code, since my
definition will supercede the library function. Hence, the definition will supersede the library function. Hence, the
compiler option gives me putchar(), and allows me to use compiler option gives me putchar(), and allows me to use
getchar(). I pass a dummy argument to getchar() to eliminate getchar(). I pass a dummy argument to getchar() to eliminate
"variable number of args" from lint (unless it checks against "variable number of args" from lint (unless it checks against
@@ -110,7 +139,7 @@ Selected notes from the author:
The code can therefore be interlaced. There are eight The code can therefore be interlaced. There are eight
such palindromic bits. You can find them within the such palindromic bits. You can find them within the
/*//**/ /**//*/ pairs. `/*//**/ /**//*/` pairs.
The body of the code of ver0 and ver1 is a large lumpy 'K' (for The body of the code of ver0 and ver1 is a large lumpy 'K' (for
Kernighan); the code of ver2 and ver3 is a flat-topped and Kernighan); the code of ver2 and ver3 is a flat-topped and
+3 -2
View File
@@ -1,7 +1,8 @@
/**//*/};)/**/main(/*//**/tang ,gnat/**//*/,ABBA~,0-0(avnz;)0-0,tang,raeN /**//*/};)/**/main(/*//**/tang ,gnat/**//*/,ABBA~,0-0(avnz;)0-0,tang,raeN
,ABBA(niam&&)))2-]--tang-[kri - =raeN(&&0<)/*clerk*/,noon,raeN){(!tang&& ,ABBA(niam&&)))2-]--tang-[kri - =raeN(&&0<)/*clerk*/,noon,raeN)char
noon!=-1&&(gnat&2)&&((raeN&&( getchar(noon+0)))||(1-raeN&&(trgpune(noon **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 )))))||tang&&znva(/*//**/tang ,tang,tang/**|**//*/((||)))0(enupgrt=raeN
(&&tang!(||)))0(rahcteg=raeN( &&1==tang((&&1-^)gnat=raeN(;;;)tang,gnat (&&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(avnz;)gnat:46+]552&)191+gnat([kri?0>]652%)191+gnat([kri=gnat