aboutsummaryrefslogtreecommitdiff
path: root/src/benchmarks/cfrac/ptob.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/ptob.c
parent971adefadb94e8780b1a73f08ed11d76c2ead8a2 (diff)
downloadallocbench-77ac9ce0a5c55d4f79f8fb8f7daa59ddb53cb507.tar.gz
allocbench-77ac9ce0a5c55d4f79f8fb8f7daa59ddb53cb507.zip
add cfrac benchmark
Diffstat (limited to 'src/benchmarks/cfrac/ptob.c')
-rw-r--r--src/benchmarks/cfrac/ptob.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/benchmarks/cfrac/ptob.c b/src/benchmarks/cfrac/ptob.c
new file mode 100644
index 0000000..d5b04c1
--- /dev/null
+++ b/src/benchmarks/cfrac/ptob.c
@@ -0,0 +1,81 @@
+#include "pdefs.h"
+#include "precision.h"
+
+/*
+ * Convert a precision to a given base (the sign is ignored)
+ *
+ * Input:
+ * u - the number to convert
+ * dest - Where to put the ASCII representation radix
+ * WARNING! Not '\0' terminated, this is an exact image
+ * size - the number of digits of dest.
+ * (alphabet[0] padded on left)
+ * if size is too small, truncation occurs on left
+ * alphabet - A mapping from each radix digit to it's character digit
+ * (note: '\0' is perfectly OK as a digit)
+ * radix - The size of the alphabet, and the conversion radix
+ * 2 <= radix < 256.
+ *
+ * Returns:
+ * -1 if invalid radix
+ * 0 if successful
+ * >0 the number didn't fit
+ */
+int ptob(u, dest, size, alphabet, radix)
+ precision u; /* the number to convert */
+ char *dest; /* where to place the converted ascii */
+ unsigned int size; /* the size of the result in characters */
+ char *alphabet; /* the character set forming the radix */
+ register unsigned int radix; /* the size of the character set */
+{
+ register accumulator temp;
+ register unsigned int i;
+ register char *chp;
+ unsigned int lgclump;
+ int res = 0;
+
+ precision r = pUndef, v = pUndef, pbase = pUndef;
+
+ if (radix > 256 || radix < 2) return -1;
+ if (size == 0) return 1;
+
+ (void) pparm(u);
+ temp = radix;
+ i = 1;
+ while (temp * radix > temp) {
+ temp *= radix;
+ i++;
+ }
+ lgclump = i;
+
+ pset(&v, pabs(u));
+ pset(&pbase, utop(temp)); /* assumes accumulator and int are the same! */
+
+ chp = dest + size;
+ do {
+ pdivmod(v, pbase, &v, &r);
+ temp = ptou(r); /* assumes accumulator and int are the same! */
+ i = lgclump;
+ do {
+ *--chp = alphabet[temp % radix]; /* remainder */
+ temp = temp / radix;
+ if (chp == dest) goto bail;
+ } while (--i > 0);
+ } while pnez(v);
+
+ if (chp > dest) do {
+ *--chp = *alphabet;
+ } while (chp > dest);
+
+bail:
+ if (pnez(v) || temp != 0) { /* check for overflow */
+ res = 1;
+ }
+
+ pdestroy(pbase);
+ pdestroy(v);
+ pdestroy(r);
+
+ pdestroy(u);
+ return res;
+}