Blame rand/randbui.c

Packit 15dc08
/* gmp_urandomb_ui -- random bits returned in a ulong.
Packit 15dc08
Packit 15dc08
Copyright 2003, 2004 Free Software Foundation, Inc.
Packit 15dc08
Packit 15dc08
This file is part of the GNU MP Library.
Packit 15dc08
Packit 15dc08
The GNU MP Library is free software; you can redistribute it and/or modify
Packit 15dc08
it under the terms of either:
Packit 15dc08
Packit 15dc08
  * the GNU Lesser General Public License as published by the Free
Packit 15dc08
    Software Foundation; either version 3 of the License, or (at your
Packit 15dc08
    option) any later version.
Packit 15dc08
Packit 15dc08
or
Packit 15dc08
Packit 15dc08
  * the GNU General Public License as published by the Free Software
Packit 15dc08
    Foundation; either version 2 of the License, or (at your option) any
Packit 15dc08
    later version.
Packit 15dc08
Packit 15dc08
or both in parallel, as here.
Packit 15dc08
Packit 15dc08
The GNU MP Library is distributed in the hope that it will be useful, but
Packit 15dc08
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
Packit 15dc08
or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
Packit 15dc08
for more details.
Packit 15dc08
Packit 15dc08
You should have received copies of the GNU General Public License and the
Packit 15dc08
GNU Lesser General Public License along with the GNU MP Library.  If not,
Packit 15dc08
see https://www.gnu.org/licenses/.  */
Packit 15dc08
Packit 15dc08
#include "gmp.h"
Packit 15dc08
#include "gmp-impl.h"
Packit 15dc08
Packit 15dc08
Packit 15dc08
/* Currently bits>=BITS_PER_ULONG is quietly truncated to BITS_PER_ULONG,
Packit 15dc08
   maybe this should raise an exception or something.  */
Packit 15dc08
Packit 15dc08
unsigned long
Packit 15dc08
gmp_urandomb_ui (gmp_randstate_ptr rstate, unsigned long bits)
Packit 15dc08
{
Packit 15dc08
  mp_limb_t  a[LIMBS_PER_ULONG];
Packit 15dc08
Packit 15dc08
  /* start with zeros, since if bits==0 then _gmp_rand will store nothing at
Packit 15dc08
     all, or if bits <= GMP_NUMB_BITS then it will store only a[0] */
Packit 15dc08
  a[0] = 0;
Packit 15dc08
#if LIMBS_PER_ULONG > 1
Packit 15dc08
  a[1] = 0;
Packit 15dc08
#endif
Packit 15dc08
Packit 15dc08
  _gmp_rand (a, rstate, MIN (bits, BITS_PER_ULONG));
Packit 15dc08
Packit 15dc08
#if LIMBS_PER_ULONG == 1
Packit 15dc08
  return a[0];
Packit 15dc08
#else
Packit 15dc08
  return a[0] | (a[1] << GMP_NUMB_BITS);
Packit 15dc08
#endif
Packit 15dc08
}