crosstool-ng/patches/gmp/4.2.2/100-mpf_set_str.c.patch
Yann E. MORIN" 86c54d8079 Merge the fortran stuff to trunk now it works!
Fortran is not supported for all targets, though. ARM at least does not work.

 /trunk/scripts/build/binutils.sh |    8     8     0     0 ++++++++
 /trunk/scripts/build/cc_gcc.sh   |   11     6     5     0 ++++++-----
 /trunk/scripts/crosstool.sh      |   10     9     1     0 +++++++++-
 /trunk/tools/addToolVersion.sh   |    3     3     0     0 +++
 /trunk/steps.mk                  |    2     2     0     0 ++
 /trunk/config/cc/gcc.in          |   16    16     0     0 ++++++++++++++++
 6 files changed, 44 insertions(+), 6 deletions(-)
2008-04-30 10:43:41 +00:00

39 lines
1.1 KiB
Diff

Original patch from http://gmplib.org/patches/mpf_set_str.c.diff
Re-diffed to match crosstool-NG conventions.
diff -dur gmp-4.2.2.orig/mpf/set_str.c gmp-4.2.2/mpf/set_str.c
--- gmp-4.2.2.orig/mpf/set_str.c 2007-08-30 20:31:40.000000000 +0200
+++ gmp-4.2.2/mpf/set_str.c 2008-01-28 23:05:29.000000000 +0100
@@ -271,8 +271,29 @@
}
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_in_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)