From 9104ac41f3fc6ee166f53234e57375dedb64fa82 Mon Sep 17 00:00:00 2001
From: Cody Boone Ferguson <53008573+xexyl@users.noreply.github.com>
Date: Sun, 17 Dec 2023 10:35:25 -0800
Subject: [PATCH] Add 2019/yang/try.sh, update bugs.md + formatting
The try.sh script checks that the terminal size is large enough for two
files, the prog.c (last check) and sample_input.txt (provided by the
author). If it's too small for either it exits as it can't work. The
added ioccc.txt is very short in column and rows so that should not be a
problem (except in very extreme cases?).
The sample_input.txt file had trailing newlines removed because it
showed differences in output otherwise (and shouldn't).
The bugs.md was updated - add INABIAF for this entry.
Format/typo check README.md file.
---
2019/yang/.gitignore | 9 ++
2019/yang/README.md | 72 +++++++---------
2019/yang/ioccc.txt | 4 +
2019/yang/sample_input.txt | 2 -
2019/yang/try.sh | 168 +++++++++++++++++++++++++++++++++++++
bugs.md | 15 ++++
thanks-for-help.md | 8 ++
7 files changed, 236 insertions(+), 42 deletions(-)
create mode 100644 2019/yang/ioccc.txt
create mode 100755 2019/yang/try.sh
diff --git a/2019/yang/.gitignore b/2019/yang/.gitignore
index 946050e23..996d2b318 100644
--- a/2019/yang/.gitignore
+++ b/2019/yang/.gitignore
@@ -9,6 +9,15 @@ e
indent
indent.c
indent.o
+input.txt
+original.txt
output.txt
+output1.txt
+output2.txt
prog
prog.orig
+scrambled.txt
+scrambled1.txt
+scrambled2.txt
+scrambled3.txt
+unscrambled.txt
diff --git a/2019/yang/README.md b/2019/yang/README.md
index fc5a43c6d..60259e2fd 100644
--- a/2019/yang/README.md
+++ b/2019/yang/README.md
@@ -5,6 +5,17 @@ make
```
+### Bugs and (Mis)features:
+
+The current status of this entry is:
+
+```
+STATUS: INABIAF - please **DO NOT** fix
+```
+
+For more detailed information see [2019 yang in bugs.md](/bugs.md#2019-yang).
+
+
## To use:
```sh
@@ -25,28 +36,7 @@ cat a b c d | ./prog
### Try:
```sh
-./prog prog.c a b c d e
-
-cat a
-
-cat b
-
-cat c
-
-cat d
-
-cat e
-
-cat a b c d e | ./prog
-
-cat a b c d e | ./prog | diff - prog.c
-
-./prog prog.c | ruby prog.c
-
-
-./prog violet.c | ruby prog.c
-
-./prog violet.c | ruby violet.c
+./try.sh
```
@@ -108,13 +98,13 @@ can simply use `cat` to unscramble the output text.
cat output.txt
```
-It might seem like nothing was scrambled, but you can try passing the
-output through `strings(1)` and see that most of the original strings
-are gone. What happened is that the original text has been shuffled
-with ANSI cursor positioning codes inserted such that characters are
-printed in random order. This effect is more visible if there is a
-delay after each character is printed. For convenience, a utility is
-included in the source to output characters slowly:
+It might seem like nothing was scrambled, but you can try passing the output
+through `strings(1)` and see that most of the original strings are gone. What
+happened is that the original text has been shuffled with ANSI cursor
+positioning codes inserted in such a way that characters are printed in random
+order. This effect is more visible if there is a delay after each character is
+printed. For convenience, a utility is included in the source to output
+characters slowly:
```sh
./prog input.txt | ruby prog.c
@@ -146,14 +136,14 @@ For files that are larger than your terminal window, `cat` will not be
sufficient for unscrambling because any scrolling causes the character
positions to be misaligned. But fear not, this utility also includes
unscrambling functionality. If no argument is specified, input will
-be read through stdin and unscrambled to stdout:
+be read through `stdin` and unscrambled to `stdout`:
```sh
./prog < scrambled.txt > unscrambled.txt
```
Where this is useful is that if you scramble the input to multiple
-files and unscramble each output files individually, those output
+files and unscramble each output file individually, those output
files can be printed on transparencies and distributed separately.
```sh
@@ -181,8 +171,8 @@ A simple text scrambling utility might not have required a screenful
of code, but this particular one natively supports UTF-8.
Specifically: individual UTF-8 byte sequences will not be split into
broken ones, and the utility is aware of full-width versus half-width
-differences such that cursor is positioned correctly for most CJK
-input. `sample_input.txt` demonstrates this feature with a mix of
+differences such that the cursor is positioned correctly for most CJK
+input. [sample_input.txt](sample_input.txt) demonstrates this feature with a mix of
Basic Latin and Japanese characters.
Output cursor positions will most definitely be wrong for inputs
@@ -191,17 +181,19 @@ be possible to unscramble those text back to the original using this
same utility, since the utility is self-consistent in how cursor
positions are handled.
+
### Error handling
If any file can not be opened for reading or writing, an error is
-printed to stderr, and the utility will exit with nonzero status.
+printed to `stderr`, and the utility will exit with nonzero status.
If there isn't enough memory, the utility will likely crash.
-If input contains CR-LF end of line sequences, those CRs are silently
+If input contains CR-LF end of line sequences, those `CR`s are silently
dropped. In fact, most control codes are silently ignored except line
feeds (preserved) and tabs (expanded to 8 spaces).
+
### Compatibility
Verified to work and compiles without warnings on these environments:
@@ -212,13 +204,13 @@ Verified to work and compiles without warnings on these environments:
* clang 5.0.1 on Cygwin
* gcc 4.8.4 on Linux
+
### Full version
-I tried really hard to make `prog.c` fit in a 80x25 terminal without
-wrapping. If I were not constrained by space, I would have made an
-ASCII art out of it. `violet.c` is that program, and also comes with
-the minor benefit of supporting lines longer than a million columns
-depending on `sizeof(int)`.
+I tried really hard to make `prog.c` fit in a 80x25 terminal without wrapping.
+If I were not constrained by space, I would have made an ASCII art out of it.
+[violet.c](violet.c) is that program, and also comes with the minor benefit of
+supporting lines longer than a million columns depending on `sizeof(int)`.
Violet is named after [Violet
Evergarden](https://en.wikipedia.org/wiki/Violet_Evergarden) in the story with
diff --git a/2019/yang/ioccc.txt b/2019/yang/ioccc.txt
new file mode 100644
index 000000000..5dbe22594
--- /dev/null
+++ b/2019/yang/ioccc.txt
@@ -0,0 +1,4 @@
+IOCCC 2019 Most
+in need of
+transparency
+by Don Yang!
diff --git a/2019/yang/sample_input.txt b/2019/yang/sample_input.txt
index 58a42173f..981ab2bdb 100644
--- a/2019/yang/sample_input.txt
+++ b/2019/yang/sample_input.txt
@@ -11,5 +11,3 @@
あぁ おおo ぉオオ しい シシシシシシ CCCCc cCc
ぁあ おぉおぉお しぃしぃしっ シシシシ CCCCccCCC
(*゚ー゚)
-
-
diff --git a/2019/yang/try.sh b/2019/yang/try.sh
new file mode 100755
index 000000000..40efb17bd
--- /dev/null
+++ b/2019/yang/try.sh
@@ -0,0 +1,168 @@
+#!/usr/bin/env bash
+#
+# try.sh - demonstrate IOCCC winner 2019/yang
+#
+
+# make sure CC is set so that when we do make CC="$CC" it isn't empty. Doing it
+# this way allows us to have the user specify a different compiler in an easy
+# way.
+if [[ -z "$CC" ]]; then
+ CC="cc"
+fi
+
+make CC="$CC" all >/dev/null || exit 1
+
+# clear screen after compilation so that only the entry is shown
+clear
+
+read -r -n 1 -p "Press any key to scramble ioccc.txt into five files: "
+echo 1>&2
+echo "$ ./prog ioccc.txt a b c d e" 1>&2
+./prog ioccc.txt a b c d e
+
+read -r -n 1 -p "Press any key to unscramble part a with cat: "
+clear
+cat a
+
+read -r -n 1 -p "Press any key to unscramble part b with cat: "
+clear
+cat b
+
+read -r -n 1 -p "Press any key to unscramble part c with cat: "
+clear
+cat c
+
+read -r -n 1 -p "Press any key to unscramble part d with cat: "
+clear
+cat d
+
+read -r -n 1 -p "Press any key to unscramble part e with cat: "
+clear
+cat e
+
+echo "$ cat a b c d e | ./prog" 1>&2
+read -r -n 1 -p "Press any key to unscramble all parts: "
+echo 1>&2
+cat a b c d e | ./prog
+echo 1>&2
+
+echo "$ cat a b c d e | ./prog | diff - ioccc.txt" 1>&2
+read -r -n 1 -p "Press any key to continue: "
+echo 1>&2
+cat a b c d e | ./prog | diff -s - ioccc.txt
+
+LINES="$(tput lines)"
+COLS="$(tput cols)"
+if [[ "$COLS" -lt 75 || "$LINES" -lt 13 ]]; then
+ # if screen size < 75 x 13 then exit
+ exit 0
+fi
+
+read -r -n 1 -p "Press any key to scramble sample_input.txt into five files: "
+echo 1>&2
+echo "$ ./prog sample_input.txt a b c d e" 1>&2
+./prog sample_input.txt a b c d e
+
+read -r -n 1 -p "Press any key to unscramble part a with cat: "
+clear
+cat a
+
+read -r -n 1 -p "Press any key to unscramble part b with cat: "
+clear
+cat b
+
+read -r -n 1 -p "Press any key to unscramble part c with cat: "
+clear
+cat c
+
+read -r -n 1 -p "Press any key to unscramble part d with cat: "
+clear
+cat d
+
+read -r -n 1 -p "Press any key to unscramble part e with cat: "
+clear
+cat e
+
+echo "$ cat a b c d e | ./prog" 1>&2
+read -r -n 1 -p "Press any key to unscramble all parts: "
+echo 1>&2
+cat a b c d e | ./prog
+echo 1>&2
+
+echo "$ cat a b c d e | ./prog | diff - sample_input.txt" 1>&2
+read -r -n 1 -p "Press any key to continue: "
+echo 1>&2
+cat a b c d e | ./prog | diff -s - sample_input.txt
+
+
+if [[ "$COLS" -lt 80 || "$LINES" -lt 25 ]]; then
+ # if screen size < 80 x 25 then exit
+ exit 0
+fi
+
+read -r -n 1 -p "Press any key to run: cat prog.c: "
+echo 1>&2
+cat prog.c
+
+echo 1>&2
+read -r -n 1 -p "Press any key to scramble prog.c into five files: "
+echo 1>&2
+echo "$ ./prog prog.c a b c d e" 1>&2
+./prog prog.c a b c d e
+
+read -r -n 1 -p "Press any key to unscramble part a with cat: "
+clear
+cat a
+
+read -r -n 1 -p "Press any key to unscramble part b with cat: "
+clear
+cat b
+
+read -r -n 1 -p "Press any key to unscramble part c with cat: "
+clear
+cat c
+
+read -r -n 1 -p "Press any key to unscramble part d with cat: "
+clear
+cat d
+
+read -r -n 1 -p "Press any key to unscramble part e with cat: "
+clear
+cat e
+
+echo "$ cat a b c d e | ./prog" 1>&2
+read -r -n 1 -p "Press any key to unscramble all parts: "
+echo 1>&2
+cat a b c d e | ./prog
+echo 1>&2
+
+echo "$ cat a b c d e | ./prog | diff - prog.c" 1>&2
+read -r -n 1 -p "Press any key to continue: "
+echo 1>&2
+cat a b c d e | ./prog | diff -s - prog.c
+
+# For the next three we have to see if ruby is installed
+RUBY="$(type -P ruby)"
+
+if [[ -n "$RUBY" ]]; then
+ read -r -p "Do you want to see the slow scrambling: ./prog prog.c | ruby prog.c (Y/N)? "
+ if [[ "$REPLY" == "y" || "$REPLY" == "Y" ]]; then
+ echo "This may take a while, hit ctrl-c to exit script." 1>&2
+ echo 1>&2
+ ./prog prog.c | ruby prog.c
+ fi
+
+ read -r -p "Do you want to see the slow scrambling: ./prog violet.c | ruby prog.c (Y/N)? "
+ if [[ "$REPLY" == "y" || "$REPLY" == "Y" ]]; then
+ echo "This may take a while, hit ctrl-c to exit script." 1>&2
+ echo 1>&2
+ ./prog violet.c | ruby prog.c
+ fi
+
+ read -r -p "Do you want to see the slow scrambling: ./prog violet.c | ruby violet.c (Y/N)? "
+ if [[ "$REPLY" == "y" || "$REPLY" == "Y" ]]; then
+ echo "This may take a while, hit ctrl-c to exit script." 1>&2
+ echo 1>&2
+ ./prog violet.c | ruby violet.c
+ fi
+fi
diff --git a/bugs.md b/bugs.md
index 8a5cd26b4..d889ccef4 100644
--- a/bugs.md
+++ b/bugs.md
@@ -3401,6 +3401,21 @@ This program will not validate input so it might fail or get stuck if invoked
erroneously.
+## 2019 yang
+
+### STATUS: INABIAF - please **DO NOT** fix
+### Source code: [2019/yang/prog.c](2019/yang/prog.c)
+### Information: [2019/yang/README.md](2019/yang/README.md)
+
+The author noted that if the program runs out of memory it is likely to crash.
+
+The author also stated that 'if input contains CR-LF end of line sequences,
+those `CR`s are silently dropped. In fact, most control codes are silently
+ignored except line feeds (preserved) and tabs (expanded to 8 spaces).'
+
+
+
+
# 2020
diff --git a/thanks-for-help.md b/thanks-for-help.md
index c6a66af9e..032ae1525 100644
--- a/thanks-for-help.md
+++ b/thanks-for-help.md
@@ -4212,6 +4212,14 @@ He also added the script [try.sh](/2019/karns/try.sh) to showcase the entry a
bit more easily.
+## [2019/yang](/2019/yang/prog.c) ([README.md](/2019/yang/README.md]))
+
+[Cody](#cody) added the [try.sh](/2019/yang/try.sh) script which also involved
+slightly updating the [sample_input.txt](/2019/yang/sample_input.txt) file
+(removed trailing newlines as it resulted in `diff` showing differences when it
+shouldn't) and adding the [ioccc.txt](/2019/yang/ioccc.txt) file.
+
+
# 2020