1 b3f61791 2004-03-21 devnull #include "os.h"
2 b3f61791 2004-03-21 devnull #include <mp.h>
3 b3f61791 2004-03-21 devnull #include "dat.h"
5 b3f61791 2004-03-21 devnull // convert an mpint into a big endian byte array (most significant byte first)
6 b3f61791 2004-03-21 devnull // return number of bytes converted
7 b3f61791 2004-03-21 devnull // if p == nil, allocate and result array
9 b3f61791 2004-03-21 devnull mptobe(mpint *b, uchar *p, uint n, uchar **pp)
11 b3f61791 2004-03-21 devnull int i, j, suppress;
12 b3f61791 2004-03-21 devnull mpdigit x;
13 b3f61791 2004-03-21 devnull uchar *e, *s, c;
15 b3f61791 2004-03-21 devnull if(p == nil){
16 b3f61791 2004-03-21 devnull n = (b->top+1)*Dbytes;
17 b3f61791 2004-03-21 devnull p = malloc(n);
19 b3f61791 2004-03-21 devnull if(p == nil)
20 b3f61791 2004-03-21 devnull return -1;
21 b3f61791 2004-03-21 devnull if(pp != nil)
23 b3f61791 2004-03-21 devnull memset(p, 0, n);
25 b3f61791 2004-03-21 devnull // special case 0
26 b3f61791 2004-03-21 devnull if(b->top == 0){
27 b3f61791 2004-03-21 devnull if(n < 1)
28 b3f61791 2004-03-21 devnull return -1;
30 b3f61791 2004-03-21 devnull return 1;
35 b3f61791 2004-03-21 devnull suppress = 1;
36 b3f61791 2004-03-21 devnull for(i = b->top-1; i >= 0; i--){
37 b3f61791 2004-03-21 devnull x = b->p[i];
38 b3f61791 2004-03-21 devnull for(j = Dbits-8; j >= 0; j -= 8){
39 b3f61791 2004-03-21 devnull c = x>>j;
40 b3f61791 2004-03-21 devnull if(c == 0 && suppress)
41 b3f61791 2004-03-21 devnull continue;
42 b3f61791 2004-03-21 devnull if(p >= e)
43 b3f61791 2004-03-21 devnull return -1;
44 b3f61791 2004-03-21 devnull *p++ = c;
45 b3f61791 2004-03-21 devnull suppress = 0;
49 b3f61791 2004-03-21 devnull // guarantee at least one byte
50 b3f61791 2004-03-21 devnull if(s == p){
51 b3f61791 2004-03-21 devnull if(p >= e)
52 b3f61791 2004-03-21 devnull return -1;
53 b3f61791 2004-03-21 devnull *p++ = 0;
56 b3f61791 2004-03-21 devnull return p - s;