diff options
author | Eugene Syromyatnikov <evgsyr@gmail.com> | 2018-11-25 10:40:47 +0100 |
---|---|---|
committer | Eugene Syromyatnikov <evgsyr@gmail.com> | 2018-11-25 10:40:47 +0100 |
commit | 7bfd2375ff109f7a16b3cee06fbd2ca5c2e2dcd8 (patch) | |
tree | ecd78dbe03bce9dd7fdce764febe9b3634a06758 | |
parent | 57098d88c20c071312124df65041f30064658fcf (diff) | |
download | strace-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.c | 54 |
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); } |