cscript/cscript

98 lines
2.3 KiB
Plaintext
Raw Normal View History

2022-05-21 17:46:02 +02:00
#!/usr/bin/env sh
2022-05-21 19:32:39 +02:00
# Show help
2022-05-21 17:46:02 +02:00
if [ -z "$1" ] || [ "$1" = "--help" ] || [ "$1" = "-help" ]; then
echo "Usage:"
echo " $(basename "$0") <source.c>... <-option>... [-- <args>...]"
echo "Or at the beginning of a C file:"
echo " #!$(basename "$0") -s [<options>...]"
2022-07-25 23:00:59 +02:00
echo
echo "To debug the program in GDB, just set CSCRIPT_GDB=1."
2022-05-21 17:46:02 +02:00
exit 1
fi
2022-07-25 23:00:59 +02:00
[ -n "$CSCRIPT_GDB" ] && ([ "$CSCRIPT_GDB" = "0" ] || [ "$CSCRIPT_GDB" = "false" ]) && unset CSCRIPT_GDB
2022-05-21 17:46:02 +02:00
# Get file names, options and passed-through args
2022-05-21 19:32:39 +02:00
basedir="."
2022-05-21 17:46:02 +02:00
files=""
2022-09-10 19:19:48 +02:00
opts="-Wall
-pedantic"
2022-05-21 17:46:02 +02:00
shebang_mode=""
at_args=""
args=""
arg() {
if [ -z "$shebang_mode" ] && [ -n "$at_args" ]; then
args="$(printf "%s\n%s" "$args" "$1")"
2022-05-21 17:46:02 +02:00
elif [ "$shebang_mode" = "next_is_file" ]; then
2022-05-21 19:32:39 +02:00
basedir="$(dirname "$1")"
files="$(printf "%s\n%s" "$files" "$(basename "$1")")"
2022-05-21 17:46:02 +02:00
shebang_mode=1
elif [ -n "$shebang_mode" ]; then
args="$(printf "%s\n%s" "$args" "$1")"
2022-05-21 17:46:02 +02:00
else
case "$1" in
# Pass through following args
--)
at_args=1
;;
# Shebang mode (shebang args are not automatically separated;
# the following arg is always the script filename)
-s*)
for a in $(eval "echo $(echo "$1" | cut -c3-)"); do
arg "$a"
done
shebang_mode="next_is_file"
;;
# Add option
-*)
opts="$(printf "%s\n%s" "$opts" "$1")"
2022-05-21 17:46:02 +02:00
;;
# Add source file
*)
files="$(printf "%s\n%s" "$files" "$1")"
2022-05-21 17:46:02 +02:00
;;
esac
fi
}
for a in "$@"; do
arg "$a"
done
2022-07-25 23:00:59 +02:00
[ -n "$CSCRIPT_GDB" ] && opts="$(printf "%s\n%s" "$opts" "-ggdb")"
2022-05-21 17:46:02 +02:00
# Remove empty lines
files="$(printf "%s" "$files" | grep '.')"
opts="$(printf "%s" "$opts" | grep '.')"
args="$(printf "%s" "$args" | grep '.')"
2022-05-21 17:46:02 +02:00
2022-05-21 19:32:39 +02:00
cd "$basedir"
# Check for invalid files
2022-05-21 17:46:02 +02:00
[ -z "$files" ] && echo "No input files" && exit 1
2022-05-21 19:32:39 +02:00
while IFS= read -r l; do
[ ! -f "$l" ] && [ ! -L "$l" ] &&
echo "Source file '$l' does not exist" &&
exit 1
done << EOF
$files
EOF
2022-05-21 17:46:02 +02:00
# Compile and run C program
cleanup() {
printf "%s" "$files" | xargs -d'\n' sed "s@^//#!@#!@g" -i
2022-05-21 17:46:02 +02:00
rm -f "$tmpfile"
}
tmpfile="$(mktemp -t "cscript.XXXXXXXXXX")"
printf "%s" "$files" | xargs -d'\n' sed "s@^#!@//#!@g" -i
2022-05-21 17:46:02 +02:00
trap 'cleanup; exit 130' INT
2022-09-10 19:19:48 +02:00
if ! printf "%s\n%s" "$files" "$opts" | xargs -d'\n' cc -o "$tmpfile"; then
2022-05-21 17:46:02 +02:00
cleanup
exit 1
fi
2022-07-25 23:00:59 +02:00
if [ -n "$CSCRIPT_GDB" ]; then
printf "%s" "$args" | xargs -o -d'\n' gdb --args "$tmpfile"
else
2022-09-10 19:21:13 +02:00
printf "%s" "$args" | xargs -o -d'\n' "$tmpfile"
2022-07-25 23:00:59 +02:00
fi
2022-05-21 17:46:02 +02:00
trap - INT
cleanup