xref: /dflybsd-src/contrib/gmp/mpz/get_si.c (revision d365564473a20a528d07c59cad8ee2f4bea5546f)
14b6a78b7SSimon Schubert /* mpz_get_si(integer) -- Return the least significant digit from INTEGER.
24b6a78b7SSimon Schubert 
34b6a78b7SSimon Schubert Copyright 1991, 1993, 1994, 1995, 2000, 2001, 2002, 2006 Free Software
44b6a78b7SSimon Schubert Foundation, Inc.
54b6a78b7SSimon Schubert 
64b6a78b7SSimon Schubert This file is part of the GNU MP Library.
74b6a78b7SSimon Schubert 
84b6a78b7SSimon Schubert The GNU MP Library is free software; you can redistribute it and/or modify
94b6a78b7SSimon Schubert it under the terms of the GNU Lesser General Public License as published by
104b6a78b7SSimon Schubert the Free Software Foundation; either version 3 of the License, or (at your
114b6a78b7SSimon Schubert option) any later version.
124b6a78b7SSimon Schubert 
134b6a78b7SSimon Schubert The GNU MP Library is distributed in the hope that it will be useful, but
144b6a78b7SSimon Schubert WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
154b6a78b7SSimon Schubert or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
164b6a78b7SSimon Schubert License for more details.
174b6a78b7SSimon Schubert 
184b6a78b7SSimon Schubert You should have received a copy of the GNU Lesser General Public License
194b6a78b7SSimon Schubert along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
204b6a78b7SSimon Schubert 
214b6a78b7SSimon Schubert #include "gmp.h"
224b6a78b7SSimon Schubert #include "gmp-impl.h"
234b6a78b7SSimon Schubert 
244b6a78b7SSimon Schubert signed long int
mpz_get_si(mpz_srcptr z)25*d2d4b659SJohn Marino mpz_get_si (mpz_srcptr z) __GMP_NOTHROW
264b6a78b7SSimon Schubert {
274b6a78b7SSimon Schubert   mp_ptr zp = z->_mp_d;
284b6a78b7SSimon Schubert   mp_size_t size = z->_mp_size;
294b6a78b7SSimon Schubert   mp_limb_t zl = zp[0];
304b6a78b7SSimon Schubert 
314b6a78b7SSimon Schubert #if GMP_NAIL_BITS != 0
324b6a78b7SSimon Schubert   if (ULONG_MAX > GMP_NUMB_MAX && ABS (size) >= 2)
334b6a78b7SSimon Schubert     zl |= zp[1] << GMP_NUMB_BITS;
344b6a78b7SSimon Schubert #endif
354b6a78b7SSimon Schubert 
364b6a78b7SSimon Schubert   if (size > 0)
37*d2d4b659SJohn Marino     return zl & LONG_MAX;
384b6a78b7SSimon Schubert   else if (size < 0)
394b6a78b7SSimon Schubert     /* This expression is necessary to properly handle 0x80000000 */
40*d2d4b659SJohn Marino     return -1 - (long) ((zl - 1) & LONG_MAX);
414b6a78b7SSimon Schubert   else
424b6a78b7SSimon Schubert     return 0;
434b6a78b7SSimon Schubert }
44