| /* Convert string for NaN payload to corresponding NaN. |
| Copyright (C) 1997-2018 Free Software Foundation, Inc. |
| This file is part of the GNU C Library. |
| |
| The GNU C 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 2.1 of the License, or (at your option) any later version. |
| |
| The GNU C 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 C Library; if not, see |
| <http://www.gnu.org/licenses/>. */ |
| |
| #include <ieee754.h> |
| #include <locale.h> |
| #include <math.h> |
| #include <stdlib.h> |
| #include <wchar.h> |
| |
| |
| /* If STR starts with an optional n-char-sequence as defined by ISO C |
| (a sequence of ASCII letters, digits and underscores), followed by |
| ENDC, return a NaN whose payload is set based on STR. Otherwise, |
| return a default NAN. If ENDPTR is not NULL, set *ENDPTR to point |
| to the character after the initial n-char-sequence. */ |
| |
| FLOAT |
| STRTOD_NAN (const STRING_TYPE *str, STRING_TYPE **endptr, STRING_TYPE endc) |
| { |
| const STRING_TYPE *cp = str; |
| |
| while ((*cp >= L_('0') && *cp <= L_('9')) |
| || (*cp >= L_('A') && *cp <= L_('Z')) |
| || (*cp >= L_('a') && *cp <= L_('z')) |
| || *cp == L_('_')) |
| ++cp; |
| |
| FLOAT retval = NAN; |
| if (*cp != endc) |
| goto out; |
| |
| /* This is a system-dependent way to specify the bitmask used for |
| the NaN. We expect it to be a number which is put in the |
| mantissa of the number. */ |
| STRING_TYPE *endp; |
| unsigned long long int mant; |
| |
| mant = STRTOULL (str, &endp, 0); |
| if (endp == cp) |
| SET_MANTISSA (retval, mant); |
| |
| out: |
| if (endptr != NULL) |
| *endptr = (STRING_TYPE *) cp; |
| return retval; |
| } |
| libc_hidden_def (STRTOD_NAN) |