summaryrefslogtreecommitdiff
path: root/mpf/get_si.c
diff options
context:
space:
mode:
authortege <tege@gmplib.org>2002-05-06 15:05:24 +0200
committertege <tege@gmplib.org>2002-05-06 15:05:24 +0200
commit0e6c3fe79785bac780c57613a11a333ec6649453 (patch)
tree16e8ee3cca8e35f57f42e78aebd8ad08ad039997 /mpf/get_si.c
parent9a2cd598e3e9ea6f035ddc74e4c0bbc91542c459 (diff)
downloadgmp-0e6c3fe79785bac780c57613a11a333ec6649453.tar.gz
Nailify.
Diffstat (limited to 'mpf/get_si.c')
-rw-r--r--mpf/get_si.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/mpf/get_si.c b/mpf/get_si.c
index 9246685c3..006966df0 100644
--- a/mpf/get_si.c
+++ b/mpf/get_si.c
@@ -35,9 +35,10 @@ MA 02111-1307, USA.
long
mpf_get_si (mpf_srcptr f)
{
- mp_exp_t exp;
- int size, abs_size;
- long n;
+ mp_exp_t exp;
+ mp_size_t size, abs_size;
+ mp_ptr fp;
+ mp_limb_t fl;
size = SIZ (f);
if (size == 0)
@@ -53,10 +54,17 @@ mpf_get_si (mpf_srcptr f)
if (exp > abs_size)
return 0L;
- n = (long) PTR(f)[abs_size-exp];
+ fp = PTR(f);
+ fl = fp[abs_size - exp];
+
+#if GMP_NAIL_BITS != 0
+ if (ULONG_MAX > GMP_NUMB_MAX != 0 && exp > 1)
+ fl |= fp[abs_size - exp + 1] << GMP_NUMB_BITS;
+#endif
+
if (size > 0)
- return n & LONG_MAX;
+ return fl & LONG_MAX;
else
/* this form necessary to correctly handle -0x80..00 */
- return ~ ((n - 1) & LONG_MAX);
+ return ~ ((fl - 1) & LONG_MAX);
}