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