xref: /inferno-os/libmp/port/mptouv.c (revision 6e425a9de8c003b5a733621a6b6730ec3cc902b8)
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.Forsyth uvtomp(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.Forsyth mptouv(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