summaryrefslogtreecommitdiffstats
path: root/util/make-enum
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xutil/make-enum45
1 files changed, 45 insertions, 0 deletions
diff --git a/util/make-enum b/util/make-enum
new file mode 100755
index 0000000..7b63e3c
--- /dev/null
+++ b/util/make-enum
@@ -0,0 +1,45 @@
+#!/bin/sh
+
+set -e
+
+test $# -ge 1
+
+lowercase () { printf '%s\n' "$*" | tr '[A-Z]' '[a-z]'; }
+
+symbols="$(lowercase "$1")"
+shift 1
+
+validate () {
+ if (( -$1 > 0x7FFF )) || (( +$1 > 0x7FFF )); then
+ printf 'Invalid enum value: %s = %x (beyond 16-bit signed integer)\n' $2 $1 >&2
+ return 1
+ else
+ return 0
+ fi
+}
+
+printf 'static const char *\n'
+printf 'extract_symbol_%s(struct libsyscalls_symbol_printer_data *data, ' "$symbols"
+printf 'unsigned long long int *valuep, char *fallback_out) /* 1 */\n'
+printf '{\n'
+printf ' const char *ret;\n'
+printf ' switch ((signed long long int)*valuep) {\n'
+while read name value; do
+validate $value $name
+printf ' case %i: ret = "%s"; break;\n' $value $name
+done
+printf ' default:\n'
+if test $# -ge 1; then
+ for use; do
+printf ' if ((ret = extract_symbol_%s(data, valuep, fallback_out))) return ret;\n' "$(lowercase "$use")"
+ done
+fi
+printf ' return NULL;\n'
+printf ' }\n'
+printf ' *valuep = 0;\n'
+if test $# = 0; then
+printf ' (void) data;\n'
+printf ' (void) fallback_out;\n'
+fi
+printf ' return ret;\n'
+printf '}\n'