aboutsummaryrefslogtreecommitdiff
path: root/src/benchmarks/cfrac/ptoa.c
diff options
context:
space:
mode:
authorFlorian Fischer <florian.fl.fischer@fau.de>2019-08-24 17:57:51 +0200
committerFlorian Fischer <florian.fl.fischer@fau.de>2019-08-24 17:57:51 +0200
commit77ac9ce0a5c55d4f79f8fb8f7daa59ddb53cb507 (patch)
tree93d4e30a207265af03394d347bfff76ba677f3ce /src/benchmarks/cfrac/ptoa.c
parent971adefadb94e8780b1a73f08ed11d76c2ead8a2 (diff)
downloadallocbench-77ac9ce0a5c55d4f79f8fb8f7daa59ddb53cb507.tar.gz
allocbench-77ac9ce0a5c55d4f79f8fb8f7daa59ddb53cb507.zip
add cfrac benchmark
Diffstat (limited to 'src/benchmarks/cfrac/ptoa.c')
-rw-r--r--src/benchmarks/cfrac/ptoa.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/benchmarks/cfrac/ptoa.c b/src/benchmarks/cfrac/ptoa.c
new file mode 100644
index 0000000..a928ea2
--- /dev/null
+++ b/src/benchmarks/cfrac/ptoa.c
@@ -0,0 +1,71 @@
+#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) memcpy(d, dPtr, consize - (dPtr - d));
+ }
+
+ pdestroy(pbase);
+ pdestroy(v);
+ pdestroy(r);
+
+ pdestroy(u);
+ return d;
+}