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