* asan.c (handle_builtin_alloca): Deal with all alloca variants.
[official-gcc.git] / libquadmath / strtod / strtod_l.c
blob0b0e85a3cf7071e74197bfe275a92d48ca1c94c5
1 /* Convert string representing a number to float value, using given locale.
2 Copyright (C) 1997-2012 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4 Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, see
18 <http://www.gnu.org/licenses/>. */
20 #include <config.h>
21 #include <stdarg.h>
22 #include <string.h>
23 #include <stdint.h>
24 #include <stdbool.h>
25 #include <float.h>
26 #include <math.h>
27 #define NDEBUG 1
28 #include <assert.h>
29 #ifdef HAVE_ERRNO_H
30 #include <errno.h>
31 #endif
33 #ifdef HAVE_FENV_H
34 #include <fenv.h>
35 #endif
37 #ifdef HAVE_FENV_H
38 #include "quadmath-rounding-mode.h"
39 #endif
40 #include "../printf/quadmath-printf.h"
41 #include "../printf/fpioconst.h"
43 #undef L_
44 #ifdef USE_WIDE_CHAR
45 # define STRING_TYPE wchar_t
46 # define CHAR_TYPE wint_t
47 # define L_(Ch) L##Ch
48 # define ISSPACE(Ch) __iswspace_l ((Ch), loc)
49 # define ISDIGIT(Ch) __iswdigit_l ((Ch), loc)
50 # define ISXDIGIT(Ch) __iswxdigit_l ((Ch), loc)
51 # define TOLOWER(Ch) __towlower_l ((Ch), loc)
52 # define TOLOWER_C(Ch) __towlower_l ((Ch), _nl_C_locobj_ptr)
53 # define STRNCASECMP(S1, S2, N) \
54 __wcsncasecmp_l ((S1), (S2), (N), _nl_C_locobj_ptr)
55 # define STRTOULL(S, E, B) ____wcstoull_l_internal ((S), (E), (B), 0, loc)
56 #else
57 # define STRING_TYPE char
58 # define CHAR_TYPE char
59 # define L_(Ch) Ch
60 # define ISSPACE(Ch) isspace (Ch)
61 # define ISDIGIT(Ch) isdigit (Ch)
62 # define ISXDIGIT(Ch) isxdigit (Ch)
63 # define TOLOWER(Ch) tolower (Ch)
64 # define TOLOWER_C(Ch) \
65 ({__typeof(Ch) __tlc = (Ch); \
66 (__tlc >= 'A' && __tlc <= 'Z') ? __tlc - 'A' + 'a' : __tlc; })
67 # define STRNCASECMP(S1, S2, N) \
68 __quadmath_strncasecmp_c (S1, S2, N)
69 # ifdef HAVE_STRTOULL
70 # define STRTOULL(S, E, B) strtoull (S, E, B)
71 # else
72 # define STRTOULL(S, E, B) strtoul (S, E, B)
73 # endif
75 static inline int
76 __quadmath_strncasecmp_c (const char *s1, const char *s2, size_t n)
78 const unsigned char *p1 = (const unsigned char *) s1;
79 const unsigned char *p2 = (const unsigned char *) s2;
80 int result;
81 if (p1 == p2 || n == 0)
82 return 0;
83 while ((result = TOLOWER_C (*p1) - TOLOWER_C (*p2++)) == 0)
84 if (*p1++ == '\0' || --n == 0)
85 break;
87 return result;
89 #endif
92 /* Constants we need from float.h; select the set for the FLOAT precision. */
93 #define MANT_DIG PASTE(FLT,_MANT_DIG)
94 #define DIG PASTE(FLT,_DIG)
95 #define MAX_EXP PASTE(FLT,_MAX_EXP)
96 #define MIN_EXP PASTE(FLT,_MIN_EXP)
97 #define MAX_10_EXP PASTE(FLT,_MAX_10_EXP)
98 #define MIN_10_EXP PASTE(FLT,_MIN_10_EXP)
99 #define MAX_VALUE PASTE(FLT,_MAX)
100 #define MIN_VALUE PASTE(FLT,_MIN)
102 /* Extra macros required to get FLT expanded before the pasting. */
103 #define PASTE(a,b) PASTE1(a,b)
104 #define PASTE1(a,b) a##b
106 /* Function to construct a floating point number from an MP integer
107 containing the fraction bits, a base 2 exponent, and a sign flag. */
108 extern FLOAT MPN2FLOAT (mp_srcptr mpn, int exponent, int negative);
110 /* Definitions according to limb size used. */
111 #if BITS_PER_MP_LIMB == 32
112 # define MAX_DIG_PER_LIMB 9
113 # define MAX_FAC_PER_LIMB 1000000000UL
114 #elif BITS_PER_MP_LIMB == 64
115 # define MAX_DIG_PER_LIMB 19
116 # define MAX_FAC_PER_LIMB 10000000000000000000ULL
117 #else
118 # error "mp_limb_t size " BITS_PER_MP_LIMB "not accounted for"
119 #endif
121 #define _tens_in_limb __quadmath_tens_in_limb
122 extern const mp_limb_t _tens_in_limb[MAX_DIG_PER_LIMB + 1] attribute_hidden;
124 #ifndef howmany
125 #define howmany(x,y) (((x)+((y)-1))/(y))
126 #endif
127 #define SWAP(x, y) ({ typeof(x) _tmp = x; x = y; y = _tmp; })
129 #define NDIG (MAX_10_EXP - MIN_10_EXP + 2 * MANT_DIG)
130 #define HEXNDIG ((MAX_EXP - MIN_EXP + 7) / 8 + 2 * MANT_DIG)
131 #define RETURN_LIMB_SIZE howmany (MANT_DIG, BITS_PER_MP_LIMB)
133 #define RETURN(val,end) \
134 do { if (endptr != NULL) *endptr = (STRING_TYPE *) (end); \
135 return val; } while (0)
137 /* Maximum size necessary for mpn integers to hold floating point
138 numbers. The largest number we need to hold is 10^n where 2^-n is
139 1/4 ulp of the smallest representable value (that is, n = MANT_DIG
140 - MIN_EXP + 2). Approximate using 10^3 < 2^10. */
141 #define MPNSIZE (howmany (1 + ((MANT_DIG - MIN_EXP + 2) * 10) / 3, \
142 BITS_PER_MP_LIMB) + 2)
143 /* Declare an mpn integer variable that big. */
144 #define MPN_VAR(name) mp_limb_t name[MPNSIZE]; mp_size_t name##size
145 /* Copy an mpn integer value. */
146 #define MPN_ASSIGN(dst, src) \
147 memcpy (dst, src, (dst##size = src##size) * sizeof (mp_limb_t))
149 /* Set errno and return an overflowing value with sign specified by
150 NEGATIVE. */
151 static FLOAT
152 overflow_value (int negative)
154 #if defined HAVE_ERRNO_H && defined ERANGE
155 errno = ERANGE;
156 #endif
157 FLOAT result = (negative ? -MAX_VALUE : MAX_VALUE) * MAX_VALUE;
158 return result;
161 /* Set errno and return an underflowing value with sign specified by
162 NEGATIVE. */
163 static FLOAT
164 underflow_value (int negative)
166 #if defined HAVE_ERRNO_H && defined ERANGE
167 errno = ERANGE;
168 #endif
169 FLOAT result = (negative ? -MIN_VALUE : MIN_VALUE) * MIN_VALUE;
170 return result;
173 /* Return a floating point number of the needed type according to the given
174 multi-precision number after possible rounding. */
175 static FLOAT
176 round_and_return (mp_limb_t *retval, intmax_t exponent, int negative,
177 mp_limb_t round_limb, mp_size_t round_bit, int more_bits)
179 #ifdef HAVE_FENV_H
180 int mode = get_rounding_mode ();
181 #endif
183 if (exponent < MIN_EXP - 1)
185 mp_size_t shift;
186 bool is_tiny;
188 if (exponent < MIN_EXP - 1 - MANT_DIG)
189 return underflow_value (negative);
191 shift = MIN_EXP - 1 - exponent;
192 is_tiny = true;
194 more_bits |= (round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) != 0;
195 if (shift == MANT_DIG)
196 /* This is a special case to handle the very seldom case where
197 the mantissa will be empty after the shift. */
199 int i;
201 round_limb = retval[RETURN_LIMB_SIZE - 1];
202 round_bit = (MANT_DIG - 1) % BITS_PER_MP_LIMB;
203 for (i = 0; i < RETURN_LIMB_SIZE; ++i)
204 more_bits |= retval[i] != 0;
205 MPN_ZERO (retval, RETURN_LIMB_SIZE);
207 else if (shift >= BITS_PER_MP_LIMB)
209 int i;
211 round_limb = retval[(shift - 1) / BITS_PER_MP_LIMB];
212 round_bit = (shift - 1) % BITS_PER_MP_LIMB;
213 for (i = 0; i < (shift - 1) / BITS_PER_MP_LIMB; ++i)
214 more_bits |= retval[i] != 0;
215 more_bits |= ((round_limb & ((((mp_limb_t) 1) << round_bit) - 1))
216 != 0);
218 (void) mpn_rshift (retval, &retval[shift / BITS_PER_MP_LIMB],
219 RETURN_LIMB_SIZE - (shift / BITS_PER_MP_LIMB),
220 shift % BITS_PER_MP_LIMB);
221 MPN_ZERO (&retval[RETURN_LIMB_SIZE - (shift / BITS_PER_MP_LIMB)],
222 shift / BITS_PER_MP_LIMB);
224 else if (shift > 0)
226 #ifdef HAVE_FENV_H
227 if (TININESS_AFTER_ROUNDING && shift == 1)
229 /* Whether the result counts as tiny depends on whether,
230 after rounding to the normal precision, it still has
231 a subnormal exponent. */
232 mp_limb_t retval_normal[RETURN_LIMB_SIZE];
233 if (round_away (negative,
234 (retval[0] & 1) != 0,
235 (round_limb
236 & (((mp_limb_t) 1) << round_bit)) != 0,
237 (more_bits
238 || ((round_limb
239 & ((((mp_limb_t) 1) << round_bit) - 1))
240 != 0)),
241 mode))
243 mp_limb_t cy = mpn_add_1 (retval_normal, retval,
244 RETURN_LIMB_SIZE, 1);
246 if (((MANT_DIG % BITS_PER_MP_LIMB) == 0 && cy) ||
247 ((MANT_DIG % BITS_PER_MP_LIMB) != 0 &&
248 ((retval_normal[RETURN_LIMB_SIZE - 1]
249 & (((mp_limb_t) 1) << (MANT_DIG % BITS_PER_MP_LIMB)))
250 != 0)))
251 is_tiny = false;
254 #endif
255 round_limb = retval[0];
256 round_bit = shift - 1;
257 (void) mpn_rshift (retval, retval, RETURN_LIMB_SIZE, shift);
259 /* This is a hook for the m68k long double format, where the
260 exponent bias is the same for normalized and denormalized
261 numbers. */
262 #ifndef DENORM_EXP
263 # define DENORM_EXP (MIN_EXP - 2)
264 #endif
265 exponent = DENORM_EXP;
266 if (is_tiny
267 && ((round_limb & (((mp_limb_t) 1) << round_bit)) != 0
268 || more_bits
269 || (round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) != 0))
271 #if defined HAVE_ERRNO_H && defined ERANGE
272 errno = ERANGE;
273 #endif
274 volatile FLOAT force_underflow_exception = MIN_VALUE * MIN_VALUE;
275 (void) force_underflow_exception;
279 if (exponent > MAX_EXP)
280 goto overflow;
282 #ifdef HAVE_FENV_H
283 if (round_away (negative,
284 (retval[0] & 1) != 0,
285 (round_limb & (((mp_limb_t) 1) << round_bit)) != 0,
286 (more_bits
287 || (round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) != 0),
288 mode))
290 mp_limb_t cy = mpn_add_1 (retval, retval, RETURN_LIMB_SIZE, 1);
292 if (((MANT_DIG % BITS_PER_MP_LIMB) == 0 && cy) ||
293 ((MANT_DIG % BITS_PER_MP_LIMB) != 0 &&
294 (retval[RETURN_LIMB_SIZE - 1]
295 & (((mp_limb_t) 1) << (MANT_DIG % BITS_PER_MP_LIMB))) != 0))
297 ++exponent;
298 (void) mpn_rshift (retval, retval, RETURN_LIMB_SIZE, 1);
299 retval[RETURN_LIMB_SIZE - 1]
300 |= ((mp_limb_t) 1) << ((MANT_DIG - 1) % BITS_PER_MP_LIMB);
302 else if (exponent == DENORM_EXP
303 && (retval[RETURN_LIMB_SIZE - 1]
304 & (((mp_limb_t) 1) << ((MANT_DIG - 1) % BITS_PER_MP_LIMB)))
305 != 0)
306 /* The number was denormalized but now normalized. */
307 exponent = MIN_EXP - 1;
309 #endif
311 if (exponent > MAX_EXP)
312 overflow:
313 return overflow_value (negative);
315 return MPN2FLOAT (retval, exponent, negative);
319 /* Read a multi-precision integer starting at STR with exactly DIGCNT digits
320 into N. Return the size of the number limbs in NSIZE at the first
321 character od the string that is not part of the integer as the function
322 value. If the EXPONENT is small enough to be taken as an additional
323 factor for the resulting number (see code) multiply by it. */
324 static const STRING_TYPE *
325 str_to_mpn (const STRING_TYPE *str, int digcnt, mp_limb_t *n, mp_size_t *nsize,
326 intmax_t *exponent
327 #ifndef USE_WIDE_CHAR
328 , const char *decimal, size_t decimal_len, const char *thousands
329 #endif
333 /* Number of digits for actual limb. */
334 int cnt = 0;
335 mp_limb_t low = 0;
336 mp_limb_t start;
338 *nsize = 0;
339 assert (digcnt > 0);
342 if (cnt == MAX_DIG_PER_LIMB)
344 if (*nsize == 0)
346 n[0] = low;
347 *nsize = 1;
349 else
351 mp_limb_t cy;
352 cy = mpn_mul_1 (n, n, *nsize, MAX_FAC_PER_LIMB);
353 cy += mpn_add_1 (n, n, *nsize, low);
354 if (cy != 0)
356 assert (*nsize < MPNSIZE);
357 n[*nsize] = cy;
358 ++(*nsize);
361 cnt = 0;
362 low = 0;
365 /* There might be thousands separators or radix characters in
366 the string. But these all can be ignored because we know the
367 format of the number is correct and we have an exact number
368 of characters to read. */
369 #ifdef USE_WIDE_CHAR
370 if (*str < L'0' || *str > L'9')
371 ++str;
372 #else
373 if (*str < '0' || *str > '9')
375 int inner = 0;
376 if (thousands != NULL && *str == *thousands
377 && ({ for (inner = 1; thousands[inner] != '\0'; ++inner)
378 if (thousands[inner] != str[inner])
379 break;
380 thousands[inner] == '\0'; }))
381 str += inner;
382 else
383 str += decimal_len;
385 #endif
386 low = low * 10 + *str++ - L_('0');
387 ++cnt;
389 while (--digcnt > 0);
391 if (*exponent > 0 && *exponent <= MAX_DIG_PER_LIMB - cnt)
393 low *= _tens_in_limb[*exponent];
394 start = _tens_in_limb[cnt + *exponent];
395 *exponent = 0;
397 else
398 start = _tens_in_limb[cnt];
400 if (*nsize == 0)
402 n[0] = low;
403 *nsize = 1;
405 else
407 mp_limb_t cy;
408 cy = mpn_mul_1 (n, n, *nsize, start);
409 cy += mpn_add_1 (n, n, *nsize, low);
410 if (cy != 0)
412 assert (*nsize < MPNSIZE);
413 n[(*nsize)++] = cy;
417 return str;
421 /* Shift {PTR, SIZE} COUNT bits to the left, and fill the vacated bits
422 with the COUNT most significant bits of LIMB.
424 Implemented as a macro, so that __builtin_constant_p works even at -O0.
426 Tege doesn't like this macro so I have to write it here myself. :)
427 --drepper */
428 #define mpn_lshift_1(ptr, size, count, limb) \
429 do \
431 mp_limb_t *__ptr = (ptr); \
432 if (__builtin_constant_p (count) && count == BITS_PER_MP_LIMB) \
434 mp_size_t i; \
435 for (i = (size) - 1; i > 0; --i) \
436 __ptr[i] = __ptr[i - 1]; \
437 __ptr[0] = (limb); \
439 else \
441 /* We assume count > 0 && count < BITS_PER_MP_LIMB here. */ \
442 unsigned int __count = (count); \
443 (void) mpn_lshift (__ptr, __ptr, size, __count); \
444 __ptr[0] |= (limb) >> (BITS_PER_MP_LIMB - __count); \
447 while (0)
450 #define INTERNAL(x) INTERNAL1(x)
451 #define INTERNAL1(x) __##x##_internal
452 #ifndef ____STRTOF_INTERNAL
453 # define ____STRTOF_INTERNAL INTERNAL (__STRTOF)
454 #endif
456 /* This file defines a function to check for correct grouping. */
457 #include "grouping.h"
460 /* Return a floating point number with the value of the given string NPTR.
461 Set *ENDPTR to the character after the last used one. If the number is
462 smaller than the smallest representable number, set `errno' to ERANGE and
463 return 0.0. If the number is too big to be represented, set `errno' to
464 ERANGE and return HUGE_VAL with the appropriate sign. */
465 FLOAT
466 ____STRTOF_INTERNAL (nptr, endptr, group)
467 const STRING_TYPE *nptr;
468 STRING_TYPE **endptr;
469 int group;
471 int negative; /* The sign of the number. */
472 MPN_VAR (num); /* MP representation of the number. */
473 intmax_t exponent; /* Exponent of the number. */
475 /* Numbers starting `0X' or `0x' have to be processed with base 16. */
476 int base = 10;
478 /* When we have to compute fractional digits we form a fraction with a
479 second multi-precision number (and we sometimes need a second for
480 temporary results). */
481 MPN_VAR (den);
483 /* Representation for the return value. */
484 mp_limb_t retval[RETURN_LIMB_SIZE];
485 /* Number of bits currently in result value. */
486 int bits;
488 /* Running pointer after the last character processed in the string. */
489 const STRING_TYPE *cp, *tp;
490 /* Start of significant part of the number. */
491 const STRING_TYPE *startp, *start_of_digits;
492 /* Points at the character following the integer and fractional digits. */
493 const STRING_TYPE *expp;
494 /* Total number of digit and number of digits in integer part. */
495 size_t dig_no, int_no, lead_zero;
496 /* Contains the last character read. */
497 CHAR_TYPE c;
499 /* We should get wint_t from <stddef.h>, but not all GCC versions define it
500 there. So define it ourselves if it remains undefined. */
501 #ifndef _WINT_T
502 typedef unsigned int wint_t;
503 #endif
504 /* The radix character of the current locale. */
505 #ifdef USE_WIDE_CHAR
506 wchar_t decimal;
507 #else
508 const char *decimal;
509 size_t decimal_len;
510 #endif
511 /* The thousands character of the current locale. */
512 #ifdef USE_WIDE_CHAR
513 wchar_t thousands = L'\0';
514 #else
515 const char *thousands = NULL;
516 #endif
517 /* The numeric grouping specification of the current locale,
518 in the format described in <locale.h>. */
519 const char *grouping;
520 /* Used in several places. */
521 int cnt;
523 #if defined USE_LOCALECONV && !defined USE_NL_LANGINFO
524 const struct lconv *lc = localeconv ();
525 #endif
527 if (__builtin_expect (group, 0))
529 #ifdef USE_NL_LANGINFO
530 grouping = nl_langinfo (GROUPING);
531 if (*grouping <= 0 || *grouping == CHAR_MAX)
532 grouping = NULL;
533 else
535 /* Figure out the thousands separator character. */
536 #ifdef USE_WIDE_CHAR
537 thousands = nl_langinfo_wc (_NL_NUMERIC_THOUSANDS_SEP_WC);
538 if (thousands == L'\0')
539 grouping = NULL;
540 #else
541 thousands = nl_langinfo (THOUSANDS_SEP);
542 if (*thousands == '\0')
544 thousands = NULL;
545 grouping = NULL;
547 #endif
549 #elif defined USE_LOCALECONV
550 grouping = lc->grouping;
551 if (grouping == NULL || *grouping <= 0 || *grouping == CHAR_MAX)
552 grouping = NULL;
553 else
555 /* Figure out the thousands separator character. */
556 thousands = lc->thousands_sep;
557 if (thousands == NULL || *thousands == '\0')
559 thousands = NULL;
560 grouping = NULL;
563 #else
564 grouping = NULL;
565 #endif
567 else
568 grouping = NULL;
570 /* Find the locale's decimal point character. */
571 #ifdef USE_WIDE_CHAR
572 decimal = nl_langinfo_wc (_NL_NUMERIC_DECIMAL_POINT_WC);
573 assert (decimal != L'\0');
574 # define decimal_len 1
575 #else
576 #ifdef USE_NL_LANGINFO
577 decimal = nl_langinfo (DECIMAL_POINT);
578 decimal_len = strlen (decimal);
579 assert (decimal_len > 0);
580 #elif defined USE_LOCALECONV
581 decimal = lc->decimal_point;
582 if (decimal == NULL || *decimal == '\0')
583 decimal = ".";
584 decimal_len = strlen (decimal);
585 #else
586 decimal = ".";
587 decimal_len = 1;
588 #endif
589 #endif
591 /* Prepare number representation. */
592 exponent = 0;
593 negative = 0;
594 bits = 0;
596 /* Parse string to get maximal legal prefix. We need the number of
597 characters of the integer part, the fractional part and the exponent. */
598 cp = nptr - 1;
599 /* Ignore leading white space. */
601 c = *++cp;
602 while (ISSPACE (c));
604 /* Get sign of the result. */
605 if (c == L_('-'))
607 negative = 1;
608 c = *++cp;
610 else if (c == L_('+'))
611 c = *++cp;
613 /* Return 0.0 if no legal string is found.
614 No character is used even if a sign was found. */
615 #ifdef USE_WIDE_CHAR
616 if (c == (wint_t) decimal
617 && (wint_t) cp[1] >= L'0' && (wint_t) cp[1] <= L'9')
619 /* We accept it. This funny construct is here only to indent
620 the code correctly. */
622 #else
623 for (cnt = 0; decimal[cnt] != '\0'; ++cnt)
624 if (cp[cnt] != decimal[cnt])
625 break;
626 if (decimal[cnt] == '\0' && cp[cnt] >= '0' && cp[cnt] <= '9')
628 /* We accept it. This funny construct is here only to indent
629 the code correctly. */
631 #endif
632 else if (c < L_('0') || c > L_('9'))
634 /* Check for `INF' or `INFINITY'. */
635 CHAR_TYPE lowc = TOLOWER_C (c);
637 if (lowc == L_('i') && STRNCASECMP (cp, L_("inf"), 3) == 0)
639 /* Return +/- infinity. */
640 if (endptr != NULL)
641 *endptr = (STRING_TYPE *)
642 (cp + (STRNCASECMP (cp + 3, L_("inity"), 5) == 0
643 ? 8 : 3));
645 return negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL;
648 if (lowc == L_('n') && STRNCASECMP (cp, L_("nan"), 3) == 0)
650 /* Return NaN. */
651 FLOAT retval = NAN;
653 cp += 3;
655 /* Match `(n-char-sequence-digit)'. */
656 if (*cp == L_('('))
658 const STRING_TYPE *startp = cp;
660 ++cp;
661 while ((*cp >= L_('0') && *cp <= L_('9'))
662 || ({ CHAR_TYPE lo = TOLOWER (*cp);
663 lo >= L_('a') && lo <= L_('z'); })
664 || *cp == L_('_'));
666 if (*cp != L_(')'))
667 /* The closing brace is missing. Only match the NAN
668 part. */
669 cp = startp;
670 else
672 /* This is a system-dependent way to specify the
673 bitmask used for the NaN. We expect it to be
674 a number which is put in the mantissa of the
675 number. */
676 STRING_TYPE *endp;
677 unsigned long long int mant;
679 mant = STRTOULL (startp + 1, &endp, 0);
680 if (endp == cp)
681 SET_MANTISSA (retval, mant);
683 /* Consume the closing brace. */
684 ++cp;
688 if (endptr != NULL)
689 *endptr = (STRING_TYPE *) cp;
691 return retval;
694 /* It is really a text we do not recognize. */
695 RETURN (0.0, nptr);
698 /* First look whether we are faced with a hexadecimal number. */
699 if (c == L_('0') && TOLOWER (cp[1]) == L_('x'))
701 /* Okay, it is a hexa-decimal number. Remember this and skip
702 the characters. BTW: hexadecimal numbers must not be
703 grouped. */
704 base = 16;
705 cp += 2;
706 c = *cp;
707 grouping = NULL;
710 /* Record the start of the digits, in case we will check their grouping. */
711 start_of_digits = startp = cp;
713 /* Ignore leading zeroes. This helps us to avoid useless computations. */
714 #ifdef USE_WIDE_CHAR
715 while (c == L'0' || ((wint_t) thousands != L'\0' && c == (wint_t) thousands))
716 c = *++cp;
717 #else
718 if (__builtin_expect (thousands == NULL, 1))
719 while (c == '0')
720 c = *++cp;
721 else
723 /* We also have the multibyte thousands string. */
724 while (1)
726 if (c != '0')
728 for (cnt = 0; thousands[cnt] != '\0'; ++cnt)
729 if (thousands[cnt] != cp[cnt])
730 break;
731 if (thousands[cnt] != '\0')
732 break;
733 cp += cnt - 1;
735 c = *++cp;
738 #endif
740 /* If no other digit but a '0' is found the result is 0.0.
741 Return current read pointer. */
742 CHAR_TYPE lowc = TOLOWER (c);
743 if (!((c >= L_('0') && c <= L_('9'))
744 || (base == 16 && lowc >= L_('a') && lowc <= L_('f'))
745 || (
746 #ifdef USE_WIDE_CHAR
747 c == (wint_t) decimal
748 #else
749 ({ for (cnt = 0; decimal[cnt] != '\0'; ++cnt)
750 if (decimal[cnt] != cp[cnt])
751 break;
752 decimal[cnt] == '\0'; })
753 #endif
754 /* '0x.' alone is not a valid hexadecimal number.
755 '.' alone is not valid either, but that has been checked
756 already earlier. */
757 && (base != 16
758 || cp != start_of_digits
759 || (cp[decimal_len] >= L_('0') && cp[decimal_len] <= L_('9'))
760 || ({ CHAR_TYPE lo = TOLOWER (cp[decimal_len]);
761 lo >= L_('a') && lo <= L_('f'); })))
762 || (base == 16 && (cp != start_of_digits
763 && lowc == L_('p')))
764 || (base != 16 && lowc == L_('e'))))
766 #ifdef USE_WIDE_CHAR
767 tp = __correctly_grouped_prefixwc (start_of_digits, cp, thousands,
768 grouping);
769 #else
770 tp = __correctly_grouped_prefixmb (start_of_digits, cp, thousands,
771 grouping);
772 #endif
773 /* If TP is at the start of the digits, there was no correctly
774 grouped prefix of the string; so no number found. */
775 RETURN (negative ? -0.0 : 0.0,
776 tp == start_of_digits ? (base == 16 ? cp - 1 : nptr) : tp);
779 /* Remember first significant digit and read following characters until the
780 decimal point, exponent character or any non-FP number character. */
781 startp = cp;
782 dig_no = 0;
783 while (1)
785 if ((c >= L_('0') && c <= L_('9'))
786 || (base == 16
787 && ({ CHAR_TYPE lo = TOLOWER (c);
788 lo >= L_('a') && lo <= L_('f'); })))
789 ++dig_no;
790 else
792 #ifdef USE_WIDE_CHAR
793 if (__builtin_expect ((wint_t) thousands == L'\0', 1)
794 || c != (wint_t) thousands)
795 /* Not a digit or separator: end of the integer part. */
796 break;
797 #else
798 if (__builtin_expect (thousands == NULL, 1))
799 break;
800 else
802 for (cnt = 0; thousands[cnt] != '\0'; ++cnt)
803 if (thousands[cnt] != cp[cnt])
804 break;
805 if (thousands[cnt] != '\0')
806 break;
807 cp += cnt - 1;
809 #endif
811 c = *++cp;
814 if (__builtin_expect (grouping != NULL, 0) && cp > start_of_digits)
816 /* Check the grouping of the digits. */
817 #ifdef USE_WIDE_CHAR
818 tp = __correctly_grouped_prefixwc (start_of_digits, cp, thousands,
819 grouping);
820 #else
821 tp = __correctly_grouped_prefixmb (start_of_digits, cp, thousands,
822 grouping);
823 #endif
824 if (cp != tp)
826 /* Less than the entire string was correctly grouped. */
828 if (tp == start_of_digits)
829 /* No valid group of numbers at all: no valid number. */
830 RETURN (0.0, nptr);
832 if (tp < startp)
833 /* The number is validly grouped, but consists
834 only of zeroes. The whole value is zero. */
835 RETURN (negative ? -0.0 : 0.0, tp);
837 /* Recompute DIG_NO so we won't read more digits than
838 are properly grouped. */
839 cp = tp;
840 dig_no = 0;
841 for (tp = startp; tp < cp; ++tp)
842 if (*tp >= L_('0') && *tp <= L_('9'))
843 ++dig_no;
845 int_no = dig_no;
846 lead_zero = 0;
848 goto number_parsed;
852 /* We have the number of digits in the integer part. Whether these
853 are all or any is really a fractional digit will be decided
854 later. */
855 int_no = dig_no;
856 lead_zero = int_no == 0 ? (size_t) -1 : 0;
858 /* Read the fractional digits. A special case are the 'american
859 style' numbers like `16.' i.e. with decimal point but without
860 trailing digits. */
861 if (
862 #ifdef USE_WIDE_CHAR
863 c == (wint_t) decimal
864 #else
865 ({ for (cnt = 0; decimal[cnt] != '\0'; ++cnt)
866 if (decimal[cnt] != cp[cnt])
867 break;
868 decimal[cnt] == '\0'; })
869 #endif
872 cp += decimal_len;
873 c = *cp;
874 while ((c >= L_('0') && c <= L_('9')) ||
875 (base == 16 && ({ CHAR_TYPE lo = TOLOWER (c);
876 lo >= L_('a') && lo <= L_('f'); })))
878 if (c != L_('0') && lead_zero == (size_t) -1)
879 lead_zero = dig_no - int_no;
880 ++dig_no;
881 c = *++cp;
884 assert (dig_no <= (uintmax_t) INTMAX_MAX);
886 /* Remember start of exponent (if any). */
887 expp = cp;
889 /* Read exponent. */
890 lowc = TOLOWER (c);
891 if ((base == 16 && lowc == L_('p'))
892 || (base != 16 && lowc == L_('e')))
894 int exp_negative = 0;
896 c = *++cp;
897 if (c == L_('-'))
899 exp_negative = 1;
900 c = *++cp;
902 else if (c == L_('+'))
903 c = *++cp;
905 if (c >= L_('0') && c <= L_('9'))
907 intmax_t exp_limit;
909 /* Get the exponent limit. */
910 if (base == 16)
912 if (exp_negative)
914 assert (int_no <= (uintmax_t) (INTMAX_MAX
915 + MIN_EXP - MANT_DIG) / 4);
916 exp_limit = -MIN_EXP + MANT_DIG + 4 * (intmax_t) int_no;
918 else
920 if (int_no)
922 assert (lead_zero == 0
923 && int_no <= (uintmax_t) INTMAX_MAX / 4);
924 exp_limit = MAX_EXP - 4 * (intmax_t) int_no + 3;
926 else if (lead_zero == (size_t) -1)
928 /* The number is zero and this limit is
929 arbitrary. */
930 exp_limit = MAX_EXP + 3;
932 else
934 assert (lead_zero
935 <= (uintmax_t) (INTMAX_MAX - MAX_EXP - 3) / 4);
936 exp_limit = (MAX_EXP
937 + 4 * (intmax_t) lead_zero
938 + 3);
942 else
944 if (exp_negative)
946 assert (int_no
947 <= (uintmax_t) (INTMAX_MAX + MIN_10_EXP - MANT_DIG));
948 exp_limit = -MIN_10_EXP + MANT_DIG + (intmax_t) int_no;
950 else
952 if (int_no)
954 assert (lead_zero == 0
955 && int_no <= (uintmax_t) INTMAX_MAX);
956 exp_limit = MAX_10_EXP - (intmax_t) int_no + 1;
958 else if (lead_zero == (size_t) -1)
960 /* The number is zero and this limit is
961 arbitrary. */
962 exp_limit = MAX_10_EXP + 1;
964 else
966 assert (lead_zero
967 <= (uintmax_t) (INTMAX_MAX - MAX_10_EXP - 1));
968 exp_limit = MAX_10_EXP + (intmax_t) lead_zero + 1;
973 if (exp_limit < 0)
974 exp_limit = 0;
978 if (__builtin_expect ((exponent > exp_limit / 10
979 || (exponent == exp_limit / 10
980 && c - L_('0') > exp_limit % 10)), 0))
981 /* The exponent is too large/small to represent a valid
982 number. */
984 FLOAT result;
986 /* We have to take care for special situation: a joker
987 might have written "0.0e100000" which is in fact
988 zero. */
989 if (lead_zero == (size_t) -1)
990 result = negative ? -0.0 : 0.0;
991 else
993 /* Overflow or underflow. */
994 #if defined HAVE_ERRNO_H && defined ERANGE
995 errno = ERANGE;
996 #endif
997 result = (exp_negative ? (negative ? -0.0 : 0.0) :
998 negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL);
1001 /* Accept all following digits as part of the exponent. */
1003 ++cp;
1004 while (*cp >= L_('0') && *cp <= L_('9'));
1006 RETURN (result, cp);
1007 /* NOTREACHED */
1010 exponent *= 10;
1011 exponent += c - L_('0');
1013 c = *++cp;
1015 while (c >= L_('0') && c <= L_('9'));
1017 if (exp_negative)
1018 exponent = -exponent;
1020 else
1021 cp = expp;
1024 /* We don't want to have to work with trailing zeroes after the radix. */
1025 if (dig_no > int_no)
1027 while (expp[-1] == L_('0'))
1029 --expp;
1030 --dig_no;
1032 assert (dig_no >= int_no);
1035 if (dig_no == int_no && dig_no > 0 && exponent < 0)
1038 while (! (base == 16 ? ISXDIGIT (expp[-1]) : ISDIGIT (expp[-1])))
1039 --expp;
1041 if (expp[-1] != L_('0'))
1042 break;
1044 --expp;
1045 --dig_no;
1046 --int_no;
1047 exponent += base == 16 ? 4 : 1;
1049 while (dig_no > 0 && exponent < 0);
1051 number_parsed:
1053 /* The whole string is parsed. Store the address of the next character. */
1054 if (endptr)
1055 *endptr = (STRING_TYPE *) cp;
1057 if (dig_no == 0)
1058 return negative ? -0.0 : 0.0;
1060 if (lead_zero)
1062 /* Find the decimal point */
1063 #ifdef USE_WIDE_CHAR
1064 while (*startp != decimal)
1065 ++startp;
1066 #else
1067 while (1)
1069 if (*startp == decimal[0])
1071 for (cnt = 1; decimal[cnt] != '\0'; ++cnt)
1072 if (decimal[cnt] != startp[cnt])
1073 break;
1074 if (decimal[cnt] == '\0')
1075 break;
1077 ++startp;
1079 #endif
1080 startp += lead_zero + decimal_len;
1081 assert (lead_zero <= (base == 16
1082 ? (uintmax_t) INTMAX_MAX / 4
1083 : (uintmax_t) INTMAX_MAX));
1084 assert (lead_zero <= (base == 16
1085 ? ((uintmax_t) exponent
1086 - (uintmax_t) INTMAX_MIN) / 4
1087 : ((uintmax_t) exponent - (uintmax_t) INTMAX_MIN)));
1088 exponent -= base == 16 ? 4 * (intmax_t) lead_zero : (intmax_t) lead_zero;
1089 dig_no -= lead_zero;
1092 /* If the BASE is 16 we can use a simpler algorithm. */
1093 if (base == 16)
1095 static const int nbits[16] = { 0, 1, 2, 2, 3, 3, 3, 3,
1096 4, 4, 4, 4, 4, 4, 4, 4 };
1097 int idx = (MANT_DIG - 1) / BITS_PER_MP_LIMB;
1098 int pos = (MANT_DIG - 1) % BITS_PER_MP_LIMB;
1099 mp_limb_t val;
1101 while (!ISXDIGIT (*startp))
1102 ++startp;
1103 while (*startp == L_('0'))
1104 ++startp;
1105 if (ISDIGIT (*startp))
1106 val = *startp++ - L_('0');
1107 else
1108 val = 10 + TOLOWER (*startp++) - L_('a');
1109 bits = nbits[val];
1110 /* We cannot have a leading zero. */
1111 assert (bits != 0);
1113 if (pos + 1 >= 4 || pos + 1 >= bits)
1115 /* We don't have to care for wrapping. This is the normal
1116 case so we add the first clause in the `if' expression as
1117 an optimization. It is a compile-time constant and so does
1118 not cost anything. */
1119 retval[idx] = val << (pos - bits + 1);
1120 pos -= bits;
1122 else
1124 retval[idx--] = val >> (bits - pos - 1);
1125 retval[idx] = val << (BITS_PER_MP_LIMB - (bits - pos - 1));
1126 pos = BITS_PER_MP_LIMB - 1 - (bits - pos - 1);
1129 /* Adjust the exponent for the bits we are shifting in. */
1130 assert (int_no <= (uintmax_t) (exponent < 0
1131 ? (INTMAX_MAX - bits + 1) / 4
1132 : (INTMAX_MAX - exponent - bits + 1) / 4));
1133 exponent += bits - 1 + ((intmax_t) int_no - 1) * 4;
1135 while (--dig_no > 0 && idx >= 0)
1137 if (!ISXDIGIT (*startp))
1138 startp += decimal_len;
1139 if (ISDIGIT (*startp))
1140 val = *startp++ - L_('0');
1141 else
1142 val = 10 + TOLOWER (*startp++) - L_('a');
1144 if (pos + 1 >= 4)
1146 retval[idx] |= val << (pos - 4 + 1);
1147 pos -= 4;
1149 else
1151 retval[idx--] |= val >> (4 - pos - 1);
1152 val <<= BITS_PER_MP_LIMB - (4 - pos - 1);
1153 if (idx < 0)
1155 int rest_nonzero = 0;
1156 while (--dig_no > 0)
1158 if (*startp != L_('0'))
1160 rest_nonzero = 1;
1161 break;
1163 startp++;
1165 return round_and_return (retval, exponent, negative, val,
1166 BITS_PER_MP_LIMB - 1, rest_nonzero);
1169 retval[idx] = val;
1170 pos = BITS_PER_MP_LIMB - 1 - (4 - pos - 1);
1174 /* We ran out of digits. */
1175 MPN_ZERO (retval, idx);
1177 return round_and_return (retval, exponent, negative, 0, 0, 0);
1180 /* Now we have the number of digits in total and the integer digits as well
1181 as the exponent and its sign. We can decide whether the read digits are
1182 really integer digits or belong to the fractional part; i.e. we normalize
1183 123e-2 to 1.23. */
1185 register intmax_t incr = (exponent < 0
1186 ? MAX (-(intmax_t) int_no, exponent)
1187 : MIN ((intmax_t) dig_no - (intmax_t) int_no,
1188 exponent));
1189 int_no += incr;
1190 exponent -= incr;
1193 if (__builtin_expect (exponent > MAX_10_EXP + 1 - (intmax_t) int_no, 0))
1194 return overflow_value (negative);
1196 if (__builtin_expect (exponent < MIN_10_EXP - (DIG + 1), 0))
1197 return underflow_value (negative);
1199 if (int_no > 0)
1201 /* Read the integer part as a multi-precision number to NUM. */
1202 startp = str_to_mpn (startp, int_no, num, &numsize, &exponent
1203 #ifndef USE_WIDE_CHAR
1204 , decimal, decimal_len, thousands
1205 #endif
1208 if (exponent > 0)
1210 /* We now multiply the gained number by the given power of ten. */
1211 mp_limb_t *psrc = num;
1212 mp_limb_t *pdest = den;
1213 int expbit = 1;
1214 const struct mp_power *ttab = &_fpioconst_pow10[0];
1218 if ((exponent & expbit) != 0)
1220 size_t size = ttab->arraysize - _FPIO_CONST_OFFSET;
1221 mp_limb_t cy;
1222 exponent ^= expbit;
1224 /* FIXME: not the whole multiplication has to be
1225 done. If we have the needed number of bits we
1226 only need the information whether more non-zero
1227 bits follow. */
1228 if (numsize >= ttab->arraysize - _FPIO_CONST_OFFSET)
1229 cy = mpn_mul (pdest, psrc, numsize,
1230 &__tens[ttab->arrayoff
1231 + _FPIO_CONST_OFFSET],
1232 size);
1233 else
1234 cy = mpn_mul (pdest, &__tens[ttab->arrayoff
1235 + _FPIO_CONST_OFFSET],
1236 size, psrc, numsize);
1237 numsize += size;
1238 if (cy == 0)
1239 --numsize;
1240 (void) SWAP (psrc, pdest);
1242 expbit <<= 1;
1243 ++ttab;
1245 while (exponent != 0);
1247 if (psrc == den)
1248 memcpy (num, den, numsize * sizeof (mp_limb_t));
1251 /* Determine how many bits of the result we already have. */
1252 count_leading_zeros (bits, num[numsize - 1]);
1253 bits = numsize * BITS_PER_MP_LIMB - bits;
1255 /* Now we know the exponent of the number in base two.
1256 Check it against the maximum possible exponent. */
1257 if (__builtin_expect (bits > MAX_EXP, 0))
1258 return overflow_value (negative);
1260 /* We have already the first BITS bits of the result. Together with
1261 the information whether more non-zero bits follow this is enough
1262 to determine the result. */
1263 if (bits > MANT_DIG)
1265 int i;
1266 const mp_size_t least_idx = (bits - MANT_DIG) / BITS_PER_MP_LIMB;
1267 const mp_size_t least_bit = (bits - MANT_DIG) % BITS_PER_MP_LIMB;
1268 const mp_size_t round_idx = least_bit == 0 ? least_idx - 1
1269 : least_idx;
1270 const mp_size_t round_bit = least_bit == 0 ? BITS_PER_MP_LIMB - 1
1271 : least_bit - 1;
1273 if (least_bit == 0)
1274 memcpy (retval, &num[least_idx],
1275 RETURN_LIMB_SIZE * sizeof (mp_limb_t));
1276 else
1278 for (i = least_idx; i < numsize - 1; ++i)
1279 retval[i - least_idx] = (num[i] >> least_bit)
1280 | (num[i + 1]
1281 << (BITS_PER_MP_LIMB - least_bit));
1282 if (i - least_idx < RETURN_LIMB_SIZE)
1283 retval[RETURN_LIMB_SIZE - 1] = num[i] >> least_bit;
1286 /* Check whether any limb beside the ones in RETVAL are non-zero. */
1287 for (i = 0; num[i] == 0; ++i)
1290 return round_and_return (retval, bits - 1, negative,
1291 num[round_idx], round_bit,
1292 int_no < dig_no || i < round_idx);
1293 /* NOTREACHED */
1295 else if (dig_no == int_no)
1297 const mp_size_t target_bit = (MANT_DIG - 1) % BITS_PER_MP_LIMB;
1298 const mp_size_t is_bit = (bits - 1) % BITS_PER_MP_LIMB;
1300 if (target_bit == is_bit)
1302 memcpy (&retval[RETURN_LIMB_SIZE - numsize], num,
1303 numsize * sizeof (mp_limb_t));
1304 /* FIXME: the following loop can be avoided if we assume a
1305 maximal MANT_DIG value. */
1306 MPN_ZERO (retval, RETURN_LIMB_SIZE - numsize);
1308 else if (target_bit > is_bit)
1310 (void) mpn_lshift (&retval[RETURN_LIMB_SIZE - numsize],
1311 num, numsize, target_bit - is_bit);
1312 /* FIXME: the following loop can be avoided if we assume a
1313 maximal MANT_DIG value. */
1314 MPN_ZERO (retval, RETURN_LIMB_SIZE - numsize);
1316 else
1318 mp_limb_t cy;
1319 assert (numsize < RETURN_LIMB_SIZE);
1321 cy = mpn_rshift (&retval[RETURN_LIMB_SIZE - numsize],
1322 num, numsize, is_bit - target_bit);
1323 retval[RETURN_LIMB_SIZE - numsize - 1] = cy;
1324 /* FIXME: the following loop can be avoided if we assume a
1325 maximal MANT_DIG value. */
1326 MPN_ZERO (retval, RETURN_LIMB_SIZE - numsize - 1);
1329 return round_and_return (retval, bits - 1, negative, 0, 0, 0);
1330 /* NOTREACHED */
1333 /* Store the bits we already have. */
1334 memcpy (retval, num, numsize * sizeof (mp_limb_t));
1335 #if RETURN_LIMB_SIZE > 1
1336 if (numsize < RETURN_LIMB_SIZE)
1337 # if RETURN_LIMB_SIZE == 2
1338 retval[numsize] = 0;
1339 # else
1340 MPN_ZERO (retval + numsize, RETURN_LIMB_SIZE - numsize);
1341 # endif
1342 #endif
1345 /* We have to compute at least some of the fractional digits. */
1347 /* We construct a fraction and the result of the division gives us
1348 the needed digits. The denominator is 1.0 multiplied by the
1349 exponent of the lowest digit; i.e. 0.123 gives 123 / 1000 and
1350 123e-6 gives 123 / 1000000. */
1352 int expbit;
1353 int neg_exp;
1354 int more_bits;
1355 int need_frac_digits;
1356 mp_limb_t cy;
1357 mp_limb_t *psrc = den;
1358 mp_limb_t *pdest = num;
1359 const struct mp_power *ttab = &_fpioconst_pow10[0];
1361 assert (dig_no > int_no
1362 && exponent <= 0
1363 && exponent >= MIN_10_EXP - (DIG + 1));
1365 /* We need to compute MANT_DIG - BITS fractional bits that lie
1366 within the mantissa of the result, the following bit for
1367 rounding, and to know whether any subsequent bit is 0.
1368 Computing a bit with value 2^-n means looking at n digits after
1369 the decimal point. */
1370 if (bits > 0)
1372 /* The bits required are those immediately after the point. */
1373 assert (int_no > 0 && exponent == 0);
1374 need_frac_digits = 1 + MANT_DIG - bits;
1376 else
1378 /* The number is in the form .123eEXPONENT. */
1379 assert (int_no == 0 && *startp != L_('0'));
1380 /* The number is at least 10^(EXPONENT-1), and 10^3 <
1381 2^10. */
1382 int neg_exp_2 = ((1 - exponent) * 10) / 3 + 1;
1383 /* The number is at least 2^-NEG_EXP_2. We need up to
1384 MANT_DIG bits following that bit. */
1385 need_frac_digits = neg_exp_2 + MANT_DIG;
1386 /* However, we never need bits beyond 1/4 ulp of the smallest
1387 representable value. (That 1/4 ulp bit is only needed to
1388 determine tinyness on machines where tinyness is determined
1389 after rounding.) */
1390 if (need_frac_digits > MANT_DIG - MIN_EXP + 2)
1391 need_frac_digits = MANT_DIG - MIN_EXP + 2;
1392 /* At this point, NEED_FRAC_DIGITS is the total number of
1393 digits needed after the point, but some of those may be
1394 leading 0s. */
1395 need_frac_digits += exponent;
1396 /* Any cases underflowing enough that none of the fractional
1397 digits are needed should have been caught earlier (such
1398 cases are on the order of 10^-n or smaller where 2^-n is
1399 the least subnormal). */
1400 assert (need_frac_digits > 0);
1403 if (need_frac_digits > (intmax_t) dig_no - (intmax_t) int_no)
1404 need_frac_digits = (intmax_t) dig_no - (intmax_t) int_no;
1406 if ((intmax_t) dig_no > (intmax_t) int_no + need_frac_digits)
1408 dig_no = int_no + need_frac_digits;
1409 more_bits = 1;
1411 else
1412 more_bits = 0;
1414 neg_exp = (intmax_t) dig_no - (intmax_t) int_no - exponent;
1416 /* Construct the denominator. */
1417 densize = 0;
1418 expbit = 1;
1421 if ((neg_exp & expbit) != 0)
1423 mp_limb_t cy;
1424 neg_exp ^= expbit;
1426 if (densize == 0)
1428 densize = ttab->arraysize - _FPIO_CONST_OFFSET;
1429 memcpy (psrc, &__tens[ttab->arrayoff + _FPIO_CONST_OFFSET],
1430 densize * sizeof (mp_limb_t));
1432 else
1434 cy = mpn_mul (pdest, &__tens[ttab->arrayoff
1435 + _FPIO_CONST_OFFSET],
1436 ttab->arraysize - _FPIO_CONST_OFFSET,
1437 psrc, densize);
1438 densize += ttab->arraysize - _FPIO_CONST_OFFSET;
1439 if (cy == 0)
1440 --densize;
1441 (void) SWAP (psrc, pdest);
1444 expbit <<= 1;
1445 ++ttab;
1447 while (neg_exp != 0);
1449 if (psrc == num)
1450 memcpy (den, num, densize * sizeof (mp_limb_t));
1452 /* Read the fractional digits from the string. */
1453 (void) str_to_mpn (startp, dig_no - int_no, num, &numsize, &exponent
1454 #ifndef USE_WIDE_CHAR
1455 , decimal, decimal_len, thousands
1456 #endif
1459 /* We now have to shift both numbers so that the highest bit in the
1460 denominator is set. In the same process we copy the numerator to
1461 a high place in the array so that the division constructs the wanted
1462 digits. This is done by a "quasi fix point" number representation.
1464 num: ddddddddddd . 0000000000000000000000
1465 |--- m ---|
1466 den: ddddddddddd n >= m
1467 |--- n ---|
1470 count_leading_zeros (cnt, den[densize - 1]);
1472 if (cnt > 0)
1474 /* Don't call `mpn_shift' with a count of zero since the specification
1475 does not allow this. */
1476 (void) mpn_lshift (den, den, densize, cnt);
1477 cy = mpn_lshift (num, num, numsize, cnt);
1478 if (cy != 0)
1479 num[numsize++] = cy;
1482 /* Now we are ready for the division. But it is not necessary to
1483 do a full multi-precision division because we only need a small
1484 number of bits for the result. So we do not use mpn_divmod
1485 here but instead do the division here by hand and stop whenever
1486 the needed number of bits is reached. The code itself comes
1487 from the GNU MP Library by Torbj\"orn Granlund. */
1489 exponent = bits;
1491 switch (densize)
1493 case 1:
1495 mp_limb_t d, n, quot;
1496 int used = 0;
1498 n = num[0];
1499 d = den[0];
1500 assert (numsize == 1 && n < d);
1504 udiv_qrnnd (quot, n, n, 0, d);
1506 #define got_limb \
1507 if (bits == 0) \
1509 register int cnt; \
1510 if (quot == 0) \
1511 cnt = BITS_PER_MP_LIMB; \
1512 else \
1513 count_leading_zeros (cnt, quot); \
1514 exponent -= cnt; \
1515 if (BITS_PER_MP_LIMB - cnt > MANT_DIG) \
1517 used = MANT_DIG + cnt; \
1518 retval[0] = quot >> (BITS_PER_MP_LIMB - used); \
1519 bits = MANT_DIG + 1; \
1521 else \
1523 /* Note that we only clear the second element. */ \
1524 /* The conditional is determined at compile time. */ \
1525 if (RETURN_LIMB_SIZE > 1) \
1526 retval[1] = 0; \
1527 retval[0] = quot; \
1528 bits = -cnt; \
1531 else if (bits + BITS_PER_MP_LIMB <= MANT_DIG) \
1532 mpn_lshift_1 (retval, RETURN_LIMB_SIZE, BITS_PER_MP_LIMB, \
1533 quot); \
1534 else \
1536 used = MANT_DIG - bits; \
1537 if (used > 0) \
1538 mpn_lshift_1 (retval, RETURN_LIMB_SIZE, used, quot); \
1540 bits += BITS_PER_MP_LIMB
1542 got_limb;
1544 while (bits <= MANT_DIG);
1546 return round_and_return (retval, exponent - 1, negative,
1547 quot, BITS_PER_MP_LIMB - 1 - used,
1548 more_bits || n != 0);
1550 case 2:
1552 mp_limb_t d0, d1, n0, n1;
1553 mp_limb_t quot = 0;
1554 int used = 0;
1556 d0 = den[0];
1557 d1 = den[1];
1559 if (numsize < densize)
1561 if (num[0] >= d1)
1563 /* The numerator of the number occupies fewer bits than
1564 the denominator but the one limb is bigger than the
1565 high limb of the numerator. */
1566 n1 = 0;
1567 n0 = num[0];
1569 else
1571 if (bits <= 0)
1572 exponent -= BITS_PER_MP_LIMB;
1573 else
1575 if (bits + BITS_PER_MP_LIMB <= MANT_DIG)
1576 mpn_lshift_1 (retval, RETURN_LIMB_SIZE,
1577 BITS_PER_MP_LIMB, 0);
1578 else
1580 used = MANT_DIG - bits;
1581 if (used > 0)
1582 mpn_lshift_1 (retval, RETURN_LIMB_SIZE, used, 0);
1584 bits += BITS_PER_MP_LIMB;
1586 n1 = num[0];
1587 n0 = 0;
1590 else
1592 n1 = num[1];
1593 n0 = num[0];
1596 while (bits <= MANT_DIG)
1598 mp_limb_t r;
1600 if (n1 == d1)
1602 /* QUOT should be either 111..111 or 111..110. We need
1603 special treatment of this rare case as normal division
1604 would give overflow. */
1605 quot = ~(mp_limb_t) 0;
1607 r = n0 + d1;
1608 if (r < d1) /* Carry in the addition? */
1610 add_ssaaaa (n1, n0, r - d0, 0, 0, d0);
1611 goto have_quot;
1613 n1 = d0 - (d0 != 0);
1614 n0 = -d0;
1616 else
1618 udiv_qrnnd (quot, r, n1, n0, d1);
1619 umul_ppmm (n1, n0, d0, quot);
1622 q_test:
1623 if (n1 > r || (n1 == r && n0 > 0))
1625 /* The estimated QUOT was too large. */
1626 --quot;
1628 sub_ddmmss (n1, n0, n1, n0, 0, d0);
1629 r += d1;
1630 if (r >= d1) /* If not carry, test QUOT again. */
1631 goto q_test;
1633 sub_ddmmss (n1, n0, r, 0, n1, n0);
1635 have_quot:
1636 got_limb;
1639 return round_and_return (retval, exponent - 1, negative,
1640 quot, BITS_PER_MP_LIMB - 1 - used,
1641 more_bits || n1 != 0 || n0 != 0);
1643 default:
1645 int i;
1646 mp_limb_t cy, dX, d1, n0, n1;
1647 mp_limb_t quot = 0;
1648 int used = 0;
1650 dX = den[densize - 1];
1651 d1 = den[densize - 2];
1653 /* The division does not work if the upper limb of the two-limb
1654 numerator is greater than the denominator. */
1655 if (mpn_cmp (num, &den[densize - numsize], numsize) > 0)
1656 num[numsize++] = 0;
1658 if (numsize < densize)
1660 mp_size_t empty = densize - numsize;
1661 register int i;
1663 if (bits <= 0)
1664 exponent -= empty * BITS_PER_MP_LIMB;
1665 else
1667 if (bits + empty * BITS_PER_MP_LIMB <= MANT_DIG)
1669 /* We make a difference here because the compiler
1670 cannot optimize the `else' case that good and
1671 this reflects all currently used FLOAT types
1672 and GMP implementations. */
1673 #if RETURN_LIMB_SIZE <= 2
1674 assert (empty == 1);
1675 mpn_lshift_1 (retval, RETURN_LIMB_SIZE,
1676 BITS_PER_MP_LIMB, 0);
1677 #else
1678 for (i = RETURN_LIMB_SIZE - 1; i >= empty; --i)
1679 retval[i] = retval[i - empty];
1680 while (i >= 0)
1681 retval[i--] = 0;
1682 #endif
1684 else
1686 used = MANT_DIG - bits;
1687 if (used >= BITS_PER_MP_LIMB)
1689 register int i;
1690 (void) mpn_lshift (&retval[used
1691 / BITS_PER_MP_LIMB],
1692 retval,
1693 (RETURN_LIMB_SIZE
1694 - used / BITS_PER_MP_LIMB),
1695 used % BITS_PER_MP_LIMB);
1696 for (i = used / BITS_PER_MP_LIMB - 1; i >= 0; --i)
1697 retval[i] = 0;
1699 else if (used > 0)
1700 mpn_lshift_1 (retval, RETURN_LIMB_SIZE, used, 0);
1702 bits += empty * BITS_PER_MP_LIMB;
1704 for (i = numsize; i > 0; --i)
1705 num[i + empty] = num[i - 1];
1706 MPN_ZERO (num, empty + 1);
1708 else
1710 int i;
1711 assert (numsize == densize);
1712 for (i = numsize; i > 0; --i)
1713 num[i] = num[i - 1];
1714 num[0] = 0;
1717 den[densize] = 0;
1718 n0 = num[densize];
1720 while (bits <= MANT_DIG)
1722 if (n0 == dX)
1723 /* This might over-estimate QUOT, but it's probably not
1724 worth the extra code here to find out. */
1725 quot = ~(mp_limb_t) 0;
1726 else
1728 mp_limb_t r;
1730 udiv_qrnnd (quot, r, n0, num[densize - 1], dX);
1731 umul_ppmm (n1, n0, d1, quot);
1733 while (n1 > r || (n1 == r && n0 > num[densize - 2]))
1735 --quot;
1736 r += dX;
1737 if (r < dX) /* I.e. "carry in previous addition?" */
1738 break;
1739 n1 -= n0 < d1;
1740 n0 -= d1;
1744 /* Possible optimization: We already have (q * n0) and (1 * n1)
1745 after the calculation of QUOT. Taking advantage of this, we
1746 could make this loop make two iterations less. */
1748 cy = mpn_submul_1 (num, den, densize + 1, quot);
1750 if (num[densize] != cy)
1752 cy = mpn_add_n (num, num, den, densize);
1753 assert (cy != 0);
1754 --quot;
1756 n0 = num[densize] = num[densize - 1];
1757 for (i = densize - 1; i > 0; --i)
1758 num[i] = num[i - 1];
1759 num[0] = 0;
1761 got_limb;
1764 for (i = densize; num[i] == 0 && i >= 0; --i)
1766 return round_and_return (retval, exponent - 1, negative,
1767 quot, BITS_PER_MP_LIMB - 1 - used,
1768 more_bits || i >= 0);
1773 /* NOTREACHED */