plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

mprand.c (567B)


      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 	int n, m;
      9 	mpdigit mask;
     10 	uchar *p;
     11 
     12 	n = DIGITS(bits);
     13 	if(b == nil)
     14 		b = mpnew(bits);
     15 	else
     16 		mpbits(b, bits);
     17 
     18 	p = malloc(n*Dbytes);
     19 	if(p == nil)
     20 		return nil;
     21 	(*gen)(p, n*Dbytes);
     22 	betomp(p, n*Dbytes, b);
     23 	free(p);
     24 
     25 	/* make sure we don't give too many bits */
     26 	m = bits%Dbits;
     27 	n--;
     28 	if(m > 0){
     29 		mask = 1;
     30 		mask <<= m;
     31 		mask--;
     32 		b->p[n] &= mask;
     33 	}
     34 
     35 	for(; n >= 0; n--)
     36 		if(b->p[n] != 0)
     37 			break;
     38 	b->top = n+1;
     39 	b->sign = 1;
     40 	return b;
     41 }