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