#!/bin/sh # See LICENSE file for copyright and license details. 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'