shellcheck fixes in 2020/kurdyukov2
try.sh now runs makegif.sh. Fix makegif.sh to first compile the program, allow one to specify CC and convert and check that the output file was created. In the case convert(1) is not found or it fails to generate the output file it suggests the user look at the FAQ entry about ImageMagick.
This commit is contained in:
1 parent
77a65587ff
commit
58fdcfdc2b
5 files changed
+72
-16
No files matched your search
@@ -212,7 +212,7 @@ clean:
|
||||
|
||||
clobber: clean
|
||||
${RM} -f ${TARGET} ${ALT_TARGET}
|
||||
${RM} -rf *.dSYM *.gif *.ppm out*.jpg
|
||||
${RM} -rf *.dSYM *.gif *.ppm out*.jpg gif/
|
||||
@-if [ -e sandwich ]; then \
|
||||
${RM} -f sandwich; \
|
||||
echo 'ate sandwich'; \
|
||||
|
||||
@@ -19,6 +19,7 @@ make
|
||||
./prog 1000 selfie.jpg output.jpg
|
||||
# Admire your portrait in cubist style
|
||||
|
||||
# Also try:
|
||||
./try.sh
|
||||
```
|
||||
|
||||
@@ -98,7 +99,7 @@ After that’s installed you need to run make with these options:
|
||||
make LDFLAGS="-I/opt/local/include -L/opt/local/lib"
|
||||
```
|
||||
|
||||
### Building on macOS with HomeBrew
|
||||
### Building on macOS with Homebrew
|
||||
|
||||
First, make sure you have the compiler tools installed e.g. by:
|
||||
|
||||
@@ -106,7 +107,7 @@ First, make sure you have the compiler tools installed e.g. by:
|
||||
sudo xcode-select --install
|
||||
```
|
||||
|
||||
Make sure you install [HomeBrew](https://brew.sh).
|
||||
Make sure you install [Homebrew](https://brew.sh).
|
||||
|
||||
Then:
|
||||
|
||||
@@ -139,9 +140,11 @@ You can use this command to make a GIF from output images (uses ImageMagick).
|
||||
For instance after running the command suggested by the judges:
|
||||
|
||||
```sh
|
||||
convert -delay 10 -dither none -loop 0 $(ls out*.jpg | sort -V) $(ls out*.jpg | sort -rV) +map out.gif
|
||||
convert -delay 10 -dither none -loop 0 $(find . -maxdepth 1 -type f -name '*jpg' | sort -V) $(find . -maxdepth 1 -type f -name '*jpg' | sort -rV) +map out.gif
|
||||
```
|
||||
|
||||
NOTE: the above is done in the [try.sh](try.sh) script.
|
||||
|
||||
Also provided `makegif.sh` to aid with GIF creation.
|
||||
|
||||
|
||||
|
||||
+45
-10
@@ -4,28 +4,63 @@ output=${2:-"output.gif"}
|
||||
prog=${3:-"./prog"}
|
||||
ext="${image##*.}"
|
||||
dir="gif"
|
||||
[ $# -lt 3 ] && [ "$ext" = "png" -o "$ext" = "ppm" ] && prog="./prog_$ext"
|
||||
[ -f "$image" ] || {
|
||||
[[ $# -lt 3 ]] && [[ "$ext" = "png" || "$ext" = "ppm" ]] && prog="./prog_$ext"
|
||||
[[ -f "$image" ]] || {
|
||||
echo "Usage: $0 image.jpg output.gif ./prog"
|
||||
echo "Dependencies: ImageMagick, bc (basic calculator)"
|
||||
echo "Note: don't use large images (dimensions above 1000), ImageMagick may fail."
|
||||
echo "Uses \"gif\" directory for temporary files."
|
||||
exit 1
|
||||
}
|
||||
# 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.
|
||||
[[ -z "$CC" || ! -f "$CC" || ! -x "$CC" ]] && CC="cc"
|
||||
make CC="$CC" all >/dev/null || exit 1
|
||||
|
||||
mkdir -p "$dir"
|
||||
|
||||
i=8 ; x=$i ; j=0
|
||||
while [ $x -le 16000 ]; do
|
||||
while [[ $x -le 16000 ]]; do
|
||||
x="$(echo "a=$i*e(l(2)/4*$j)+0.5;scale=0;a/1" | bc -l)"
|
||||
echo "### $j : $x"
|
||||
list[j]="$dir/out$j.$ext"
|
||||
"$prog" "$x" "$image" "$dir/out$j.$ext" ; j=$((j+1))
|
||||
done
|
||||
i=$j ; j=$((j-2))
|
||||
while [ $j -ge 1 ]; do
|
||||
### Uncomment the following line if you want to make a GIF in an image editor such as GIMP
|
||||
# cp "$dir/out$j.$ext" "$dir/out$i.$ext"
|
||||
list[i]="$dir/out$j.$ext"
|
||||
i=$((i+1)) ; j=$((j-1))
|
||||
done
|
||||
convert -delay 10 -dither none -loop 0 "${list[@]}" +map "$output"
|
||||
while [[ $j -ge 1 ]]; do
|
||||
### Uncomment the following line if you want to make a GIF in an image editor such as GIMP
|
||||
# cp "$dir/out$j.$ext" "$dir/out$i.$ext"
|
||||
|
||||
list[i]="$dir/out$j.$ext"
|
||||
i=$((i+1)) ; j=$((j-1))
|
||||
done
|
||||
|
||||
# try finding convert(1) from ImageMagick if CONVERT not passed to script or is
|
||||
# not an executable file
|
||||
convert_error()
|
||||
{
|
||||
echo 1>&2
|
||||
echo "Warning: $CONVERT failed to generate out.gif. Is $CONVERT convert(1) from ImageMagick?" 1>&2
|
||||
echo "See: https://github.com/ioccc-src/temp-test-ioccc/blob/master/faq.md#imagemagick." 1>&2
|
||||
echo 1>&2
|
||||
echo "Tip: if you have it in a different path, try: CONVERT=path ./try.sh" 1>&2
|
||||
echo 1>&2
|
||||
}
|
||||
[[ -z "$CONVERT" || ! -f "$CONVERT" || ! -x "$CONVERT" ]] && CONVERT="$(type -P convert)"
|
||||
if [[ -z "$CONVERT" || ! -f "$CONVERT" || ! -x "$CONVERT" ]]; then
|
||||
echo 1>&2
|
||||
echo "Could not fine convert(1) from ImageMagick." 1>&2
|
||||
echo "See: https://github.com/ioccc-src/temp-test-ioccc/blob/master/faq.md#imagemagick." 1>&2
|
||||
echo 1>&2
|
||||
else
|
||||
"$CONVERT" -delay 10 -dither none -loop 0 "${list[@]}" +map "$output"
|
||||
if [[ ! -f "$output" ]]; then
|
||||
convert_error
|
||||
else
|
||||
echo 1>&2
|
||||
echo "Now look at $output with a graphics viewer that can show animated GIFs." 1>&2
|
||||
echo "Warning: includes flashing colours." 1>&2
|
||||
echo 1>&2
|
||||
fi
|
||||
fi
|
||||
+14
-2
@@ -27,6 +27,8 @@ convert_error()
|
||||
echo 1>&2
|
||||
}
|
||||
|
||||
# remove ppm files that we create
|
||||
rm -f random.ppm output.ppm
|
||||
echo "$ (echo P6 1024 1024 255; dd if=/dev/urandom bs=3M count=1) > random.ppm" 1>&2
|
||||
(echo P6 1024 1024 255; dd if=/dev/urandom bs=3M count=1) > random.ppm
|
||||
echo "Look at random.ppm. Do you see any patterns?" 1>&2
|
||||
@@ -54,8 +56,13 @@ if [[ -n "$CONVERT" ]]; then
|
||||
echo 1>&2
|
||||
read -r -n 1 -p "Press any key to create GIF: "
|
||||
echo 1>&2
|
||||
echo "$ $CONVERT -delay 10 -dither none -loop 0 $(ls out*.jpg | sort -V) $(ls out*.jpg | sort -rV) +map out.gif" 1>&2
|
||||
"$CONVERT" -delay 10 -dither none -loop 0 $(ls out*.jpg | sort -V) $(ls out*.jpg | sort -rV) +map out.gif
|
||||
echo "$ $CONVERT -delay 10 -dither none -loop 0 $(find . -maxdepth 1 -type f -name '*jpg' | sort -V) $(find . -maxdepth 1 -type f -name '*jpg' | sort -rV) +map out.gif" 1>&2
|
||||
# We want word splitting here so disable shellcheck warning SC2046.
|
||||
#
|
||||
# SC2046 (warning): Quote this to prevent word splitting.
|
||||
# https://www.shellcheck.net/wiki/SC2046
|
||||
# shellcheck disable=SC2046
|
||||
"$CONVERT" -delay 10 -dither none -loop 0 $(find . -maxdepth 1 -type f -name '*jpg' | sort -V) $(find . -maxdepth 1 -type f -name '*jpg' | sort -rV) +map out.gif
|
||||
if [[ ! -f out.gif ]]; then
|
||||
convert_error
|
||||
else
|
||||
@@ -63,6 +70,11 @@ if [[ -n "$CONVERT" ]]; then
|
||||
echo "Now look at out.gif with a graphics viewer that can show animated GIFs." 1>&2
|
||||
echo "Warning: includes flashing colours." 1>&2
|
||||
fi
|
||||
|
||||
read -r -n 1 -p "Press any key to run: ./makegif.sh sample.jpg kurdyukov2.gif ./prog: "
|
||||
echo 1>&2
|
||||
./makegif.sh sample.jpg kurdyukov2.gif ./prog
|
||||
echo 1>&2
|
||||
else
|
||||
echo 1>&2
|
||||
echo "Could not fine convert(1) from ImageMagick." 1>&2
|
||||
|
||||
@@ -4833,6 +4833,12 @@ the user has installed the appropriate library with
|
||||
[MacPorts](https://www.macports.org) (with the default MacPorts prefix
|
||||
`/opt/local`).
|
||||
|
||||
Cody also fixed the script [makegif.sh](2020/kurdyukov2/makegif.sh) in a variety
|
||||
of ways: shellcheck(1), make sure the program is compiled first (allowing one to
|
||||
specify which compiler to use with `CC=foo ./makegif.sh ...`), checking that
|
||||
`convert(1)` is found and that it worked properly (linking to the proper FAQ
|
||||
entry if not installed or it fails).
|
||||
|
||||
|
||||
## <a name="2020_kurdyukov3"></a>[2020/kurdyukov3](/2020/kurdyukov3/prog.c) ([README.md](/2020/kurdyukov3/README.md))
|
||||
|
||||
|
||||
Reference in new issue
Block a user