xref: /plan9/sys/src/libmp/port/mptole.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
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 an mpint into a little endian byte array (least significant byte first)
6*7dd7cddfSDavid du Colombier 
7*7dd7cddfSDavid du Colombier //   return number of bytes converted
8*7dd7cddfSDavid du Colombier //   if p == nil, allocate and result array
9*7dd7cddfSDavid du Colombier int
mptole(mpint * b,uchar * p,uint n,uchar ** pp)10*7dd7cddfSDavid du Colombier mptole(mpint *b, uchar *p, uint n, uchar **pp)
11*7dd7cddfSDavid du Colombier {
12*7dd7cddfSDavid du Colombier 	int i, j;
13*7dd7cddfSDavid du Colombier 	mpdigit x;
14*7dd7cddfSDavid du Colombier 	uchar *e, *s;
15*7dd7cddfSDavid du Colombier 
16*7dd7cddfSDavid du Colombier 	if(p == nil){
17*7dd7cddfSDavid du Colombier 		n = (b->top+1)*Dbytes;
18*7dd7cddfSDavid du Colombier 		p = malloc(n);
19*7dd7cddfSDavid du Colombier 	}
20*7dd7cddfSDavid du Colombier 	if(pp != nil)
21*7dd7cddfSDavid du Colombier 		*pp = p;
22*7dd7cddfSDavid du Colombier 	if(p == nil)
23*7dd7cddfSDavid du Colombier 		return -1;
24*7dd7cddfSDavid du Colombier 	memset(p, 0, n);
25*7dd7cddfSDavid du Colombier 
26*7dd7cddfSDavid du Colombier 	// special case 0
27*7dd7cddfSDavid du Colombier 	if(b->top == 0){
28*7dd7cddfSDavid du Colombier 		if(n < 1)
29*7dd7cddfSDavid du Colombier 			return -1;
30*7dd7cddfSDavid du Colombier 		else
31*7dd7cddfSDavid du Colombier 			return 0;
32*7dd7cddfSDavid du Colombier 	}
33*7dd7cddfSDavid du Colombier 
34*7dd7cddfSDavid du Colombier 	s = p;
35*7dd7cddfSDavid du Colombier 	e = s+n;
36*7dd7cddfSDavid du Colombier 	for(i = 0; i < b->top-1; i++){
37*7dd7cddfSDavid du Colombier 		x = b->p[i];
38*7dd7cddfSDavid du Colombier 		for(j = 0; j < Dbytes; j++){
39*7dd7cddfSDavid du Colombier 			if(p >= e)
40*7dd7cddfSDavid du Colombier 				return -1;
41*7dd7cddfSDavid du Colombier 			*p++ = x;
42*7dd7cddfSDavid du Colombier 			x >>= 8;
43*7dd7cddfSDavid du Colombier 		}
44*7dd7cddfSDavid du Colombier 	}
45*7dd7cddfSDavid du Colombier 	x = b->p[i];
46*7dd7cddfSDavid du Colombier 	while(x > 0){
47*7dd7cddfSDavid du Colombier 		if(p >= e)
48*7dd7cddfSDavid du Colombier 			return -1;
49*7dd7cddfSDavid du Colombier 		*p++ = x;
50*7dd7cddfSDavid du Colombier 		x >>= 8;
51*7dd7cddfSDavid du Colombier 	}
52*7dd7cddfSDavid du Colombier 
53*7dd7cddfSDavid du Colombier 	return p - s;
54*7dd7cddfSDavid du Colombier }
55