]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libmp/port/mprand.c
merge
[plan9front.git] / sys / src / libmp / port / mprand.c
1 #include "os.h"
2 #include <mp.h>
3 #include "dat.h"
4
5 mpint*
6 mprand(int bits, void (*gen)(uchar*, int), mpint *b)
7 {
8         mpdigit mask;
9
10         if(b == nil){
11                 b = mpnew(bits);
12                 setmalloctag(b, getcallerpc(&bits));
13         }else
14                 mpbits(b, bits);
15
16         b->sign = 1;
17         b->top = DIGITS(bits);
18         (*gen)((uchar*)b->p, b->top*Dbytes);
19
20         mask = ((mpdigit)1 << (bits%Dbits))-1;
21         if(mask != 0)
22                 b->p[b->top-1] &= mask;
23
24         return mpnorm(b);
25 }