diff --git a/2005/giljade/.gitignore b/2005/giljade/.gitignore index 73f43fe40..c94debb59 100644 --- a/2005/giljade/.gitignore +++ b/2005/giljade/.gitignore @@ -1,5 +1,4 @@ giljade -giljade.alt out c.c giljade.orig diff --git a/2005/giljade/README.md b/2005/giljade/README.md index 74ef47dce..b3e81ffd4 100644 --- a/2005/giljade/README.md +++ b/2005/giljade/README.md @@ -51,24 +51,11 @@ vi out Press ^F (control F) repeatedly. -### Alternate code: - -This version will work only with compilers that let you have alternate types to -the args of `main()` and will also successfully run its self-test (the other -version only runs some of them successfully). To use: +### Self-test feature to try: ```sh -make alt -``` - -Use `giljade.alt` as you would `giljade` above. - - -#### Try: - -```sh -./giljade.alt > out -./giljade.alt out +./giljade > out +./giljade out ``` diff --git a/2005/giljade/giljade.alt.c b/2005/giljade/giljade.alt.c deleted file mode 100644 index f56de0df7..000000000 --- a/2005/giljade/giljade.alt.c +++ /dev/null @@ -1,49 +0,0 @@ - #define/**/F/***/for/*A*/ - #define/***/H()f=*E<<4|*\ - E,f=~(f|f<<1|E[3]|E[1]|E\ - [1]<<4|E[2]|E[(2)]<<(1)); - #define/***/I(x,d)F(;s;C\ - ()){s=s^(b=s&s-1^s);F(N[\ - 4]=q=0;q<4;q++)N[q]=E[q]\ - ;N[5]=E-B;N[d]^=+b^(b)x;} - #define/**/o(p,t,i,m,a,l\ -\ -)u=(f&p)i(m) ;s=u&E[3];I(t(m),3)s=(u)a &E[l];I(t(m\ -),l)u=u>>5-m &u;s=u&E[3-l];I(t(m),3-l) s=(u)a&*E;I\ -(t(m),(0));; /*echo/Line/%d;sed/-n/-e/ %d,%dp/%s>*/ -/*c.c;cc/c.c /-c*/;;char*A=0,*_,*R,*Q, D[9999],*r,l -[9999],T=42, M,V=32;int *E,k[9999],B[1 <<+21],*N=B+ -1234567,q=0, h=3,j=2,O,b,f,u,s,c,a,t,e ,d;C(){F(h=N -[3];(B[h]&&+ memcmp(N,B+B[h],16));h=B[ h]+4);B[h]|| -(B[h]=N-B,N= N+6);}main(char*U,int*w[] ){;;F(_=A=D+ -6666,A[fread (A,1,3333,fopen(__FILE__, "r"))]=0;*++ -_;h||(*_=V)) -*_-59|_[1]-* _||(h&&(*_=+ 35),h---2||(_[9]=V));;F(_ -=A;*_;_++)10 -*_&&*_-V&&( *_-92)&&(k[q]=isalnum(l[q -]=*_),q++);M =47;*(E=N-6) =64;E[1]=289;E[2]=270336; -F(E[3]=32782 ;E>,4,>>4, -1)o(+489335, >>,<<,1,,2)o (978670,<<,>>,1,>>1,2)o(+ -65535,>>,<<, 4,,1)if(8192 &*E){F(N=B;E>B;E=B+E[5])* -N++=E-B;F(;N >B;){h=*(E=B +*--N);H()s=~(E[1]|h|h<<1 -);u=~(E[2]|h |h<<4);r=l;_ =D;d=1;a=2;O=8;F(q=74;q;q ---){F(b=0;b< 72;b++){h=+1 <<(q-1)/14*4+(b-1)/18;j=b - ?(!(b%18)&&u &h)|h&f|(!(q%14)&&s&h)?1: -0:2;if(O<3)O ?j?j-1&&(O-2 &&d--,*R=34,O=2):(*_++=O- -2?l[d]?l[d++ ]:(d=t,O=e=3 ,34):(O=1,34)):j||(*_++=d -j &&(sprintf(l -,r+1,j,j,O=j +75,w[1]),j= O,!system(l) ););exit(j<+ -13499);}t=d+ 9;_[-1]=l[++ d];}a-1|+j-2 ||(R-Q<3?(*( -Q++R;) ;}}};O-b-f-u -s-c-a-t-e;} diff --git a/2005/giljade/giljade.c b/2005/giljade/giljade.c index c1ea23491..5bf491432 100644 --- a/2005/giljade/giljade.c +++ b/2005/giljade/giljade.c @@ -11,11 +11,11 @@ )u=(f&p)i(m) ;s=u&E[3];I(t(m),3)s=(u)a &E[l];I(t(m\ ),l)u=u>>5-m &u;s=u&E[3-l];I(t(m),3-l) s=(u)a&*E;I\ (t(m),(0));; /*echo/Line/%d;sed/-n/-e/ %d,%dp/%s/|sed*/ -/*-e/'s,intZ,int/ Z,g'>c.c;cc/c.c/-Wno-implicit-function-declaration /-c*/ +/*-e/'s,intZ,int/ Z,g'>c.c;make/c;/ rm/-f/c*/ ;;char*A=0,*_,*R,*Q, D[9999],*r,l[9999],T=42, M,V=32;int *E,k[9999],B[1 <<+21],*N=B+ 1234567,q=0, h=3,j=2,O,b,f,u,s,c,a,t,e ,d;C(){F(h=N [3];(B[h]&&+ memcmp(N,B+B[h],16));h=B[ h]+4);B[h]|| -(B[h]=N-B,N= N+6);}main(int Z,char**Y ){char*U=Z ; +(B[h]=N-B,N= N+6);}main(Z,Y )char**Y;{char*U=Z ; int**w=Y; ;;F(_=A=D+6666,A[fread(A,1,3333,fopen (__FILE__, "r"))]=0;*++ _;h||(*_=V)) *_-59|_[1]-* _||(h&&(*_=+ 35),h---2||(_[9]=V));;F(_ @@ -46,4 +46,4 @@ e==1){F(r=A= l+d;35-*A;++ A)*A-M&&*A-T ||U-1&&(*A=V 13499);}t=d+ 9;_[-1]=l[++ d];}a-1|+j-2 ||(R-Q<3?(*( Q++R;) ;}}};O-b-f-u -s-c-a-t-e;} +R=D;putchar( *R)&&_>++R;) ;}}};} diff --git a/bugs.md b/bugs.md index 83f9f6ca0..3028f797b 100644 --- a/bugs.md +++ b/bugs.md @@ -235,18 +235,22 @@ Please help us by writing alternative code! ## STATUS: main() function args not allowed - please help us fix -NOTE: it appears that all of these have been fixed. However some still have -problems. This is what the status means, however: +NOTE: it appears that all of these have been fixed except perhaps for +[1989/westley](1989/westley/westley.c). However some still have problems of some +kind or another. This is what the status means, however. Entries with this status have a problem in that the args to main() are not of a specific type due to this being allowed in earlier C. Some compilers like clang -have a deficiency where they do not allow this so these entries do not work with -clang. +have a defect where they do not allow this so these entries do not work with +clang. Some versions of clang also do not allow four args to main() which +`1989/westley` has. [Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) looked at the source -code of clang and reported that there is no way to override this requirement so -these entries will fail to compile with clang. That's why in some entries he -fixed he did it by adding a function called `pain()`. :-) +code of clang and reported that there is no way to override the requirement of +arg types so these entries will fail to compile with clang. That's why in some +entries he fixed he did it by adding a function called `pain()`. :-) He did not +check for the number of args as that was discovered later but he suspects it's +the same issue. **NOTE for macOS users**: please be aware that _gcc_ under macOS **is actually clang** despite the fact it might appear to be gcc: no symlink and both gcc and @@ -528,9 +532,9 @@ This program will crash with numbers with non-binary digits. Although [Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) fixed this for some of the versions that are generated (see below tip) it will not work for all -with the clang compiler. 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). +with the clang compiler (gcc works fine). 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). There is another change that was thought up on 08 July 2023 which allows for another version to be compiled with clang but it causes some of the versions to @@ -936,7 +940,7 @@ not work properly in macOS (at least Ventura). He did some debugging and has determined where the crash occurs (depending on invocation of the program) and came up with a workaround of sorts but if you have a fix we welcome your help. -With this you'll need XQuartz as described in the [faq](faq.md) and the +With this you'll need XQuartz as described in the [FAQ](faq.md) and the [1996/jonth/README.md](1996/jonth/README.md) file. Notes from Cody: @@ -949,7 +953,7 @@ crashes. Earlier invocations it would crash at s=XDefaultScreen(V=d[D]=XOpenDisplay(*(h+=!! *h))); ``` -because `XOPenDisplay()` returned NULL. But using `:0 :0` _appears_ to resolve +because `XOpenDisplay()` returned NULL. But using `:0 :0` _appears_ to resolve that problem. However instead it crashes at this code: ```c @@ -1497,138 +1501,12 @@ strange. This might also happen if you specify excessively large board dimensions. Try `100 100 100` for instance and see what happens! ## [2005/giljade](2005/giljade/giljade.c) ([README.md](2005/giljade/README.md)) -## STATUS: known bug - please help us fix - -The alternate code will not compile with compilers that do not let you have -alternate types of the args to `main()`. An example compiler with this defect is -`clang`. If you have `gcc` you can use `make alt` and there is no problem. - -The reason the clang fixed (but see below) version is [giljade.c](giljade.c) is -that the primary purpose of the entry is a 2D puzzle and this works with the -clang fix, more or less (if not entirely hard to know with the many layouts it -generates). The problem is that with the clang fix the self-test version does -not work for every layout. The author even notes that modifying the code will -cause this but it has to be changed to let clang compile it due to clang's -defect. - -Now [Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) fixed this to work -in both the clang version (which Landon added) and the original version -([giljade.alt.c](giljade.alt.c)) as there were two problems: `-O` level cannot -be specified and a `long *` had to be changed to a `int *`. - -### The actual problem - -One is supposed to be able to do: - -```sh -./giljade > out -./giljade out -``` - -and see all layouts compile without error. If you wish to see this in action and -you have a compiler without the defect of clang you can do: - -```sh -make alt -./giljade.alt > out -./giljade.alt out -``` - -But if you try this with `giljade` you will run into compilation errors, -seemingly different across different compilers. In macOS it's clang but in linux -it's probably gcc (the entry uses `cc`). - -Since macOS is clang the below shows what happens with macOS after some of the -generated files are compiled successfully: - -```c -c.c:74:53: error: expected expression -T;*R=M;*_++=10;F( R=D;putchar(*R)&& _>++R;);}}};O-b*/ - ^ -c.c:76:72: error: expected expression - - ^ -c.c:76:72: error: expected '}' -c.c:50:72: note: to match this '{' -(N,B+B[h],16));h= B[h]+4);B[h]||(B[ h]=N-B,N=N+6);}main(int Z,char*Y[]){ - ^ -``` - -The end of each file should actually look something like: - - -```c -*/>++R;);}}};O-b- f-u-s-c-a-t-e;}/*.*dbhn.Lhnd.$d:rdd .,n.,d.$d,$dp.$r> -*..*b.b:bb.b.b.,b *.":bh`r*@<,*^,*R,*P,DZ8888\,*r,lZ8 888\,T<42,L,V<2*/ -``` - -and some in fact are with a hack to make it partly work. What is this hack? Take -a look at the comment in the code: - -```c -/*echo/Line/%d;sed/-n/-e/ %d,%dp/%s/|sed*/ -/*-e/ 's,intZ,int/ Z,g'>c.c;cc/c.c/-Wno-implicit-function-declaration /-c*/ -``` - -That is actually called via `system()`. But if you observe in -[giljade.alt.c](2005/giljade/giljade.alt.c) the comment is quite different being -just: - - -```c -/*echo/Line/%d;sed/-n/-e/ %d,%dp/%s>*/ -/*c.c;cc/c.c /-c*/ -``` - -Why? Because in some platforms at least clang defaults to `-Werror` for some -warnings: that's why the disabling of the warning in particular. But the change -to make it compile with clang changed the output generated to merge the `int` -and the arg in `main()` which is of course a big problem. Thus the additional -`sed` command fixes the problem of `int` and `Z` becoming one word but somewhere -in the process some of the generated code fails. - -What might the translation of the comment end up being? Here's an example: - -``` -system(" echo Line 2;sed -n -e 2,77p out> c.c;cc c.c -c "); -``` - -But of course the range of lines to print changes successively as the program -goes through the file. - -Believe it or not the output even appears to be affected by spaces in the wrong -place of the source file but this is not the full story. Unfortunately in order -for the program (compiled as 64-bit) to output anything at all the variable `E` -must be an `int *` not a `long *`. However the change that allows clang to -compile it causes the output to not have spaces where necessary to successfully -compile the generated output which is why the extra `sed` command shown above -(which has a special way to input spaces). We do not know if the change from -`long *` to `int *` also messes up the output but we suspect not because it -works for gcc. - -Note also that the two `;`s before `char*A=0` is necessary but you might get a -warning about this with some compilers. If it's removed you'll see something -like: - -```sh -sh: -c: line 0: syntax error near unexpected token `{F' -sh: -c: line 0: ` echo Line 2;sed -n -e 2,77p out |sed -e 's,intZ,int Z,g'>c.c;cc c.c -Wno-implicit-function-declaration -c ;char A=0, _, R, Q,D[9999], r,l[9999],T=42,M,V=32;int E,k[9999],B[1<<+21], N=B+1234567,q=0,h=3,j=2,O,b,f,u,s,c,a,t,e,d;C(){F(h=N[3];(B[h]&&+memcmp(N,B+B[h],16));h=B[h]+4);B[h]||(B[h]=N-B,N=N+6);}main(intZ,char Y[]){char U=Z;int w=Y;' -``` - -or so, depending on the comment, when running the program on its output. - -Observe too that the `*` part of pointers have been removed! You also see the -merge of `int` and `Z` as noted earlier. With the two `;`s this is not a -problem. - -Cody will look at this all later on. - ## STATUS: INABIAF - please **DO NOT** fix -It also will very likely segfault or do something strange if the source code +This entry will very likely segfault or do something strange if the source code does not exist. -This entry requires that `sed` and `cc` are in the path. +This entry requires that `sed` and `make` are in the path. ## [2005/mynx](2005/mynx/mynx.c) ([README.md](2005/mynx/README.md)) ## STATUS: INABIAF - please **DO NOT** fix diff --git a/thanks-for-fixes.md b/thanks-for-fixes.md index 86a8c81cf..94ba0b19f 100644 --- a/thanks-for-fixes.md +++ b/thanks-for-fixes.md @@ -1168,9 +1168,9 @@ the README.md for details. ## [2005/giljade](2005/giljade/giljade.c) ([README.md](2005/giljade/README.md])) -After Landon fixed the entry to compile with clang (but see above and below) -Cody noticed this does not work at all in modern systems. He fixed this to work -but he notes that the fix to let clang compile it breaks the self-test feature. +After Landon fixed the entry to compile with clang Cody noticed this does not +work at all in modern systems (see below). He fixed this to work and then he +later fixed the self-test feature. The problem that was showing up is that with either optimising or if anything but 32-bit (as in `-m32`) was used it would not work (at least in 64-bit @@ -1179,15 +1179,29 @@ and 64-bit. The solution has to do with the size difference between `int` and `long` so that the `long*E` is now `int*E`. This solves a specific problem for linux (32-bit, 64-bit) and macOS (arm64). -But as noted there is another problem with clang: the self-test feature only -completely works with the original version ([giljade.alt.c](giljade.alt.c), not -the one that will compile with clang ([giljade.c](giljade.c)). The alternate -version, which will not compile with clang, is the only one that passes the -self-tests. If your compiler does not have the defect that clang has about arg -types to `main()` see the Alternate code section in the README.md file at least -for the self-test feature. +To get the self-test feature to work it was required to remove from the code: + +```c +O-b-f-u -s-c-a-t-e; +``` + +as it caused a compilation error in some of the generated code but served no +purpose, didn't affect the output of the puzzle and since the 'string' is +already in the code there is no problem omitting it. + +`main()` was also changed to be in the old format: + +```diff +-(B[h]=N-B,N= N+6);}main(int Z,char**Y ){char*U=Z ; ++(B[h]=N-B,N= N+6);}main(Z,Y )char**Y;{char*U=Z ; +``` + +Finally because clang has `-Werror` by default the program was changed to use +`make` and then `rm -f` on the output of the compiler instead. This change might +also not have been necessary if using different flags to `cc` but this felt +cleaner, somehow. + -For much more details on the problem see [bugs.md](/bugs.md). ## [2005/jetro](2005/jetro/jetro.c) ([README.md](2005/jetro/README.md))