=================================================================== RCS file: /home/cvs/OpenXM_contrib/gmp/mpz/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/mpz/Attic/cmp_ui.c 2000/09/09 14:12:50 1.1.1.2 +++ OpenXM_contrib/gmp/mpz/Attic/cmp_ui.c 2003/08/25 16:06:33 1.1.1.3 @@ -1,7 +1,8 @@ /* mpz_cmp_ui.c -- Compare a mpz_t a with an mp_limb_t b. Return positive, zero, or negative based on if a > b, a == b, or a < b. -Copyright (C) 1991, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. +Copyright 1991, 1993, 1994, 1995, 1996, 2001, 2002 Free Software Foundation, +Inc. This file is part of the GNU MP Library. @@ -24,30 +25,46 @@ MA 02111-1307, USA. */ #include "gmp-impl.h" int -#if __STDC__ _mpz_cmp_ui (mpz_srcptr u, unsigned long int v_digit) -#else -_mpz_cmp_ui (u, v_digit) - mpz_srcptr u; - unsigned long int v_digit; -#endif { - mp_size_t usize = u->_mp_size; + mp_ptr up; + mp_size_t un; + mp_limb_t ul; - if (usize == 0) + up = PTR(u); + un = SIZ(u); + + if (un == 0) return -(v_digit != 0); - if (usize == 1) + if (un == 1) { - mp_limb_t u_digit; - - u_digit = u->_mp_d[0]; - if (u_digit > v_digit) + ul = up[0]; + if (ul > v_digit) return 1; - if (u_digit < v_digit) + if (ul < v_digit) return -1; return 0; } - return (usize > 0) ? 1 : -1; +#if GMP_NAIL_BITS != 0 + if (v_digit > GMP_NUMB_MAX) + { + if (un == 2) + { + ul = up[0] + (up[1] << GMP_NUMB_BITS); + + if ((up[1] >> GMP_NAIL_BITS) != 0) + return 1; + + if (ul > v_digit) + return 1; + if (ul < v_digit) + return -1; + return 0; + } + } +#endif + + return un > 0 ? 1 : -1; }