xref: /inferno-os/libmp/port/mptoi.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 /*
6*37da2899SCharles.Forsyth  *  this code assumes that mpdigit is at least as
7*37da2899SCharles.Forsyth  *  big as an int.
8*37da2899SCharles.Forsyth  */
9*37da2899SCharles.Forsyth 
10*37da2899SCharles.Forsyth mpint*
itomp(int i,mpint * b)11*37da2899SCharles.Forsyth itomp(int i, mpint *b)
12*37da2899SCharles.Forsyth {
13*37da2899SCharles.Forsyth 	if(b == nil)
14*37da2899SCharles.Forsyth 		b = mpnew(0);
15*37da2899SCharles.Forsyth 	mpassign(mpzero, b);
16*37da2899SCharles.Forsyth 	if(i != 0)
17*37da2899SCharles.Forsyth 		b->top = 1;
18*37da2899SCharles.Forsyth 	if(i < 0){
19*37da2899SCharles.Forsyth 		b->sign = -1;
20*37da2899SCharles.Forsyth 		*b->p = -i;
21*37da2899SCharles.Forsyth 	} else
22*37da2899SCharles.Forsyth 		*b->p = i;
23*37da2899SCharles.Forsyth 	return b;
24*37da2899SCharles.Forsyth }
25*37da2899SCharles.Forsyth 
26*37da2899SCharles.Forsyth int
mptoi(mpint * b)27*37da2899SCharles.Forsyth mptoi(mpint *b)
28*37da2899SCharles.Forsyth {
29*37da2899SCharles.Forsyth 	uint x;
30*37da2899SCharles.Forsyth 
31*37da2899SCharles.Forsyth 	if(b->top==0)
32*37da2899SCharles.Forsyth 		return 0;
33*37da2899SCharles.Forsyth 	x = *b->p;
34*37da2899SCharles.Forsyth 	if(b->sign > 0){
35*37da2899SCharles.Forsyth 		if(b->top > 1 || (x > MAXINT))
36*37da2899SCharles.Forsyth 			x = (int)MAXINT;
37*37da2899SCharles.Forsyth 		else
38*37da2899SCharles.Forsyth 			x = (int)x;
39*37da2899SCharles.Forsyth 	} else {
40*37da2899SCharles.Forsyth 		if(b->top > 1 || x > MAXINT+1)
41*37da2899SCharles.Forsyth 			x = (int)MININT;
42*37da2899SCharles.Forsyth 		else
43*37da2899SCharles.Forsyth 			x = -(int)x;
44*37da2899SCharles.Forsyth 	}
45*37da2899SCharles.Forsyth 	return x;
46*37da2899SCharles.Forsyth }
47