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