xref: /plan9/sys/src/libmp/port/mptov.c (revision 80ee5cbfe36716af62da8896207e9763b8e3d760)
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 Colombier vtomp(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 Colombier mptov(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