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