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