blob: 812e8c7f37a73313a4ac937b1e6ec1694974eeaf [file] [log] [blame]
#include <string.h>
#include "pdefs.h"
#include "pcvt.h"
#include "precision.h"
/*
* Return the character string decimal value of a Precision
*/
#if (BASE > 10)
#define CONDIGIT(d) ((d) < 10 ? (d) + '0' : (d) + 'a'-10)
#else
#define CONDIGIT(d) ((d) + '0')
#endif
char *ptoa(u)
precision u;
{
register accumulator temp;
register char *dPtr;
char *d;
int i = 0;
unsigned int consize;
precision r, v, pbase;
register int j;
(void) pparm(u);
r = pUndef;
v = pUndef;
pbase = pUndef;
consize = (unsigned int) u->size;
if (consize > MAXINT / aDigits) {
consize = (consize / pDigits) * aDigits;
} else {
consize = (consize * aDigits) / pDigits;
}
consize += aDigitLog + 2; /* leading 0's, sign, & '\0' */
d = (char *) allocate((unsigned int) consize);
if (d == (char *) 0) return d;
pset(&v, pabs(u));
pset(&pbase, utop(aDigit));
dPtr = d + consize;
*--dPtr = '\0'; /* null terminate string */
i = u->sign; /* save sign */
do {
pdivmod(v, pbase, &v, &r);
temp = ptou(r); /* Assumes unsigned and accumulator same! */
j = aDigitLog;
do {
*--dPtr = CONDIGIT(temp % aBase); /* remainder */
temp = temp / aBase;
} while (--j > 0);
} while (pnez(v));
while (*dPtr == '0') dPtr++; /* toss leading zero's */
if (*dPtr == '\0') --dPtr; /* but don't waste zero! */
if (i) *--dPtr = '-';
if (dPtr > d) { /* ASSUME copied from lower to higher! */
(void) memmove(d, dPtr, consize - (dPtr - d));
}
pdestroy(pbase);
pdestroy(v);
pdestroy(r);
pdestroy(u);
return d;
}