xref: /original-bsd/usr.bin/pascal/libpc/EXCEPT.c (revision 3109f15a)
1 /* Copyright (c) 1982 Regents of the University of California */
2 
3 static char sccsid[] = "@(#)EXCEPT.c 1.4 10/01/83";
4 
5 #include	<signal.h>
6 
7 /*
8  * catch runtime arithmetic errors
9  */
10 EXCEPT(signum, type)
11 	int signum, type;
12 {
13 	signal(SIGFPE, EXCEPT);
14 #ifndef vax
15 	ERROR("Overflow, underflow, or division by zero in arithmetic operation\n");
16 	return;
17 #endif notvax
18 #ifdef vax
19 	/*
20 	 * The values for this switch statement come from page 12-5 of
21 	 * Volume 1 of the 1978 VAX 11/780 Architecture Handbook
22 	 */
23 	switch (type) {
24 	case FPE_INTOVF_TRAP:
25 		ERROR("Integer overflow\n");
26 		return;
27 	case FPE_INTDIV_TRAP:
28 		ERROR("Integer division by zero\n");
29 		return;
30 	case FPE_FLTOVF_TRAP:
31 	case FPE_FLTOVF_FAULT:
32 		ERROR("Real overflow\n");
33 		return;
34 	case FPE_FLTDIV_TRAP:
35 	case FPE_FLTDIV_FAULT:
36 		ERROR("Real division by zero\n");
37 		return;
38 	case FPE_FLTUND_TRAP:
39 	case FPE_FLTUND_FAULT:
40 		ERROR("Real underflow\n");
41 		return;
42 	case FPE_DECOVF_TRAP:
43 	case FPE_SUBRNG_TRAP:
44 	default:
45 		ERROR("Undefined arithmetic exception type (%d)\n", type);
46 		return;
47 	}
48 #endif vax
49 }
50