/* Copyright (c) 2019 Dennis Wölfing
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

/* libc/src/stdlib/strtold.c
 * Convert a string to long double.
 */

#include <endian.h>
#include <float.h>

#define STRTOD strtold
#define STRTOD_TYPE long double
#define STRTOD_MANT_DIG LDBL_MANT_DIG
#define STRTOD_MAX_EXP LDBL_MAX_EXP
#define STRTOD_MIN_EXP LDBL_MIN_EXP
#if LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 && BYTE_ORDER == LITTLE_ENDIAN
#  define STRTOD_MAKE_FLOAT(sign, mantissa, exponent) \
    ((union { long double f; \
    struct { uint64_t m; uint16_t e:15; uint16_t s:1; } i; }) \
    { .i = { .m = (mantissa), .e = (exponent) & 0x7FFF, .s = (sign) } }.f)
#endif

#include "strtod.c"
