diff options
Diffstat (limited to 'src/benchmarks/cfrac/atop.c')
| -rw-r--r-- | src/benchmarks/cfrac/atop.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/benchmarks/cfrac/atop.c b/src/benchmarks/cfrac/atop.c new file mode 100644 index 0000000..98f132a --- /dev/null +++ b/src/benchmarks/cfrac/atop.c @@ -0,0 +1,61 @@ +#include <ctype.h> +#include "pdefs.h" +#include "pcvt.h" +#include "precision.h" + +/* + * ascii to precision (modeled after atoi) + * leading whitespace skipped + * an optional leading '-' or '+' followed by digits '0'..'9' + * leading 0's Ok + * stops at first unrecognized character + * + * Returns: pUndef if an invalid argument (pUndef or nondigit as 1st digit) + */ +precision atop(chp) + register char *chp; +{ + precision res = pUndef; + precision clump = pUndef; + int sign = 0; + register int ch; + register accumulator temp; + accumulator x; + register int i; + + if (chp != (char *) 0) { + while (isspace(*chp)) chp++; /* skip whitespace */ + if (*chp == '-') { + sign = 1; + ++chp; + } else if (*chp == '+') { + ++chp; + } + if (isdigit(ch = * (unsigned char *) chp)) { + pset(&res, pzero); + pset(&clump, utop(aDigit)); + do { + i = aDigitLog-1; + temp = ch - '0'; + do { + if (!isdigit(ch = * (unsigned char *) ++chp)) goto atoplast; + temp = temp * aBase + (ch - '0'); + } while (--i > 0); + pset(&res, padd(pmul(res, clump), utop(temp))); + } while (isdigit(ch = * (unsigned char *) ++chp)); + goto atopdone; +atoplast: + x = aBase; + while (i++ < aDigitLog-1) { + x *= aBase; + } + pset(&res, padd(pmul(res, utop(x)), utop(temp))); +atopdone: + if (sign) { + pset(&res, pneg(res)); + } + } + } + pdestroy(clump); + return presult(res); +} |
