plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

mptole.c (796B)


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