137da2899SCharles.Forsyth #include "os.h" 237da2899SCharles.Forsyth #include <mp.h> 337da2899SCharles.Forsyth #include "dat.h" 437da2899SCharles.Forsyth 537da2899SCharles.Forsyth #define VLDIGITS (sizeof(vlong)/sizeof(mpdigit)) 637da2899SCharles.Forsyth 737da2899SCharles.Forsyth /* 837da2899SCharles.Forsyth * this code assumes that a vlong is an integral number of 937da2899SCharles.Forsyth * mpdigits long. 1037da2899SCharles.Forsyth */ 1137da2899SCharles.Forsyth mpint* uvtomp(uvlong v,mpint * b)1237da2899SCharles.Forsythuvtomp(uvlong v, mpint *b) 1337da2899SCharles.Forsyth { 1437da2899SCharles.Forsyth int s; 1537da2899SCharles.Forsyth 1637da2899SCharles.Forsyth if(b == nil) 1737da2899SCharles.Forsyth b = mpnew(VLDIGITS*sizeof(mpdigit)); 1837da2899SCharles.Forsyth else 1937da2899SCharles.Forsyth mpbits(b, VLDIGITS*sizeof(mpdigit)); 2037da2899SCharles.Forsyth mpassign(mpzero, b); 2137da2899SCharles.Forsyth if(v == 0) 2237da2899SCharles.Forsyth return b; 2337da2899SCharles.Forsyth for(s = 0; s < VLDIGITS && v != 0; s++){ 2437da2899SCharles.Forsyth b->p[s] = v; 2537da2899SCharles.Forsyth v >>= sizeof(mpdigit)*8; 2637da2899SCharles.Forsyth } 2737da2899SCharles.Forsyth b->top = s; 2837da2899SCharles.Forsyth return b; 2937da2899SCharles.Forsyth } 3037da2899SCharles.Forsyth 3137da2899SCharles.Forsyth uvlong mptouv(mpint * b)3237da2899SCharles.Forsythmptouv(mpint *b) 3337da2899SCharles.Forsyth { 3437da2899SCharles.Forsyth uvlong v; 3537da2899SCharles.Forsyth int s; 3637da2899SCharles.Forsyth 3737da2899SCharles.Forsyth if(b->top == 0) 3837da2899SCharles.Forsyth return 0; 3937da2899SCharles.Forsyth 4037da2899SCharles.Forsyth mpnorm(b); 4137da2899SCharles.Forsyth if(b->top > VLDIGITS) 4237da2899SCharles.Forsyth return MAXVLONG; 4337da2899SCharles.Forsyth 4437da2899SCharles.Forsyth v = 0; 4537da2899SCharles.Forsyth for(s = 0; s < b->top; s++) 46*6e425a9dSCharles.Forsyth v |= (uvlong)b->p[s]<<(s*sizeof(mpdigit)*8); 4737da2899SCharles.Forsyth 4837da2899SCharles.Forsyth return v; 4937da2899SCharles.Forsyth } 50