1/* mpfr_set_str_binary -- set a floating-point number from a binary string
2
3Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
4Contributed by the AriC and Caramel projects, INRIA.
5
6This file is part of the GNU MPFR Library.
7
8The GNU MPFR Library is free software; you can redistribute it and/or modify
9it under the terms of the GNU Lesser General Public License as published by
10the Free Software Foundation; either version 3 of the License, or (at your
11option) any later version.
12
13The GNU MPFR Library is distributed in the hope that it will be useful, but
14WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16License for more details.
17
18You should have received a copy of the GNU Lesser General Public License
19along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
20http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
2151 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22
23#include "mpfr-impl.h"
24
25/* Currently the number should be of the form +/- xxxx.xxxxxxEyy, with
26   decimal exponent. The mantissa of x is supposed to be large enough
27   to hold all the bits of str. */
28
29void
30mpfr_set_str_binary (mpfr_ptr x, const char *str)
31{
32  int has_sign;
33  int res;
34
35  if (*str == 'N')
36    {
37      MPFR_SET_NAN(x);
38      __gmpfr_flags |= MPFR_FLAGS_NAN;
39      return;
40    }
41
42  has_sign = *str == '-' || *str == '+';
43  if (str[has_sign] == 'I')
44    {
45      MPFR_SET_INF(x);
46      if (*str == '-')
47        MPFR_SET_NEG(x);
48      else
49        MPFR_SET_POS(x);
50      return;
51    }
52
53  res = mpfr_strtofr (x, str, 0, 2, MPFR_RNDZ);
54  MPFR_ASSERTN (res == 0);
55}
56