diff options
author | Eugene Syromyatnikov <evgsyr@gmail.com> | 2018-11-25 10:40:47 +0100 |
---|---|---|
committer | Eugene Syromyatnikov <evgsyr@gmail.com> | 2022-09-02 17:55:13 +0200 |
commit | afb16affc274cb2456a7ce00709ab9af987b520a (patch) | |
tree | ab92a47f756d0fa45a1ea12ccfca93e211fe2ad9 | |
parent | 0ba9de7b335a2fcd71e5b924b7d21edfd135d82e (diff) | |
download | strace-afb16affc274cb2456a7ce00709ab9af987b520a.tar.gz |
printsiginfo: dispatch signal code names using an array
* src/printsiginfo.c (print_si_code): Consolidate xlat pointers
into an array, dispatch over it using si_code.
-rw-r--r-- | src/printsiginfo.c | 54 |
1 files changed, 18 insertions, 36 deletions
diff --git a/src/printsiginfo.c b/src/printsiginfo.c index bcd915881..3923b9045 100644 --- a/src/printsiginfo.c +++ b/src/printsiginfo.c @@ -80,44 +80,26 @@ printsigval(const siginfo_t *sip) static void print_si_code(const unsigned int si_code, const int si_signo) { - const char *code = xlookup(siginfo_codes, si_code); - - if (!code) { - switch (si_signo) { - case SIGTRAP: - code = xlookup(sigtrap_codes, si_code); - break; - case SIGCHLD: - code = xlookup(sigchld_codes, si_code); - break; - case SIGIO: /* SIGPOLL */ - code = xlookup(sigpoll_codes, si_code); - break; - case SIGPROF: - code = xlookup(sigprof_codes, si_code); - break; - case SIGILL: - code = xlookup(sigill_codes, si_code); - break; + static const struct xlat * const si_codes[] = { + [SIGTRAP] = sigtrap_codes, + [SIGCHLD] = sigchld_codes, + [SIGIO] = sigpoll_codes, /* SIGPOLL */ + [SIGPROF] = sigprof_codes, + [SIGILL] = sigill_codes, #ifdef SIGEMT - case SIGEMT: - code = xlookup(sigemt_codes, si_code); - break; + [SIGEMT] = sigemt_codes, #endif - case SIGFPE: - code = xlookup(sigfpe_codes, si_code); - break; - case SIGSEGV: - code = xlookup(sigsegv_codes, si_code); - break; - case SIGBUS: - code = xlookup(sigbus_codes, si_code); - break; - case SIGSYS: - code = xlookup(sigsys_codes, si_code); - break; - } - } + [SIGFPE] = sigfpe_codes, + [SIGSEGV] = sigsegv_codes, + [SIGBUS] = sigbus_codes, + [SIGSYS] = sigsys_codes, + }; + + const char *code = xlookup(siginfo_codes, si_code); + + if (!code && (unsigned int) si_signo < ARRAY_SIZE(si_codes) + && si_codes[si_signo]) + code = xlookup(si_codes[si_signo], si_code); print_xlat_ex(si_code, code, XLAT_STYLE_DEFAULT); } |