#include #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; }