xref: /inferno-os/libmp/port/betomp.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 // convert a big-endian byte array (most significant byte first) to an mpint
6*37da2899SCharles.Forsyth mpint*
betomp(uchar * p,uint n,mpint * b)7*37da2899SCharles.Forsyth betomp(uchar *p, uint n, mpint *b)
8*37da2899SCharles.Forsyth {
9*37da2899SCharles.Forsyth 	int m, s;
10*37da2899SCharles.Forsyth 	mpdigit x;
11*37da2899SCharles.Forsyth 
12*37da2899SCharles.Forsyth 	if(b == nil)
13*37da2899SCharles.Forsyth 		b = mpnew(0);
14*37da2899SCharles.Forsyth 
15*37da2899SCharles.Forsyth 	// dump leading zeros
16*37da2899SCharles.Forsyth 	while(*p == 0 && n > 1){
17*37da2899SCharles.Forsyth 		p++;
18*37da2899SCharles.Forsyth 		n--;
19*37da2899SCharles.Forsyth 	}
20*37da2899SCharles.Forsyth 
21*37da2899SCharles.Forsyth 	// get the space
22*37da2899SCharles.Forsyth 	mpbits(b, n*8);
23*37da2899SCharles.Forsyth 	b->top = DIGITS(n*8);
24*37da2899SCharles.Forsyth 	m = b->top-1;
25*37da2899SCharles.Forsyth 
26*37da2899SCharles.Forsyth 	// first digit might not be Dbytes long
27*37da2899SCharles.Forsyth 	s = ((n-1)*8)%Dbits;
28*37da2899SCharles.Forsyth 	x = 0;
29*37da2899SCharles.Forsyth 	for(; n > 0; n--){
30*37da2899SCharles.Forsyth 		x |= ((mpdigit)(*p++)) << s;
31*37da2899SCharles.Forsyth 		s -= 8;
32*37da2899SCharles.Forsyth 		if(s < 0){
33*37da2899SCharles.Forsyth 			b->p[m--] = x;
34*37da2899SCharles.Forsyth 			s = Dbits-8;
35*37da2899SCharles.Forsyth 			x = 0;
36*37da2899SCharles.Forsyth 		}
37*37da2899SCharles.Forsyth 	}
38*37da2899SCharles.Forsyth 
39*37da2899SCharles.Forsyth 	return b;
40*37da2899SCharles.Forsyth }
41