xref: /plan9-contrib/sys/src/libmp/port/betomp.c (revision 9027b8f78b93f49ddfe75d1dcbf015f5ad6582b6)
17dd7cddfSDavid du Colombier #include "os.h"
27dd7cddfSDavid du Colombier #include <mp.h>
37dd7cddfSDavid du Colombier #include "dat.h"
47dd7cddfSDavid du Colombier 
57dd7cddfSDavid du Colombier // convert a big-endian byte array (most significant byte first) to an mpint
67dd7cddfSDavid du Colombier mpint*
betomp(uchar * p,uint n,mpint * b)77dd7cddfSDavid du Colombier betomp(uchar *p, uint n, mpint *b)
87dd7cddfSDavid du Colombier {
97dd7cddfSDavid du Colombier 	int m, s;
107dd7cddfSDavid du Colombier 	mpdigit x;
117dd7cddfSDavid du Colombier 
12*9027b8f7SDavid du Colombier 	if(b == nil){
137dd7cddfSDavid du Colombier 		b = mpnew(0);
14*9027b8f7SDavid du Colombier 		setmalloctag(b, getcallerpc(&p));
15*9027b8f7SDavid du Colombier 	}
167dd7cddfSDavid du Colombier 
177dd7cddfSDavid du Colombier 	// dump leading zeros
187dd7cddfSDavid du Colombier 	while(*p == 0 && n > 1){
197dd7cddfSDavid du Colombier 		p++;
207dd7cddfSDavid du Colombier 		n--;
217dd7cddfSDavid du Colombier 	}
227dd7cddfSDavid du Colombier 
237dd7cddfSDavid du Colombier 	// get the space
247dd7cddfSDavid du Colombier 	mpbits(b, n*8);
2559cc4ca5SDavid du Colombier 	b->top = DIGITS(n*8);
267dd7cddfSDavid du Colombier 	m = b->top-1;
277dd7cddfSDavid du Colombier 
287dd7cddfSDavid du Colombier 	// first digit might not be Dbytes long
297dd7cddfSDavid du Colombier 	s = ((n-1)*8)%Dbits;
307dd7cddfSDavid du Colombier 	x = 0;
317dd7cddfSDavid du Colombier 	for(; n > 0; n--){
327dd7cddfSDavid du Colombier 		x |= ((mpdigit)(*p++)) << s;
337dd7cddfSDavid du Colombier 		s -= 8;
347dd7cddfSDavid du Colombier 		if(s < 0){
357dd7cddfSDavid du Colombier 			b->p[m--] = x;
367dd7cddfSDavid du Colombier 			s = Dbits-8;
377dd7cddfSDavid du Colombier 			x = 0;
387dd7cddfSDavid du Colombier 		}
397dd7cddfSDavid du Colombier 	}
407dd7cddfSDavid du Colombier 
417dd7cddfSDavid du Colombier 	return b;
427dd7cddfSDavid du Colombier }
43