xref: /plan9/sys/src/cmd/unix/drawterm/libmp/mptov.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*
vtomp(vlong v,mpint * b)12*8ccd4a63SDavid du Colombier vtomp(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 Colombier mptov(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