summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Syromyatnikov <evgsyr@gmail.com>2018-11-25 10:40:47 +0100
committerEugene Syromyatnikov <evgsyr@gmail.com>2022-09-02 17:55:13 +0200
commitafb16affc274cb2456a7ce00709ab9af987b520a (patch)
treeab92a47f756d0fa45a1ea12ccfca93e211fe2ad9
parent0ba9de7b335a2fcd71e5b924b7d21edfd135d82e (diff)
downloadstrace-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.c54
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);
}