=================================================================== RCS file: /home/cvs/OpenXM_contrib/gmp/mpq/Attic/cmp_ui.c,v retrieving revision 1.1.1.2 retrieving revision 1.1.1.3 diff -u -p -r1.1.1.2 -r1.1.1.3 --- OpenXM_contrib/gmp/mpq/Attic/cmp_ui.c 2000/09/09 14:13:04 1.1.1.2 +++ OpenXM_contrib/gmp/mpq/Attic/cmp_ui.c 2003/08/25 16:06:34 1.1.1.3 @@ -2,7 +2,7 @@ negative based on if U > V, U == V, or U < V. Vn and Vd may have common factors. -Copyright (C) 1993, 1994, 1996 Free Software Foundation, Inc. +Copyright 1993, 1994, 1996, 2000, 2001, 2002 Free Software Foundation, Inc. This file is part of the GNU MP Library. @@ -25,24 +25,35 @@ MA 02111-1307, USA. */ #include "gmp-impl.h" int -#if __STDC__ _mpq_cmp_ui (const MP_RAT *op1, unsigned long int num2, unsigned long int den2) -#else -_mpq_cmp_ui (op1, num2, den2) - const MP_RAT *op1; - unsigned long int num2; - unsigned long int den2; -#endif { mp_size_t num1_size = op1->_mp_num._mp_size; mp_size_t den1_size = op1->_mp_den._mp_size; mp_size_t tmp1_size, tmp2_size; mp_ptr tmp1_ptr, tmp2_ptr; - mp_size_t num1_sign; mp_limb_t cy_limb; int cc; TMP_DECL (marker); +#if GMP_NAIL_BITS != 0 + if ((num2 | den2) > GMP_NUMB_MAX) + { + mpq_t op2; + mpq_init (op2); + mpz_set_ui (mpq_numref (op2), num2); + mpz_set_ui (mpq_denref (op2), den2); + cc = mpq_cmp (op1, op2); + mpq_clear (op2); + return cc; + } +#endif + + /* need canonical sign to get right result */ + ASSERT (den1_size > 0); + + if (den2 == 0) + DIVIDE_BY_ZERO; + if (num1_size == 0) return -(num2 != 0); if (num1_size < 0) @@ -50,17 +61,14 @@ _mpq_cmp_ui (op1, num2, den2) if (num2 == 0) return num1_size; - num1_sign = num1_size; - num1_size = ABS (num1_size); - /* NUM1 x DEN2 is either TMP1_SIZE limbs or TMP1_SIZE-1 limbs. Same for NUM1 x DEN1 with respect to TMP2_SIZE. */ if (num1_size > den1_size + 1) /* NUM1 x DEN2 is surely larger in magnitude than NUM2 x DEN1. */ - return num1_sign; - if (den1_size > num1_sign + 1) + return num1_size; + if (den1_size > num1_size + 1) /* NUM1 x DEN2 is surely smaller in magnitude than NUM2 x DEN1. */ - return -num1_sign; + return -num1_size; TMP_MARK (marker); tmp1_ptr = (mp_ptr) TMP_ALLOC ((num1_size + 1) * BYTES_PER_MP_LIMB); @@ -77,5 +85,5 @@ _mpq_cmp_ui (op1, num2, den2) cc = tmp1_size - tmp2_size != 0 ? tmp1_size - tmp2_size : mpn_cmp (tmp1_ptr, tmp2_ptr, tmp1_size); TMP_FREE (marker); - return (num1_sign < 0) ? -cc : cc; + return cc; }