chromium / native_client / nacl-gcc / f80d6b9ee7f94755c697ffb7194fb01dd0c537dd / . / gmp-4.3.1 / randbui.c

/* gmp_urandomb_ui -- random bits returned in a ulong. | |

Copyright 2003, 2004 Free Software Foundation, Inc. | |

This file is part of the GNU MP Library. | |

The GNU MP Library is free software; you can redistribute it and/or modify | |

it under the terms of the GNU Lesser General Public License as published by | |

the Free Software Foundation; either version 3 of the License, or (at your | |

option) any later version. | |

The GNU MP Library is distributed in the hope that it will be useful, but | |

WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | |

or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public | |

License for more details. | |

You should have received a copy of the GNU Lesser General Public License | |

along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */ | |

#include "gmp.h" | |

#include "gmp-impl.h" | |

/* Currently bits>=BITS_PER_ULONG is quietly truncated to BITS_PER_ULONG, | |

maybe this should raise an exception or something. */ | |

unsigned long | |

gmp_urandomb_ui (gmp_randstate_ptr rstate, unsigned long bits) | |

{ | |

mp_limb_t a[LIMBS_PER_ULONG]; | |

/* start with zeros, since if bits==0 then _gmp_rand will store nothing at | |

all, or if bits <= GMP_NUMB_BITS then it will store only a[0] */ | |

a[0] = 0; | |

#if LIMBS_PER_ULONG > 1 | |

a[1] = 0; | |

#endif | |

_gmp_rand (a, rstate, MIN (bits, BITS_PER_ULONG)); | |

#if LIMBS_PER_ULONG == 1 | |

return a[0]; | |

#else | |

return a[0] | (a[1] << GMP_NUMB_BITS); | |

#endif | |

} |