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