1*37da2899SCharles.Forsyth #include "os.h" 2*37da2899SCharles.Forsyth #include <mp.h> 3*37da2899SCharles.Forsyth #include "dat.h" 4*37da2899SCharles.Forsyth 5*37da2899SCharles.Forsyth #define VLDIGITS (sizeof(vlong)/sizeof(mpdigit)) 6*37da2899SCharles.Forsyth 7*37da2899SCharles.Forsyth /* 8*37da2899SCharles.Forsyth * this code assumes that a vlong is an integral number of 9*37da2899SCharles.Forsyth * mpdigits long. 10*37da2899SCharles.Forsyth */ 11*37da2899SCharles.Forsyth mpint* vtomp(vlong v,mpint * b)12*37da2899SCharles.Forsythvtomp(vlong v, mpint *b) 13*37da2899SCharles.Forsyth { 14*37da2899SCharles.Forsyth int s; 15*37da2899SCharles.Forsyth uvlong uv; 16*37da2899SCharles.Forsyth 17*37da2899SCharles.Forsyth if(b == nil) 18*37da2899SCharles.Forsyth b = mpnew(VLDIGITS*sizeof(mpdigit)); 19*37da2899SCharles.Forsyth else 20*37da2899SCharles.Forsyth mpbits(b, VLDIGITS*sizeof(mpdigit)); 21*37da2899SCharles.Forsyth mpassign(mpzero, b); 22*37da2899SCharles.Forsyth if(v == 0) 23*37da2899SCharles.Forsyth return b; 24*37da2899SCharles.Forsyth if(v < 0){ 25*37da2899SCharles.Forsyth b->sign = -1; 26*37da2899SCharles.Forsyth uv = -v; 27*37da2899SCharles.Forsyth } else 28*37da2899SCharles.Forsyth uv = v; 29*37da2899SCharles.Forsyth for(s = 0; s < VLDIGITS && uv != 0; s++){ 30*37da2899SCharles.Forsyth b->p[s] = uv; 31*37da2899SCharles.Forsyth uv >>= sizeof(mpdigit)*8; 32*37da2899SCharles.Forsyth } 33*37da2899SCharles.Forsyth b->top = s; 34*37da2899SCharles.Forsyth return b; 35*37da2899SCharles.Forsyth } 36*37da2899SCharles.Forsyth 37*37da2899SCharles.Forsyth vlong mptov(mpint * b)38*37da2899SCharles.Forsythmptov(mpint *b) 39*37da2899SCharles.Forsyth { 40*37da2899SCharles.Forsyth uvlong v; 41*37da2899SCharles.Forsyth int s; 42*37da2899SCharles.Forsyth 43*37da2899SCharles.Forsyth if(b->top == 0) 44*37da2899SCharles.Forsyth return 0; 45*37da2899SCharles.Forsyth 46*37da2899SCharles.Forsyth mpnorm(b); 47*37da2899SCharles.Forsyth if(b->top > VLDIGITS){ 48*37da2899SCharles.Forsyth if(b->sign > 0) 49*37da2899SCharles.Forsyth return (vlong)MAXVLONG; 50*37da2899SCharles.Forsyth else 51*37da2899SCharles.Forsyth return (vlong)MINVLONG; 52*37da2899SCharles.Forsyth } 53*37da2899SCharles.Forsyth 54*37da2899SCharles.Forsyth v = 0; 55*37da2899SCharles.Forsyth for(s = 0; s < b->top; s++) 56*37da2899SCharles.Forsyth v |= b->p[s]<<(s*sizeof(mpdigit)*8); 57*37da2899SCharles.Forsyth 58*37da2899SCharles.Forsyth if(b->sign > 0){ 59*37da2899SCharles.Forsyth if(v > MAXVLONG) 60*37da2899SCharles.Forsyth v = MAXVLONG; 61*37da2899SCharles.Forsyth } else { 62*37da2899SCharles.Forsyth if(v > MINVLONG) 63*37da2899SCharles.Forsyth v = MINVLONG; 64*37da2899SCharles.Forsyth else 65*37da2899SCharles.Forsyth v = -(vlong)v; 66*37da2899SCharles.Forsyth } 67*37da2899SCharles.Forsyth 68*37da2899SCharles.Forsyth return (vlong)v; 69*37da2899SCharles.Forsyth } 70