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