Fix infinite loop hang in 1996/august

In macOS, for example, one of the commands suggested by the author and
by the judges (which was put into try.sh by me a while back) would cause
it to hang. The author's remarks made me try something: a file has to
first have lines starting with '#' (^#) stripped. Thus in the author's
remarks and the try.sh script this command was added:

    sed -i'' '/^#/d' august.oc

and now it runs to completion.

The README.md file has been format and typo fixed and this should
complete 1996/august.
This commit is contained in:
Cody Boone Ferguson committed 2023-11-11 06:47:33 -08:00
1 parent 1181899ed9
commit d801a7d473
5 files changed
+29 -47

No files matched your search

+2 -2
View File
@@ -3,8 +3,8 @@ august.oc
test.oo test.oo
fac.oo fac.oo
parse.oo parse.oo
prog.oc august.oc
august.oo
august.oo august.oo
prog.oo
august.orig august.orig
prog.orig prog.orig
+20 -28
View File
@@ -34,13 +34,7 @@ The above should print a `!` followed by a newline.
### Try: ### Try:
```sh ```sh
cat august.c fac.oc | ./august > fac.oo ./try.sh
./august < fac.oo
cat august.c fac.oc | ./august | ./august
cat august.c parse.oc | ./august > parse.oo
cat parse.oo fac.oc | ./august | ./august
``` ```
@@ -79,13 +73,6 @@ And if you have lots of spare time, you can recurse one level deeper:
cat august.oo august.oo august.oo fac.oo | ./august cat august.oo august.oo august.oo fac.oo | ./august
``` ```
NOTE: to run all the commands in the above sections you can also use the
[try.sh](try.sh) script like:
```sh
./try.sh
```
We (the judges) recommend that you spend some time studying this We (the judges) recommend that you spend some time studying this
entry as it surely will make the 'best of the IOCCC' list. It was entry as it surely will make the 'best of the IOCCC' list. It was
very well received by those who attended the IOCCC BOF. very well received by those who attended the IOCCC BOF.
@@ -108,8 +95,8 @@ compiler that compiles from OC (Obfuscated C, a subset of C) into the
byte code that the interpreter understands. byte code that the interpreter understands.
The language the compiler understands is a subset of C (the grammar The language the compiler understands is a subset of C (the grammar
is in grammar.small) with the functions getchar() and putchar() is below) with the functions `getchar(3)` and `putchar(3)`
available. The subset has the types `int', `char', and pointers to available. The subset has the types `int`, `char`, and pointers to
those (it has function pointers too, but not with the proper those (it has function pointers too, but not with the proper
syntax). Arrays can only be global. There is a rather limited set syntax). Arrays can only be global. There is a rather limited set
of operators, and control constructs. of operators, and control constructs.
@@ -117,10 +104,10 @@ of operators, and control constructs.
The compiler has absolutely no error checking, so things The compiler has absolutely no error checking, so things
can go wrong. But this is what seasoned C programmers are used to. can go wrong. But this is what seasoned C programmers are used to.
Assume that the interpreter has been compiled (source in prog.c and Assume that the interpreter has been compiled (source in [august.c](august.c)
binary in prog) and that we have this in a file named `test.oc`: and binary in august) and that we have this in a file named `test.oc`:
``` ```c
main() { putchar('!'); putchar('\n'); exit(0); } main() { putchar('!'); putchar('\n'); exit(0); }
``` ```
@@ -155,22 +142,26 @@ command from the Makefile, but add the `-E` flag and change 60000 to 40000,
i.e.: i.e.:
```sh ```sh
cc -E -DZ=40000 .... august.c > prog.oc cc -E -DZ=40000 .... august.c > august.oc
``` ```
If `prog.oc` contain some junk line starting with a `#' (most likely If `august.oc` contain some junk line starting with a `#` (most likely
it does) then remove it. it does) then remove it like:
```sh
sed -i'' '/^#/d' august.oc
```
OK, we can now compile the interpreter: OK, we can now compile the interpreter:
```sh ```sh
cat august.c prog.oc | ./august > prog.oo cat august.c august.oc | ./august > august.oo
``` ```
And we can run it: And we can run it:
```sh ```sh
cat prog.oo test.oo | ./august cat august.oo test.oo | ./august
``` ```
Here we have the interpreter interpreting another interpreter that runs Here we have the interpreter interpreting another interpreter that runs
@@ -178,13 +169,13 @@ the program. Did you think that was too fast? Just throw in another
level of interpretation: level of interpretation:
```sh ```sh
cat prog.oo prog.oo test.oo | ./august cat august.oo august.oo test.oo | ./august
``` ```
And another... And another...
```sh ```sh
cat prog.oo prog.oo prog.oo test.oo | ./august cat august.oo august.oo august.oo test.oo | ./august
``` ```
--- ---
@@ -199,7 +190,7 @@ Anyway, the bytecode from the compiler is first optimized in
an external optimizer (not supplied here); this brings down the an external optimizer (not supplied here); this brings down the
size of it by about 30%. The remaining code is then LZ-compressed size of it by about 30%. The remaining code is then LZ-compressed
(roughly) with a sliding window of 255 bytes. The most common (roughly) with a sliding window of 255 bytes. The most common
occuring bytes are then encoded using `" \n\t;{}"` to avoid having occurring bytes are then encoded using `" \n\t;{}"` to avoid having
them counted as significant. About 200 bytes of the interpreter them counted as significant. About 200 bytes of the interpreter
handles the unpacking of the byte code (this is a lot, but it pays handles the unpacking of the byte code (this is a lot, but it pays
off). off).
@@ -208,7 +199,7 @@ Despite all this work I still had to put a lot of code in the
compilation command. This disturbs me. It is possible to compress compilation command. This disturbs me. It is possible to compress
the code further with a better entropy coder (e.g. an arithmetic the code further with a better entropy coder (e.g. an arithmetic
coder), but decompression then takes up too much code. Maybe this coder), but decompression then takes up too much code. Maybe this
would be a way to fit it all into the 1536 bytes, but I'm don't have would be a way to fit it all into the 1536 bytes, but I don't have
time to try it. time to try it.
--- ---
@@ -283,6 +274,7 @@ stars: "*"*
--- ---
Well, that is enough ranting for now. Well, that is enough ranting for now.
+1
View File
@@ -14,6 +14,7 @@ cat parse.oo fac.oc | ./august | ./august
rm august.oc rm august.oc
make august.oc make august.oc
sed -i'' '/^#/d' august.oc
cat august.c august.oc | ./august > august.oo cat august.c august.oc | ./august > august.oo
cat august.oo test.oo | ./august cat august.oo test.oo | ./august
cat august.oo august.oo fac.oo | ./august cat august.oo august.oo fac.oo | ./august
-14
View File
@@ -1370,20 +1370,6 @@ We would appreciate anyone who has it or even just knows the name! Thank you.
# 1996 # 1996
## 1996 august
### STATUS: doesn't work with some compilers - please provide alternative code or fix for more compilers
### Source code: [1996/august/august.c](1996/august/august.c)
### Information: [1996/august/README.md](1996/august/README.md)
[Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) fixed a segfault in
this program that prevented it from working in gcc. It is known, however, that
some compilers will compile the code so that it enters an infinite loop (an
example is in macOS).
If you can fix this we welcome it!
## 1996 gandalf ## 1996 gandalf
### STATUS: missing or dead link - please provide them ### STATUS: missing or dead link - please provide them
+6 -3
View File
@@ -1919,9 +1919,12 @@ are created by the entry or the entry decrypts the text or whatever else.
## [1996/august](1996/august/august.c) ([README.md](1996/august/README.md])) ## [1996/august](1996/august/august.c) ([README.md](1996/august/README.md]))
Cody fixed a segfault in this program that prevented it from working right but Cody fixed a segfault in this program that prevented it from working right and
he notes that some compilers compile it into an infinite loop (an example where also fixed an infinite loop in the try commands. The problem with the infinite
this happens is macOS). loop is that the file `august.oc` had to have lines starting with `#` removed
and it was not being done. After this is done with say `sed(1)` (like `sed -i''
'/^#/d' august.oc` which has been added to both the remarks and the try.sh
script as described below) the code can proceed. This problem existed in macOS.
Cody also added the [try.sh](1996/august/try.sh) script that runs all the Cody also added the [try.sh](1996/august/try.sh) script that runs all the
commands given in the try section to simplify it as there are quite a lot of commands given in the try section to simplify it as there are quite a lot of