xref: /plan9/sys/src/cmd/unix/drawterm/libmp/mptouv.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
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*
uvtomp(uvlong v,mpint * b)12*8ccd4a63SDavid du Colombier uvtomp(uvlong v, mpint *b)
13*8ccd4a63SDavid du Colombier {
14*8ccd4a63SDavid du Colombier 	int s;
15*8ccd4a63SDavid du Colombier 
16*8ccd4a63SDavid du Colombier 	if(b == nil)
17*8ccd4a63SDavid du Colombier 		b = mpnew(VLDIGITS*sizeof(mpdigit));
18*8ccd4a63SDavid du Colombier 	else
19*8ccd4a63SDavid du Colombier 		mpbits(b, VLDIGITS*sizeof(mpdigit));
20*8ccd4a63SDavid du Colombier 	mpassign(mpzero, b);
21*8ccd4a63SDavid du Colombier 	if(v == 0)
22*8ccd4a63SDavid du Colombier 		return b;
23*8ccd4a63SDavid du Colombier 	for(s = 0; s < VLDIGITS && v != 0; s++){
24*8ccd4a63SDavid du Colombier 		b->p[s] = v;
25*8ccd4a63SDavid du Colombier 		v >>= sizeof(mpdigit)*8;
26*8ccd4a63SDavid du Colombier 	}
27*8ccd4a63SDavid du Colombier 	b->top = s;
28*8ccd4a63SDavid du Colombier 	return b;
29*8ccd4a63SDavid du Colombier }
30*8ccd4a63SDavid du Colombier 
31*8ccd4a63SDavid du Colombier uvlong
mptouv(mpint * b)32*8ccd4a63SDavid du Colombier mptouv(mpint *b)
33*8ccd4a63SDavid du Colombier {
34*8ccd4a63SDavid du Colombier 	uvlong v;
35*8ccd4a63SDavid du Colombier 	int s;
36*8ccd4a63SDavid du Colombier 
37*8ccd4a63SDavid du Colombier 	if(b->top == 0)
38*8ccd4a63SDavid du Colombier 		return (vlong) 0;
39*8ccd4a63SDavid du Colombier 
40*8ccd4a63SDavid du Colombier 	mpnorm(b);
41*8ccd4a63SDavid du Colombier 	if(b->top > VLDIGITS)
42*8ccd4a63SDavid du Colombier 		return MAXVLONG;
43*8ccd4a63SDavid du Colombier 
44*8ccd4a63SDavid du Colombier 	v = (uvlong) 0;
45*8ccd4a63SDavid du Colombier 	for(s = 0; s < b->top; s++)
46*8ccd4a63SDavid du Colombier 		v |= b->p[s]<<(s*sizeof(mpdigit)*8);
47*8ccd4a63SDavid du Colombier 
48*8ccd4a63SDavid du Colombier 	return v;
49*8ccd4a63SDavid du Colombier }
50