xref: /plan9/sys/src/libmp/port/letomp.c (revision dc5a79c1208f0704eeb474acc990728f8b4854f5)
1*7dd7cddfSDavid du Colombier #include "os.h"
2*7dd7cddfSDavid du Colombier #include <mp.h>
3*7dd7cddfSDavid du Colombier #include "dat.h"
4*7dd7cddfSDavid du Colombier 
5*7dd7cddfSDavid du Colombier // convert a little endian byte array (least significant byte first) to an mpint
6*7dd7cddfSDavid du Colombier mpint*
letomp(uchar * s,uint n,mpint * b)7*7dd7cddfSDavid du Colombier letomp(uchar *s, uint n, mpint *b)
8*7dd7cddfSDavid du Colombier {
9*7dd7cddfSDavid du Colombier 	int i=0, m = 0;
10*7dd7cddfSDavid du Colombier 	mpdigit x=0;
11*7dd7cddfSDavid du Colombier 
12*7dd7cddfSDavid du Colombier 	if(b == nil)
13*7dd7cddfSDavid du Colombier 		b = mpnew(0);
14*7dd7cddfSDavid du Colombier 	mpbits(b, 8*n);
15*7dd7cddfSDavid du Colombier 	for(; n > 0; n--){
16*7dd7cddfSDavid du Colombier 		x |= ((mpdigit)(*s++)) << i;
17*7dd7cddfSDavid du Colombier 		i += 8;
18*7dd7cddfSDavid du Colombier 		if(i == Dbits){
19*7dd7cddfSDavid du Colombier 			b->p[m++] = x;
20*7dd7cddfSDavid du Colombier 			i = 0;
21*7dd7cddfSDavid du Colombier 			x = 0;
22*7dd7cddfSDavid du Colombier 		}
23*7dd7cddfSDavid du Colombier 	}
24*7dd7cddfSDavid du Colombier 	if(i > 0)
25*7dd7cddfSDavid du Colombier 		b->p[m++] = x;
26*7dd7cddfSDavid du Colombier 	b->top = m;
27*7dd7cddfSDavid du Colombier 	return b;
28*7dd7cddfSDavid du Colombier }
29