xref: /inferno-os/libmp/port/letomp.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 little endian byte array (least significant byte first) to an mpint
6*37da2899SCharles.Forsyth mpint*
letomp(uchar * s,uint n,mpint * b)7*37da2899SCharles.Forsyth letomp(uchar *s, uint n, mpint *b)
8*37da2899SCharles.Forsyth {
9*37da2899SCharles.Forsyth 	int i=0, m = 0;
10*37da2899SCharles.Forsyth 	mpdigit x=0;
11*37da2899SCharles.Forsyth 
12*37da2899SCharles.Forsyth 	if(b == nil)
13*37da2899SCharles.Forsyth 		b = mpnew(0);
14*37da2899SCharles.Forsyth 	mpbits(b, 8*n);
15*37da2899SCharles.Forsyth 	for(; n > 0; n--){
16*37da2899SCharles.Forsyth 		x |= ((mpdigit)(*s++)) << i;
17*37da2899SCharles.Forsyth 		i += 8;
18*37da2899SCharles.Forsyth 		if(i == Dbits){
19*37da2899SCharles.Forsyth 			b->p[m++] = x;
20*37da2899SCharles.Forsyth 			i = 0;
21*37da2899SCharles.Forsyth 			x = 0;
22*37da2899SCharles.Forsyth 		}
23*37da2899SCharles.Forsyth 	}
24*37da2899SCharles.Forsyth 	if(i > 0)
25*37da2899SCharles.Forsyth 		b->p[m++] = x;
26*37da2899SCharles.Forsyth 	b->top = m;
27*37da2899SCharles.Forsyth 	return b;
28*37da2899SCharles.Forsyth }
29