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