summary refs log tree commit diff
path: root/bin/c.sh
diff options
context:
space:
mode:
Diffstat (limited to 'bin/c.sh')
-rw-r--r--bin/c.sh47
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