Christian Wiese
17 years ago
1 changed files with 55 additions and 0 deletions
@ -0,0 +1,55 @@
|
||||
# --- SDE-COPYRIGHT-NOTE-BEGIN ---
|
||||
# This copyright note is auto-generated by ./scripts/Create-CopyPatch.
|
||||
#
|
||||
# Filename: package/.../gmp/gmp-4.2.2-mpf_set_str.c.patch
|
||||
# Copyright (C) 2008 The OpenSDE Project
|
||||
#
|
||||
# More information can be found in the files COPYING and README.
|
||||
#
|
||||
# This patch file is dual-licensed. It is available under the license the
|
||||
# patched project is licensed under, as long as it is an OpenSource license
|
||||
# as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms
|
||||
# of the GNU General Public License as published by the Free Software
|
||||
# Foundation; either version 2 of the License, or (at your option) any later
|
||||
# version.
|
||||
# --- SDE-COPYRIGHT-NOTE-END ---
|
||||
|
||||
Origin: http://gmplib.org
|
||||
Description: When using mpf_set_str, mpf_init_set_str, or mpf_inp_str with
|
||||
a base > 36, the supplied base will actually be ignored, and
|
||||
the exponent 0 will be supplanted.
|
||||
|
||||
--- gmp-4.2.2/mpf/set_str.c.orig 2007-08-30 18:31:40.000000000 +0000
|
||||
+++ gmp-4.2.2/mpf/set_str.c 2008-02-25 18:20:36.000000000 +0000
|
||||
@@ -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)
|
Loading…
Reference in new issue