ref: 4d919ab612f61c1ef1b21d41513f264d57c010d4
dir: /sys/src/libmp/port/mprand.c/
#include "os.h" #include <mp.h> #include "dat.h" mpint* mprand(int bits, void (*gen)(uchar*, int), mpint *b) { mpdigit mask; if(b == nil){ b = mpnew(bits); setmalloctag(b, getcallerpc(&bits)); }else mpbits(b, bits); b->sign = 1; b->top = DIGITS(bits); (*gen)((uchar*)b->p, b->top*Dbytes); mask = ((mpdigit)1 << (bits%Dbits))-1; if(mask != 0) b->p[b->top-1] &= mask; return mpnorm(b); }