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