123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- #include "os.h"
- #include <mp.h>
- #include "dat.h"
- // convert an mpint into a little endian byte array (least significant byte first)
- // return number of bytes converted
- // if p == nil, allocate and result array
- int
- mptole(mpint *b, uchar *p, uint n, uchar **pp)
- {
- int i, j;
- mpdigit x;
- uchar *e, *s;
- if(p == nil){
- n = (b->top+1)*Dbytes;
- p = malloc(n);
- }
- if(pp != nil)
- *pp = p;
- if(p == nil)
- return -1;
- memset(p, 0, n);
- // special case 0
- if(b->top == 0){
- if(n < 1)
- return -1;
- else
- return 0;
- }
-
- s = p;
- e = s+n;
- for(i = 0; i < b->top-1; i++){
- x = b->p[i];
- for(j = 0; j < Dbytes; j++){
- if(p >= e)
- return -1;
- *p++ = x;
- x >>= 8;
- }
- }
- x = b->p[i];
- while(x > 0){
- if(p >= e)
- return -1;
- *p++ = x;
- x >>= 8;
- }
- return p - s;
- }
|