From 93963607f328dea121e0b467076838d78e0469b9 Mon Sep 17 00:00:00 2001 From: Cody Boone Ferguson <53008573+xexyl@users.noreply.github.com> Date: Fri, 27 Oct 2023 03:51:17 -0700 Subject: [PATCH] Many fixes and additions to 1984/mullender Swap order of alt and original code in build/try sections so that the original code is suggested second, after alt code, with the bugs and (mis)features added to the README.md file, pointing out that it'll only work on VAX-11 / PDP-11 machines. This is added in the bugs.md (it was actually missing from the bugs.md file). The alt code (both versions, see below) now have a lower limit on the microseconds at 500 (still defaults at 10000). This is because anything much lower and it's nigh impossible to see and in some cases it won't work at all (at least in the MacBook Pro with the M1 chip). Added second alt code which is like the first except that once it times out it starts over. Running make alt will compile both alt versions. The gentab.c file that I added (found from the author) and fixed to compile could not always create code that would compile due to some characters needing to be escaped like ' and \. These are now escaped if they are encountered but there certainly could be more that I did not think of that would have to be escaped. --- 1984/mullender/.gitignore | 2 + 1984/mullender/Makefile | 11 ++-- 1984/mullender/README.md | 98 ++++++++++++++++++++------------- 1984/mullender/gentab.c | 3 +- 1984/mullender/mullender.alt.c | 2 +- 1984/mullender/mullender.alt2.c | 1 + bugs.md | 15 +++++ faq.md | 5 +- thanks-for-fixes.md | 24 +++++--- 9 files changed, 107 insertions(+), 54 deletions(-) create mode 100644 1984/mullender/mullender.alt2.c diff --git a/1984/mullender/.gitignore b/1984/mullender/.gitignore index 9be0bd5b7..8767cfb4e 100644 --- a/1984/mullender/.gitignore +++ b/1984/mullender/.gitignore @@ -1,5 +1,7 @@ mullender mullender.alt +mullender.alt2 gentab +g.c mullender.orig prog.orig diff --git a/1984/mullender/Makefile b/1984/mullender/Makefile index 7df619c68..3c4f4dbf5 100644 --- a/1984/mullender/Makefile +++ b/1984/mullender/Makefile @@ -112,8 +112,8 @@ OBJ= ${PROG}.o DATA= TARGET= ${PROG} # -ALT_OBJ= ${PROG}.alt.o -ALT_TARGET= ${PROG}.alt +ALT_OBJ= ${PROG}.alt.o ${PROG}.alt2.o +ALT_TARGET= ${PROG}.alt ${PROG}.alt2 ################# @@ -142,8 +142,11 @@ gentab: gentab.c alt: data ${ALT_TARGET} @${TRUE} -${ALT_TARGET}: ${PROG}.alt.c - ${CC} -include stdio.h -include unistd.h -include stdlib.h ${CFLAGS} $< -o $@ ${LDFLAGS} +${PROG}.alt: ${PROG}.alt.c + ${CC} -include stdio.h -include unistd.h -include stdlib.h ${CFLAGS} -Wno-implicit-int $< -o $@ ${LDFLAGS} + +${PROG}.alt2: ${PROG}.alt2.c + ${CC} -include stdio.h -include unistd.h -include stdlib.h ${CFLAGS} -Wno-implicit-int $< -o $@ ${LDFLAGS} # data files # diff --git a/1984/mullender/README.md b/1984/mullender/README.md index fbbe982c4..bdc19746c 100644 --- a/1984/mullender/README.md +++ b/1984/mullender/README.md @@ -9,56 +9,37 @@ Robbert van Renesse ## To build: ```sh -make all +make alt ``` +NOTE: the original code will not work on any system other than +[VAX-11](https://en.wikipedia.org/wiki/VAX-11) and +[PDP-11](https://en.wikipedia.org/wiki/PDP-11) and this is why we encourage you +to use the alt version instead. See [original code](#original-code) below for +the original version. ## To use: -```sh -./mullender -``` - -NOTE: if your machine is not a [VAX-11](https://en.wikipedia.org/wiki/VAX-11) -or [PDP-11](https://en.wikipedia.org/wiki/PDP-11), this program will not execute -correctly. In later years, machine dependent code was discouraged. An alternate -version that will work with other systems is provided as alternate code below. - - -## Alternate code: - -An alternate version exists which allows one to enjoy this entry on systems -other than a [VAX-11](https://en.wikipedia.org/wiki/VAX-11) or -[PDP-11](https://en.wikipedia.org/wiki/PDP-11). This version has a delay feature -as it goes so fast in modern systems. The author suggested that there was a -delay in the original code as well. - - -### Alternate build: - - -```sh -make alt -``` - - -### Alternate use: - ```sh ./mullender.alt [microseconds] + +./mullender.alt2 [microseconds] # starts over after it times out ``` -The default microseconds is 10000. This feature is so you can experiment with +The default microseconds is 10000 and it is also the lowest it can be as any +lower doesn't work very well. This feature is so you can experiment with different speeds in between writes. It can be useful if your CPU is too slow or -too fast. +too fast (:-) ). -Note that it is an `int` (argc) and it uses `atoi()` which does NOT check for +The author stated that the original version also had a delay. + +Note that the microseconds is argc and it uses `atoi()` which does NOT check for overflow! BTW: is there such a thing as too fast a CPU ? :-) Actually yes for certain code which is probably not as uncommon as you think :-). -### Alternate try: +### Try: ```sh @@ -71,6 +52,44 @@ which is probably not as uncommon as you think :-). ./mullender.alt 20000 ./mullender.alt 100000 + +./mullender.alt2 500 +# wait for 500 microseconds and see what happens +``` + +What happens if you hit enter after it reaches the end of the line? Why? + + +## Original code: + +This original code will only execute correctly if your machine is a +[VAX-11](https://en.wikipedia.org/wiki/VAX-11) or +[PDP-11](https://en.wikipedia.org/wiki/PDP-11). In the following years, 1985 on, +machine dependent code was discouraged. + + +### Original build: + + +```sh +make all +``` + +### Bugs and (Mis)features: + +This entry a listed in [bugs.md](/bugs.md) as: + +``` +STATUS: INABIAF - please **DO NOT** fix +``` + +For more detailed information see [bugs.md](/bugs.md#1984mullender-readmemd). + + +### Original use: + +```sh +./mullender ``` @@ -122,7 +141,7 @@ close to as the original as possible we used a copy of in the *fabulous* [Unix History Repo](https://github.com/dspinellis/unix-history-repo/tree/Research-Release). -### Alternate build: +### gentab build: `gentab.c` can be built like: @@ -131,18 +150,21 @@ Repo](https://github.com/dspinellis/unix-history-repo/tree/Research-Release). make gentab ``` -### Alternate use: +### gentab use: ```sh ./gentab file ``` -### Alternate try: +### gentab try: ```sh -./gentab gentab +./gentab gentab > g.c ``` +NOTE: it is highly unlikely that you will be able to compile and run the output +of `gentab` but it should at least compile. + ## Author's remarks: ### Notes from the judges: diff --git a/1984/mullender/gentab.c b/1984/mullender/gentab.c index d65fc9b84..1709214ff 100644 --- a/1984/mullender/gentab.c +++ b/1984/mullender/gentab.c @@ -40,7 +40,8 @@ main(argc, argv) char **argv; fmt = "0x%x"; break; } - if (32 <= n && n < 127 && (rand() % 4)) fmt = "'%c'"; + if (n == '\\' || n == '\'') fmt = "'\\%c'"; + else if (32 <= n && n < 127 && (rand() % 4)) fmt = "'%c'"; printf(n < 8 ? "%d" : fmt, n); printf(","); if (pos++ == 8) { diff --git a/1984/mullender/mullender.alt.c b/1984/mullender/mullender.alt.c index 4329093eb..b9dce50b1 100644 --- a/1984/mullender/mullender.alt.c +++ b/1984/mullender/mullender.alt.c @@ -1 +1 @@ -main(i,v)char**v;{i=v[1]?atoi(v[1]):10000;do write(1," :-)\b\b\b\b",9),usleep(i);while(--i);} +main(i,v)char**v;{i=v[1]?atoi(v[1]):10000;i=i<500?500:i;do write(1," :-)\b\b\b\b",9),usleep(i);while(--i);write(1,"\n",1);} diff --git a/1984/mullender/mullender.alt2.c b/1984/mullender/mullender.alt2.c new file mode 100644 index 000000000..e6d26d829 --- /dev/null +++ b/1984/mullender/mullender.alt2.c @@ -0,0 +1 @@ +main(i,v)char**v;{j:i=v[1]?atoi(v[1]):10000;i=i<500?500:i;do write(1," :-)\b\b\b\b",9),usleep(i);while(--i);write(1,"\n",1);goto j;} diff --git a/bugs.md b/bugs.md index 28f2d4577..d42c32406 100644 --- a/bugs.md +++ b/bugs.md @@ -449,6 +449,21 @@ without a newline after the `\`. This is not a bug. This entry will very likely crash or do something else if you run it without an arg. It likely won't do anything at all if the arg is not a positive number. +## [1984/mullender](1984/mullender/mullender.c) ([README.md](1984/mullender/README.md) +### STATUS: INABIAF - please **DO NOT** fix + +Although there are two alt versions added by Cody that will work in modern +systems, if you do not have a [VAX-11](https://en.wikipedia.org/wiki/VAX-11) or +[PDP-11](https://en.wikipedia.org/wiki/PDP-11) to run the original entry on it +will not work. See the README.md for details on the alternate versions. + +Cody added and fixed the [gentab.c](1984/mullender/gentab.c) which is from the +author's (or one of them, Mullender) remarks found by Cody. Cody fixed this to +compile and work (as best as he can determine: he has no VAX-11 or PDP-11 or +emulator to test it) but running the code on the binary itself produces a +`short[]` that can compile in modern systems. + + # 1985 diff --git a/faq.md b/faq.md index 693b8cfe9..2a0ecc879 100644 --- a/faq.md +++ b/faq.md @@ -241,9 +241,12 @@ can enjoy this entry. Try: ```sh make alt ./mullender.alt [microseconds] +./mullender.alt2 [microseconds] ``` -The microseconds defaults to 10000. +The microseconds defaults to 10000 but has a minimum value of 1000. The +`mullender.alt2` is like the first alt except that it will start over once the +program times out. Thank you Cody! diff --git a/thanks-for-fixes.md b/thanks-for-fixes.md index c45df9562..08352b3bf 100644 --- a/thanks-for-fixes.md +++ b/thanks-for-fixes.md @@ -166,17 +166,23 @@ cd 1984/decot ; make diff_orig_prog ## [1984/mullender](1984/mullender/mullender.c) ([README.md](1984/mullender/README.md])) -Cody provided an alternate version, an improved version of the judges, so that -everyone can enjoy it with systems that are not VAX/PDP. We also refer you to -the [FAQ](faq.md) as there are some winning entries that also let one enjoy it - -with more to them of course! +Cody provided an [alternate version](1984/mullender/mullender.alt.c), an +improved version of the judges, so that everyone can enjoy it with systems that +are not VAX/PDP. We also refer you to the [FAQ](faq.md) as there are some +winning entries that also let one enjoy it - with more to them of course! + +Cody further added the second alt version, +[mullender.alt2.c](1984/mullender/mullender.alt2.c) which is like the +[1984/mullender/mullender.alt.c](1984/mullender/mullender.alt.c) except that it +starts over after it times out. Cody also added the [gentab.c](1984/mullender/gentab.c) file, fixed to compile -and work with modern systems and so that it would create the proper array (it -had unbalanced '}'s), which the author noted in their remarks (which Cody also -found). As this file uses the old header file `a.out.h` that is not available in -all modern systems, Cody found a copy of it as to what it should have been at -the time, in the fabulous [Unix History +(and work!, though see [bugs.md](#1984mullender-readmemd) with modern systems +and so that it would create the proper array (it had unbalanced '}'s), which the +author noted in their remarks (which Cody also found). As this file uses the old +header file `a.out.h` that is not available in all modern systems, Cody found a +copy of it as to what it should have been at the time, in the fabulous [Unix +History Repo](https://github.com/dspinellis/unix-history-repo/tree/Research-Release).