summaryrefslogtreecommitdiff
path: root/mpf
diff options
context:
space:
mode:
authortege <tege@gmplib.org>2007-12-10 00:46:19 +0100
committertege <tege@gmplib.org>2007-12-10 00:46:19 +0100
commitc5637d37a650d070f66d35edd375ca9c9f8503e6 (patch)
tree7250d284f0023ee8bd5e34f5fc92ddbfaec55d49 /mpf
parenta9ba0014c44586c5b9170f8b0bcc51ef70ee984b (diff)
downloadgmp-c5637d37a650d070f66d35edd375ca9c9f8503e6.tar.gz
(mpf_set_str): Write own code for converting the
exponent, avoids strtol base > 36 limitation.
Diffstat (limited to 'mpf')
-rw-r--r--mpf/set_str.c27
1 files changed, 24 insertions, 3 deletions
diff --git a/mpf/set_str.c b/mpf/set_str.c
index 2bccd2627..4aa3eb7d5 100644
--- a/mpf/set_str.c
+++ b/mpf/set_str.c
@@ -241,7 +241,7 @@ mpf_set_str (mpf_ptr x, const char *str, int base)
size_t n_chars_needed;
/* This breaks things like 0.000...0001. To safely ignore superfluous
- digits, we need to skip over leadng zeros. */
+ digits, we need to skip over leading zeros. */
/* Just consider the relevant leading digits of the mantissa. */
n_chars_needed = 2 + (size_t)
(((size_t) prec * GMP_NUMB_BITS) * mp_bases[base].chars_per_bit_exactly);
@@ -271,8 +271,29 @@ mpf_set_str (mpf_ptr x, const char *str, int base)
}
if (expptr != 0)
- /* FIXME: Should do some error checking here. */
- exp_in_base = strtol (expptr, (char **) 0, exp_base);
+ {
+ /* Scan and convert the exponent, in base exp_base. */
+ long dig, neg = -(long) ('-' == expptr[0]);
+ expptr -= neg; /* conditional increment */
+ c = (unsigned char) *expptr++;
+ dig = digit_value[c];
+ if (dig >= exp_base)
+ {
+ TMP_FREE;
+ return -1;
+ }
+ exp_in_base = dig;
+ c = (unsigned char) *expptr++;
+ dig = digit_value[c];
+ while (dig < exp_base)
+ {
+ exp_in_base = exp_in_base * exp_base;
+ exp_base += dig;
+ c = (unsigned char) *expptr++;
+ dig = digit_value[c];
+ }
+ exp_in_base = (exp_in_base ^ neg) - neg; /* conditional negation */
+ }
else
exp_in_base = 0;
if (dotpos != 0)