yann@466: Original patch from http://gmplib.org/patches/mpf_set_str.c.diff yann@466: Re-diffed to match crosstool-NG conventions. yann@466: yann@466: diff -dur gmp-4.2.2.orig/mpf/set_str.c gmp-4.2.2/mpf/set_str.c yann@466: --- gmp-4.2.2.orig/mpf/set_str.c 2007-08-30 20:31:40.000000000 +0200 yann@466: +++ gmp-4.2.2/mpf/set_str.c 2008-01-28 23:05:29.000000000 +0100 yann@466: @@ -271,8 +271,29 @@ yann@466: } yann@466: yann@466: if (expptr != 0) yann@466: - /* FIXME: Should do some error checking here. */ yann@466: - exp_in_base = strtol (expptr, (char **) 0, exp_base); yann@466: + { yann@466: + /* Scan and convert the exponent, in base exp_base. */ yann@466: + long dig, neg = -(long) ('-' == expptr[0]); yann@466: + expptr -= neg; /* conditional increment */ yann@466: + c = (unsigned char) *expptr++; yann@466: + dig = digit_value[c]; yann@466: + if (dig >= exp_base) yann@466: + { yann@466: + TMP_FREE; yann@466: + return -1; yann@466: + } yann@466: + exp_in_base = dig; yann@466: + c = (unsigned char) *expptr++; yann@466: + dig = digit_value[c]; yann@466: + while (dig < exp_base) yann@466: + { yann@466: + exp_in_base = exp_in_base * exp_base; yann@466: + exp_in_base += dig; yann@466: + c = (unsigned char) *expptr++; yann@466: + dig = digit_value[c]; yann@466: + } yann@466: + exp_in_base = (exp_in_base ^ neg) - neg; /* conditional negation */ yann@466: + } yann@466: else yann@466: exp_in_base = 0; yann@466: if (dotpos != 0)