diff options
Diffstat (limited to 'bin/c.sh')
-rw-r--r-- | bin/c.sh | 47 |
1 files changed, 42 insertions, 5 deletions
diff --git a/bin/c.sh b/bin/c.sh index 153a2f94..ff059437 100644 --- a/bin/c.sh +++ b/bin/c.sh @@ -2,7 +2,7 @@ set -eu temp=$(mktemp -d) -trap 'rm -r "$temp"' EXIT +trap 'rm -r "${temp}"' EXIT exec 3>>"${temp}/run.c" @@ -23,15 +23,19 @@ cat >&3 <<EOF #include <wchar.h> #include <wctype.h> +#include <dirent.h> #include <fcntl.h> #include <strings.h> #include <unistd.h> EOF -while getopts 'e:i:' opt; do - case "$opt" in +expr= +type= +while getopts 'e:i:t' opt; do + case "${opt}" in (e) expr=$OPTARG;; (i) echo "#include <${OPTARG}>" >&3;; + (t) type=1;; (?) exit 1;; esac done @@ -44,14 +48,45 @@ int main(int argc, char *argv[]) { $*; EOF -if [ -n "${expr:-}" ]; then +if [ -n "${type}" ]; then + cat >&3 <<EOF + printf( + _Generic( + ${expr}, + char: "(char) ", + char *: "(char *) ", + const char *: "(const char *) ", + wchar_t *: "(wchar_t *) ", + const wchar_t *: "(const wchar_t *) ", + signed char: "(signed char) ", + short: "(short) ", + int: "(int) ", + long: "(long) ", + long long: "(long long) ", + unsigned char: "(unsigned char) ", + unsigned short: "(unsigned short) ", + unsigned int: "(unsigned int) ", + unsigned long: "(unsigned long) ", + unsigned long long: "(unsigned long long) ", + float: "(float) ", + double: "(double) ", + long double: "(long double) ", + default: "(void *) " + ) + ); +EOF +fi + +if [ -n "${expr}" ]; then cat >&3 <<EOF printf( _Generic( ${expr}, char: "%c\n", char *: "%s\n", + const char *: "%s\n", wchar_t *: "%ls\n", + const wchar_t *: "%ls\n", signed char: "%hhd\n", short: "%hd\n", int: "%d\n", @@ -62,7 +97,9 @@ if [ -n "${expr:-}" ]; then unsigned int: "%u\n", unsigned long: "%lu\n", unsigned long long: "%llu\n", + float: "%g\n", double: "%g\n", + long double: "%Lg\n", default: "%p\n" ), ${expr} @@ -70,7 +107,7 @@ if [ -n "${expr:-}" ]; then EOF fi -if [ $# -eq 0 -a -z "${expr:-}" ]; then +if [ $# -eq 0 -a -z "${expr}" ]; then cat >&3 fi |