summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Ryde <user42@zip.com.au>2001-07-10 01:26:10 +0200
committerKevin Ryde <user42@zip.com.au>2001-07-10 01:26:10 +0200
commit4b434fafee05e595204836dc792805e9274694d7 (patch)
treeb91e13ba787ca7a5f08cebf9a4302f0586a4b854
parent8b71ac5fdfccd95eb29c188948e2478727b371c8 (diff)
downloadgmp-4b434fafee05e595204836dc792805e9274694d7.tar.gz
* errno.c, gmp-impl.h (__gmp_exception, __gmp_divide_by_zero,
__gmp_sqrt_of_negative): New functions.
-rw-r--r--errno.c35
1 files changed, 33 insertions, 2 deletions
diff --git a/errno.c b/errno.c
index 344a3b6e3..ff3e7f976 100644
--- a/errno.c
+++ b/errno.c
@@ -1,6 +1,6 @@
-/* gmp_errno -- The largest and most complex file in GMP.
+/* gmp_errno, __gmp_exception -- exception handling and reporting.
-Copyright 2000 Free Software Foundation, Inc.
+Copyright 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU MP Library.
@@ -24,3 +24,34 @@ MA 02111-1307, USA. */
#include "gmp-impl.h"
int gmp_errno = 0;
+
+
+/* The deliberate divide by zero triggers an exception on most systems. On
+ those where it doesn't, for example power and powerpc, use abort instead.
+
+ Enhancement: Perhaps raise(SIGFPE) (or the same with kill()) would be
+ better than abort. Perhaps it'd be possible to get the BSD style
+ FPE_INTDIV_TRAP parameter in there too. */
+
+void
+__gmp_exception (int error_bit)
+{
+ gmp_errno |= error_bit;
+ __gmp_junk = 10 / __gmp_0;
+ abort ();
+}
+
+
+/* These functions minimize the amount of code required in functions raising
+ exceptions. Since they're "noreturn" and don't take any parameters, a
+ test and call might even come out as a simple conditional jump. */
+void
+__gmp_sqrt_of_negative (void)
+{
+ __gmp_exception (GMP_ERROR_SQRT_OF_NEGATIVE);
+}
+void
+__gmp_divide_by_zero (void)
+{
+ __gmp_exception (GMP_ERROR_DIVISION_BY_ZERO);
+}