1.1 --- a/templates/signals.c Sat Jan 26 01:04:34 2019 +0100
1.2 +++ b/templates/signals.c Sat Jan 26 21:38:12 2019 +0100
1.3 @@ -16,11 +16,11 @@
1.4 this program. If not, see <http://www.gnu.org/licenses/>.
1.5 */
1.6
1.7 -#include <setjmp.h>
1.8 #include <signal.h>
1.9 #include <stdlib.h>
1.10
1.11 #include "signals.h"
1.12 +#include "progops.h"
1.13
1.14 void __signals_install_handlers()
1.15 {
1.16 @@ -35,11 +35,26 @@
1.17 sigaction(SIGFPE, &context, NULL);
1.18 }
1.19
1.20 -jmp_buf __fpe_env;
1.21 -
1.22 void __signals_fpe_handler(int signum, siginfo_t *siginfo, void *context)
1.23 {
1.24 - /* Return from setjmp with the signal number. */
1.25 + /* Return from setjmp using the signal number. */
1.26 +
1.27 + switch (siginfo->si_code)
1.28 + {
1.29 + case FPE_FLTOVF:
1.30 + __raise_overflow_error();
1.31 + break;
1.32
1.33 - longjmp(__fpe_env, siginfo->si_code);
1.34 + case FPE_FLTUND:
1.35 + __raise_underflow_error();
1.36 + break;
1.37 +
1.38 + case FPE_FLTDIV:
1.39 + __raise_zero_division_error();
1.40 + break;
1.41 +
1.42 + default:
1.43 + __raise_floating_point_error();
1.44 + break;
1.45 + }
1.46 }