From c131f122778c62f920a99bbf854ced4a37ee8b03 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sun, 3 Dec 2023 19:23:35 +0100 Subject: First commit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- util/make-enum | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100755 util/make-enum (limited to 'util/make-enum') 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' -- cgit v1.2.3-70-g09d2