=================================================================== RCS file: /home/cvs/OpenXM_contrib/gmp/Attic/errno.c,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.2 diff -u -p -r1.1.1.1 -r1.1.1.2 --- OpenXM_contrib/gmp/Attic/errno.c 2000/09/09 14:12:15 1.1.1.1 +++ OpenXM_contrib/gmp/Attic/errno.c 2003/08/25 16:06:00 1.1.1.2 @@ -1,6 +1,6 @@ -/* gmp_errno -- The largest and most complex file in GMP. +/* gmp_errno, __gmp_exception -- exception handling and reporting. -Copyright (C) 2000 Free Software Foundation, Inc. +Copyright 2000, 2001 Free Software Foundation, Inc. This file is part of the GNU MP Library. @@ -19,8 +19,39 @@ along with the GNU MP Library; see the file COPYING.LI the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - +#include #include "gmp.h" #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); +}