patches/gmp/4.2.2/100-mpf_set_str.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Nov 13 17:48:17 2011 +0100 (2011-11-13)
changeset 2744 d77d04661cd9
parent 466 7f9bbf94b0bb
permissions -rw-r--r--
configure: add support for helper script to compute version string

Some projects are using (or planning to use) crosstool-NG, and are storing
it in their VCS, which might not be Mercurial. At the same time, those
projects may want to track development snapshots versions the way we do
with the Hg identity string (hg id).

Provide a way for these project to do so, without having to patch
./configure, and maintain that patch over-and-over again.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
     1 Original patch from http://gmplib.org/patches/mpf_set_str.c.diff
     2 Re-diffed to match crosstool-NG conventions.
     3 
     4 diff -dur gmp-4.2.2.orig/mpf/set_str.c gmp-4.2.2/mpf/set_str.c
     5 --- gmp-4.2.2.orig/mpf/set_str.c	2007-08-30 20:31:40.000000000 +0200
     6 +++ gmp-4.2.2/mpf/set_str.c	2008-01-28 23:05:29.000000000 +0100
     7 @@ -271,8 +271,29 @@
     8        }
     9  
    10      if (expptr != 0)
    11 -      /* FIXME: Should do some error checking here.  */
    12 -      exp_in_base = strtol (expptr, (char **) 0, exp_base);
    13 +      {
    14 +	/* Scan and convert the exponent, in base exp_base.  */
    15 +	long dig, neg = -(long) ('-' == expptr[0]);
    16 +	expptr -= neg;			/* conditional increment */
    17 +	c = (unsigned char) *expptr++;
    18 +	dig = digit_value[c];
    19 +	if (dig >= exp_base)
    20 +	  {
    21 +	    TMP_FREE;
    22 +	    return -1;
    23 +	  }
    24 +	exp_in_base = dig;
    25 +	c = (unsigned char) *expptr++;
    26 +	dig = digit_value[c];
    27 +	while (dig < exp_base)
    28 +	  {
    29 +	    exp_in_base = exp_in_base * exp_base;
    30 +	    exp_in_base += dig;
    31 +	    c = (unsigned char) *expptr++;
    32 +	    dig = digit_value[c];
    33 +	  }
    34 +	exp_in_base = (exp_in_base ^ neg) - neg; /* conditional negation */
    35 +      }
    36      else
    37        exp_in_base = 0;
    38      if (dotpos != 0)