| Index: gcc/gmp/mpf/set_str.c
|
| diff --git a/gcc/gmp/mpf/set_str.c b/gcc/gmp/mpf/set_str.c
|
| deleted file mode 100644
|
| index 0417303a3c7c824ac01b1c8ac6e883b02e7ea161..0000000000000000000000000000000000000000
|
| --- a/gcc/gmp/mpf/set_str.c
|
| +++ /dev/null
|
| @@ -1,391 +0,0 @@
|
| -/* mpf_set_str (dest, string, base) -- Convert the string STRING
|
| - in base BASE to a float in dest. If BASE is zero, the leading characters
|
| - of STRING is used to figure out the base.
|
| -
|
| -Copyright 1993, 1994, 1995, 1996, 1997, 2000, 2001, 2002, 2003, 2005, 2007,
|
| -2008 Free Software Foundation, Inc.
|
| -
|
| -This file is part of the GNU MP Library.
|
| -
|
| -The GNU MP Library is free software; you can redistribute it and/or modify
|
| -it under the terms of the GNU Lesser General Public License as published by
|
| -the Free Software Foundation; either version 3 of the License, or (at your
|
| -option) any later version.
|
| -
|
| -The GNU MP Library is distributed in the hope that it will be useful, but
|
| -WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
| -or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
|
| -License for more details.
|
| -
|
| -You should have received a copy of the GNU Lesser General Public License
|
| -along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
|
| -
|
| -/*
|
| - This still needs work, as suggested by some FIXME comments.
|
| - 1. Don't depend on superfluous mantissa digits.
|
| - 2. Allocate temp space more cleverly.
|
| - 3. Use mpn_tdiv_qr instead of mpn_lshift+mpn_divrem.
|
| -*/
|
| -
|
| -#define _GNU_SOURCE /* for DECIMAL_POINT in langinfo.h */
|
| -
|
| -#include "config.h"
|
| -
|
| -#include <stdlib.h>
|
| -#include <string.h>
|
| -#include <ctype.h>
|
| -
|
| -#if HAVE_LANGINFO_H
|
| -#include <langinfo.h> /* for nl_langinfo */
|
| -#endif
|
| -
|
| -#if HAVE_LOCALE_H
|
| -#include <locale.h> /* for localeconv */
|
| -#endif
|
| -
|
| -#include "gmp.h"
|
| -#include "gmp-impl.h"
|
| -#include "longlong.h"
|
| -
|
| -extern const unsigned char __gmp_digit_value_tab[];
|
| -#define digit_value_tab __gmp_digit_value_tab
|
| -
|
| -/* Compute base^exp and return the most significant prec limbs in rp[].
|
| - Put the count of omitted low limbs in *ign.
|
| - Return the actual size (which might be less than prec). */
|
| -static mp_size_t
|
| -mpn_pow_1_highpart (mp_ptr rp, mp_size_t *ignp,
|
| - mp_limb_t base, mp_exp_t exp,
|
| - mp_size_t prec, mp_ptr tp)
|
| -{
|
| - mp_size_t ign; /* counts number of ignored low limbs in r */
|
| - mp_size_t off; /* keeps track of offset where value starts */
|
| - mp_ptr passed_rp = rp;
|
| - mp_size_t rn;
|
| - int cnt;
|
| - int i;
|
| -
|
| - rp[0] = base;
|
| - rn = 1;
|
| - off = 0;
|
| - ign = 0;
|
| - count_leading_zeros (cnt, exp);
|
| - for (i = GMP_LIMB_BITS - cnt - 2; i >= 0; i--)
|
| - {
|
| - mpn_sqr_n (tp, rp + off, rn);
|
| - rn = 2 * rn;
|
| - rn -= tp[rn - 1] == 0;
|
| - ign <<= 1;
|
| -
|
| - off = 0;
|
| - if (rn > prec)
|
| - {
|
| - ign += rn - prec;
|
| - off = rn - prec;
|
| - rn = prec;
|
| - }
|
| - MP_PTR_SWAP (rp, tp);
|
| -
|
| - if (((exp >> i) & 1) != 0)
|
| - {
|
| - mp_limb_t cy;
|
| - cy = mpn_mul_1 (rp, rp + off, rn, base);
|
| - rp[rn] = cy;
|
| - rn += cy != 0;
|
| - off = 0;
|
| - }
|
| - }
|
| -
|
| - if (rn > prec)
|
| - {
|
| - ign += rn - prec;
|
| - rp += rn - prec;
|
| - rn = prec;
|
| - }
|
| -
|
| - MPN_COPY_INCR (passed_rp, rp + off, rn);
|
| - *ignp = ign;
|
| - return rn;
|
| -}
|
| -
|
| -int
|
| -mpf_set_str (mpf_ptr x, const char *str, int base)
|
| -{
|
| - size_t str_size;
|
| - char *s, *begs;
|
| - size_t i, j;
|
| - int c;
|
| - int negative;
|
| - char *dotpos = 0;
|
| - const char *expptr;
|
| - int exp_base;
|
| - const char *point = GMP_DECIMAL_POINT;
|
| - size_t pointlen = strlen (point);
|
| - const unsigned char *digit_value;
|
| - TMP_DECL;
|
| -
|
| - c = (unsigned char) *str;
|
| -
|
| - /* Skip whitespace. */
|
| - while (isspace (c))
|
| - c = (unsigned char) *++str;
|
| -
|
| - negative = 0;
|
| - if (c == '-')
|
| - {
|
| - negative = 1;
|
| - c = (unsigned char) *++str;
|
| - }
|
| -
|
| - /* Default base to decimal. */
|
| - if (base == 0)
|
| - base = 10;
|
| -
|
| - exp_base = base;
|
| -
|
| - if (base < 0)
|
| - {
|
| - exp_base = 10;
|
| - base = -base;
|
| - }
|
| -
|
| - digit_value = digit_value_tab;
|
| - if (base > 36)
|
| - {
|
| - /* For bases > 36, use the collating sequence
|
| - 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz. */
|
| - digit_value += 224;
|
| - if (base > 62)
|
| - return -1; /* too large base */
|
| - }
|
| -
|
| - /* Require at least one digit, possibly after an initial decimal point. */
|
| - if (digit_value[c] >= (base == 0 ? 10 : base))
|
| - {
|
| - /* not a digit, must be a decimal point */
|
| - for (i = 0; i < pointlen; i++)
|
| - if (str[i] != point[i])
|
| - return -1;
|
| - if (digit_value[(unsigned char) str[pointlen]] >= (base == 0 ? 10 : base))
|
| - return -1;
|
| - }
|
| -
|
| - /* Locate exponent part of the input. Look from the right of the string,
|
| - since the exponent is usually a lot shorter than the mantissa. */
|
| - expptr = NULL;
|
| - str_size = strlen (str);
|
| - for (i = str_size - 1; i > 0; i--)
|
| - {
|
| - c = (unsigned char) str[i];
|
| - if (c == '@' || (base <= 10 && (c == 'e' || c == 'E')))
|
| - {
|
| - expptr = str + i + 1;
|
| - str_size = i;
|
| - break;
|
| - }
|
| - }
|
| -
|
| - TMP_MARK;
|
| - s = begs = (char *) TMP_ALLOC (str_size + 1);
|
| -
|
| - /* Loop through mantissa, converting it from ASCII to raw byte values. */
|
| - for (i = 0; i < str_size; i++)
|
| - {
|
| - c = (unsigned char) *str;
|
| - if (!isspace (c))
|
| - {
|
| - int dig;
|
| -
|
| - for (j = 0; j < pointlen; j++)
|
| - if (str[j] != point[j])
|
| - goto not_point;
|
| - if (1)
|
| - {
|
| - if (dotpos != 0)
|
| - {
|
| - /* already saw a decimal point, another is invalid */
|
| - TMP_FREE;
|
| - return -1;
|
| - }
|
| - dotpos = s;
|
| - str += pointlen - 1;
|
| - i += pointlen - 1;
|
| - }
|
| - else
|
| - {
|
| - not_point:
|
| - dig = digit_value[c];
|
| - if (dig >= base)
|
| - {
|
| - TMP_FREE;
|
| - return -1;
|
| - }
|
| - *s++ = dig;
|
| - }
|
| - }
|
| - c = (unsigned char) *++str;
|
| - }
|
| -
|
| - str_size = s - begs;
|
| -
|
| - {
|
| - long exp_in_base;
|
| - mp_size_t ra, ma, rn, mn;
|
| - int cnt;
|
| - mp_ptr mp, tp, rp;
|
| - mp_exp_t exp_in_limbs;
|
| - mp_size_t prec = PREC(x) + 1;
|
| - int divflag;
|
| - mp_size_t madj, radj;
|
| -
|
| -#if 0
|
| - size_t n_chars_needed;
|
| -
|
| - /* This breaks things like 0.000...0001. To safely ignore superfluous
|
| - 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);
|
| - if (str_size > n_chars_needed)
|
| - str_size = n_chars_needed;
|
| -#endif
|
| -
|
| - ma = (((mp_size_t) (str_size / mp_bases[base].chars_per_bit_exactly))
|
| - / GMP_NUMB_BITS + 2);
|
| - mp = TMP_ALLOC_LIMBS (ma);
|
| - mn = mpn_set_str (mp, (unsigned char *) begs, str_size, base);
|
| -
|
| - if (mn == 0)
|
| - {
|
| - SIZ(x) = 0;
|
| - EXP(x) = 0;
|
| - TMP_FREE;
|
| - return 0;
|
| - }
|
| -
|
| - madj = 0;
|
| - /* Ignore excess limbs in MP,MSIZE. */
|
| - if (mn > prec)
|
| - {
|
| - madj = mn - prec;
|
| - mp += mn - prec;
|
| - mn = prec;
|
| - }
|
| -
|
| - if (expptr != 0)
|
| - {
|
| - /* Scan and convert the exponent, in base exp_base. */
|
| - long dig, minus, plusminus;
|
| - c = (unsigned char) *expptr;
|
| - minus = -(long) (c == '-');
|
| - plusminus = minus | -(long) (c == '+');
|
| - expptr -= plusminus; /* 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 ^ minus) - minus; /* conditional negation */
|
| - }
|
| - else
|
| - exp_in_base = 0;
|
| - if (dotpos != 0)
|
| - exp_in_base -= s - dotpos;
|
| - divflag = exp_in_base < 0;
|
| - exp_in_base = ABS (exp_in_base);
|
| -
|
| - if (exp_in_base == 0)
|
| - {
|
| - MPN_COPY (PTR(x), mp, mn);
|
| - SIZ(x) = negative ? -mn : mn;
|
| - EXP(x) = mn + madj;
|
| - TMP_FREE;
|
| - return 0;
|
| - }
|
| -
|
| - ra = 2 * (prec + 1);
|
| - rp = TMP_ALLOC_LIMBS (ra);
|
| - tp = TMP_ALLOC_LIMBS (ra);
|
| - rn = mpn_pow_1_highpart (rp, &radj, (mp_limb_t) base, exp_in_base, prec, tp);
|
| -
|
| - if (divflag)
|
| - {
|
| -#if 0
|
| - /* FIXME: Should use mpn_tdiv here. */
|
| - mpn_tdiv_qr (qp, mp, 0L, mp, mn, rp, rn);
|
| -#else
|
| - mp_ptr qp;
|
| - mp_limb_t qlimb;
|
| - if (mn < rn)
|
| - {
|
| - /* Pad out MP,MSIZE for current divrem semantics. */
|
| - mp_ptr tmp = TMP_ALLOC_LIMBS (rn + 1);
|
| - MPN_ZERO (tmp, rn - mn);
|
| - MPN_COPY (tmp + rn - mn, mp, mn);
|
| - mp = tmp;
|
| - madj -= rn - mn;
|
| - mn = rn;
|
| - }
|
| - if ((rp[rn - 1] & GMP_NUMB_HIGHBIT) == 0)
|
| - {
|
| - mp_limb_t cy;
|
| - count_leading_zeros (cnt, rp[rn - 1]);
|
| - cnt -= GMP_NAIL_BITS;
|
| - mpn_lshift (rp, rp, rn, cnt);
|
| - cy = mpn_lshift (mp, mp, mn, cnt);
|
| - if (cy)
|
| - mp[mn++] = cy;
|
| - }
|
| -
|
| - qp = TMP_ALLOC_LIMBS (prec + 1);
|
| - qlimb = mpn_divrem (qp, prec - (mn - rn), mp, mn, rp, rn);
|
| - tp = qp;
|
| - exp_in_limbs = qlimb + (mn - rn) + (madj - radj);
|
| - rn = prec;
|
| - if (qlimb != 0)
|
| - {
|
| - tp[prec] = qlimb;
|
| - /* Skip the least significant limb not to overrun the destination
|
| - variable. */
|
| - tp++;
|
| - }
|
| -#endif
|
| - }
|
| - else
|
| - {
|
| - tp = TMP_ALLOC_LIMBS (rn + mn);
|
| - if (rn > mn)
|
| - mpn_mul (tp, rp, rn, mp, mn);
|
| - else
|
| - mpn_mul (tp, mp, mn, rp, rn);
|
| - rn += mn;
|
| - rn -= tp[rn - 1] == 0;
|
| - exp_in_limbs = rn + madj + radj;
|
| -
|
| - if (rn > prec)
|
| - {
|
| - tp += rn - prec;
|
| - rn = prec;
|
| - exp_in_limbs += 0;
|
| - }
|
| - }
|
| -
|
| - MPN_COPY (PTR(x), tp, rn);
|
| - SIZ(x) = negative ? -rn : rn;
|
| - EXP(x) = exp_in_limbs;
|
| - TMP_FREE;
|
| - return 0;
|
| - }
|
| -}
|
|
|