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