summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEugene Syromyatnikov <evgsyr@gmail.com>2018-11-25 10:40:47 +0100
committerEugene Syromyatnikov <evgsyr@gmail.com>2018-11-25 10:40:47 +0100
commit7bfd2375ff109f7a16b3cee06fbd2ca5c2e2dcd8 (patch)
treeecd78dbe03bce9dd7fdce764febe9b3634a06758
parent57098d88c20c071312124df65041f30064658fcf (diff)
downloadstrace-7bfd2375ff109f7a16b3cee06fbd2ca5c2e2dcd8.tar.gz
printsiginfo: dispatch signal code names using an array
* printsiginfo.c (print_si_code): Consolidate xlat pointers into an array, dispatch over it using si_code.
-rw-r--r--printsiginfo.c54
1 files changed, 18 insertions, 36 deletions
diff --git a/printsiginfo.c b/printsiginfo.c
index 9b9a4df4c..d10dc4516 100644
--- a/printsiginfo.c
+++ b/printsiginfo.c
@@ -92,44 +92,26 @@ printsigval(const siginfo_t *sip)
static void
print_si_code(int si_signo, unsigned int si_code)
{
- 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 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,
+ [SIGPOLL] = sigpoll_codes,
+ [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);
}