xref: /plan9/sys/src/libmp/port/mptobe.c (revision 9027b8f78b93f49ddfe75d1dcbf015f5ad6582b6)
17dd7cddfSDavid du Colombier #include "os.h"
27dd7cddfSDavid du Colombier #include <mp.h>
37dd7cddfSDavid du Colombier #include "dat.h"
47dd7cddfSDavid du Colombier 
57dd7cddfSDavid du Colombier // convert an mpint into a big endian byte array (most significant byte first)
67dd7cddfSDavid du Colombier //   return number of bytes converted
77dd7cddfSDavid du Colombier //   if p == nil, allocate and result array
87dd7cddfSDavid du Colombier int
mptobe(mpint * b,uchar * p,uint n,uchar ** pp)97dd7cddfSDavid du Colombier mptobe(mpint *b, uchar *p, uint n, uchar **pp)
107dd7cddfSDavid du Colombier {
117dd7cddfSDavid du Colombier 	int i, j, suppress;
127dd7cddfSDavid du Colombier 	mpdigit x;
137dd7cddfSDavid du Colombier 	uchar *e, *s, c;
147dd7cddfSDavid du Colombier 
157dd7cddfSDavid du Colombier 	if(p == nil){
167dd7cddfSDavid du Colombier 		n = (b->top+1)*Dbytes;
177dd7cddfSDavid du Colombier 		p = malloc(n);
18*9027b8f7SDavid du Colombier 		setmalloctag(p, getcallerpc(&b));
197dd7cddfSDavid du Colombier 	}
207dd7cddfSDavid du Colombier 	if(p == nil)
217dd7cddfSDavid du Colombier 		return -1;
227dd7cddfSDavid du Colombier 	if(pp != nil)
237dd7cddfSDavid du Colombier 		*pp = p;
247dd7cddfSDavid du Colombier 	memset(p, 0, n);
257dd7cddfSDavid du Colombier 
267dd7cddfSDavid du Colombier 	// special case 0
277dd7cddfSDavid du Colombier 	if(b->top == 0){
287dd7cddfSDavid du Colombier 		if(n < 1)
297dd7cddfSDavid du Colombier 			return -1;
307dd7cddfSDavid du Colombier 		else
317dd7cddfSDavid du Colombier 			return 1;
327dd7cddfSDavid du Colombier 	}
337dd7cddfSDavid du Colombier 
347dd7cddfSDavid du Colombier 	s = p;
357dd7cddfSDavid du Colombier 	e = s+n;
367dd7cddfSDavid du Colombier 	suppress = 1;
377dd7cddfSDavid du Colombier 	for(i = b->top-1; i >= 0; i--){
387dd7cddfSDavid du Colombier 		x = b->p[i];
397dd7cddfSDavid du Colombier 		for(j = Dbits-8; j >= 0; j -= 8){
407dd7cddfSDavid du Colombier 			c = x>>j;
417dd7cddfSDavid du Colombier 			if(c == 0 && suppress)
427dd7cddfSDavid du Colombier 				continue;
437dd7cddfSDavid du Colombier 			if(p >= e)
447dd7cddfSDavid du Colombier 				return -1;
457dd7cddfSDavid du Colombier 			*p++ = c;
467dd7cddfSDavid du Colombier 			suppress = 0;
477dd7cddfSDavid du Colombier 		}
487dd7cddfSDavid du Colombier 	}
497dd7cddfSDavid du Colombier 
507dd7cddfSDavid du Colombier 	// guarantee at least one byte
517dd7cddfSDavid du Colombier 	if(s == p){
527dd7cddfSDavid du Colombier 		if(p >= e)
537dd7cddfSDavid du Colombier 			return -1;
547dd7cddfSDavid du Colombier 		*p++ = 0;
557dd7cddfSDavid du Colombier 	}
567dd7cddfSDavid du Colombier 
577dd7cddfSDavid du Colombier 	return p - s;
587dd7cddfSDavid du Colombier }
59