402N/A #endif // NO_GET_FLOATING
402N/A+#ifndef _STDCXX_SIZEOF_NUM_GET_BUFFER
402N/A+#define _STDCXX_SIZEOF_NUM_GET_BUFFER 16384
402N/A /**************************************************************************/
402N/A #include <cstddef> // for std::size_t, std::ptrdiff_t
402N/A /**************************************************************************/
402N/A+// if non-zero expected to point to a maximum valid value
402N/A+// of type T that's being tested below (used for floating
402N/A+// on function return, the pointed to value is overwritten
402N/A+// with the actual extracted value
402N/A enum IterType { iter_pointer, iter_istreambuf, iter_input };
402N/A const char *cname, // name of character type
402N/A IterType itype, // type of input iterator
402N/A const char *iname, // name of input iterator
402N/A nativeT val, // value expected to be extracted
402N/A const char *str, // input sequence
402N/A int eat_expect = -1, // number of consumed characters
402N/A const char *cname, // name of character type
402N/A IterType itype, // iterator type
402N/A const char *iname, // name of iterator type
402N/A nativeT val, // value expected to be extracted
402N/A const char *str, // input sequence
402N/A int eat_expect = -1, // number of consumed characters
402N/A return do_test (lineno, (char*)0, cname, itype, iname,
402N/A- pmax, val, str, eat_expect, flags, err_expect, grouping);
402N/A+ val, str, eat_expect, flags, err_expect, grouping);
402N/A return do_test (lineno, (wchar_t*)0, cname, itype, iname,
402N/A- pmax, val, str, eat_expect, flags, err_expect, grouping);
402N/A+ val, str, eat_expect, flags, err_expect, grouping);
402N/A return do_test (lineno, (UserChar*)0, cname, itype, iname,
402N/A- pmax, val, str, eat_expect, flags, err_expect, grouping);
402N/A+ val, str, eat_expect, flags, err_expect, grouping);
402N/A /*************************************************************************/
402N/A-#define T __LINE__, ctype, cname, itype, iname, 0
402N/A-#define T_MAX __LINE__, ctype, cname, itype, iname, &val
402N/A+#define T __LINE__, ctype, cname, itype, iname
402N/A // exercise bahvior on underflow
402N/A // on underflow, get() follows C99 requirements on strtof()
402N/A //
i.e., it stores a value in the range [0, +/-FLT_MIN]
402N/A // normalized positive number in the return type; whether
402N/A // errno acquires the value ERANGE is implementation-defined.
402N/A- TEST (T_MAX, (val = FLT_MIN, 0.0f), "1.111111e-9999", 14, 0, Eof);
402N/A+ TEST (T, (val = FLT_MIN, 0.0f), "1.111111e-9999", 14, 0, Eof);
402N/A rw_assert (!(val < 0.0), 0, __LINE__,
402N/A "correct sign after positive underflow");
402N/A- TEST (T_MAX, (val = 0.0f, -FLT_MIN), "-1.111111e-9999", 15, 0, Eof);
402N/A+ TEST (T, (val = 0.0f, -FLT_MIN), "-1.111111e-9999", 15, 0, Eof);
402N/A rw_assert (!(val > 0.0), 0, __LINE__,
402N/A "correct sign after negative underflow");
402N/A if (1.234567e-39 < FLT_MIN) {
402N/A- TEST (T_MAX, (val = FLT_MIN, 0.0f), "1.234567e-39", 12, 0, Eof);
402N/A- TEST (T_MAX, (val = 0.0f, -FLT_MIN), "-1.234567e-39", 13, 0, Eof);
402N/A+ TEST (T, (val = FLT_MIN, 0.0f), "1.234567e-39", 12, 0, Eof);
402N/A+ TEST (T, (val = 0.0f, -FLT_MIN), "-1.234567e-39", 13, 0, Eof);
402N/A if (1.234567e-49 < FLT_MIN) {
402N/A- TEST (T_MAX, (val = FLT_MIN, 0.0f), "1.234567e-49", 12, 0, Eof);
402N/A- TEST (T_MAX, (val = 0.0f, -FLT_MIN), "-1.234567e-49", 13, 0, Eof);
402N/A+ TEST (T, (val = FLT_MIN, 0.0f), "1.234567e-49", 12, 0, Eof);
402N/A+ TEST (T, (val = 0.0f, -FLT_MIN), "-1.234567e-49", 13, 0, Eof);
402N/A if (1.234567e-99 < FLT_MIN) {
402N/A- TEST (T_MAX, (val = FLT_MIN, 0.0f), "1.234567e-99", 12, 0, Eof);
402N/A- TEST (T_MAX, (val = 0.0f, -FLT_MIN), "-1.234567e-99", 13, 0, Eof);
402N/A+ TEST (T, (val = FLT_MIN, 0.0f), "1.234567e-99", 12, 0, Eof);
402N/A+ TEST (T, (val = 0.0f, -FLT_MIN), "-1.234567e-99", 13, 0, Eof);
402N/A // exercise facet's behavior on underflow:
402N/A // parsing succeeds (fail is clear), +/-min is stored
402N/A- TEST (T_MAX, FLT_MIN, _RWSTD_STRSTR ( _RWSTD_DBL_MIN), -1, 0, Eof);
402N/A- TEST (T_MAX, -FLT_MIN, _RWSTD_STRSTR (-_RWSTD_DBL_MIN), -1, 0, Eof);
402N/A+ TEST (T, FLT_MIN, _RWSTD_STRSTR ( _RWSTD_DBL_MIN), -1, 0, Eof);
402N/A+ TEST (T, -FLT_MIN, _RWSTD_STRSTR (-_RWSTD_DBL_MIN), -1, 0, Eof);
402N/A+ pmax = 0; // reset before next test
402N/A rw_info (0, 0, 0, "std::num_get<%s, %s>::get (..., float&) on overflow",
402N/A // exercise bahvior on underflow
402N/A+ static double val = DBL_MIN;
402N/A // on underflow, get() follows C99 requirements on strtod()
402N/A //
i.e., it stores a value in the range [0, +/-DBL_MIN]
402N/A // normalized positive number in the return type; whether
402N/A // errno acquires the value ERANGE is implementation-defined.
402N/A- TEST (T_MAX, (val = DBL_MIN, 0.0), "1.111111e-9999", 14, 0, Eof);
402N/A- TEST (T_MAX, (val = 0.0, -DBL_MIN), "-1.111111e-9999", 15, 0, Eof);
402N/A+ TEST (T, (val = DBL_MIN, 0.0), "1.111111e-9999", 14, 0, Eof);
402N/A+ TEST (T, (val = 0.0, -DBL_MIN), "-1.111111e-9999", 15, 0, Eof);
402N/A if (1.23456789e-309L < DBL_MIN) {
402N/A- TEST (T_MAX, (val = DBL_MIN, 0.0), "1.23456789e-309", 15, 0, Eof);
402N/A- TEST (T_MAX, (val = 0.0, -DBL_MIN), "-1.23456789e-309", 16, 0, Eof);
402N/A+ TEST (T, (val = DBL_MIN, 0.0), "1.23456789e-309", 15, 0, Eof);
402N/A+ TEST (T, (val = 0.0, -DBL_MIN), "-1.23456789e-309", 16, 0, Eof);
402N/A if (1.234567e-409L < DBL_MIN) {
402N/A- TEST (T_MAX, (val = DBL_MIN, 0.0), "1.23456789e-409", 15, 0, Eof);
402N/A- TEST (T_MAX, (val = 0.0, -DBL_MIN), "-1.23456789e-409", 16, 0, Eof);
402N/A+ TEST (T, (val = DBL_MIN, 0.0), "1.23456789e-409", 15, 0, Eof);
402N/A+ TEST (T, (val = 0.0, -DBL_MIN), "-1.23456789e-409", 16, 0, Eof);
402N/A if (1.234567e-999L < DBL_MIN) {
402N/A- TEST (T_MAX, (val = DBL_MIN, 0.0), "1.23456789e-999", 15, 0, Eof);
402N/A- TEST (T_MAX, (val = 0.0, -DBL_MIN), "-1.23456789e-999", 16, 0, Eof);
402N/A+ TEST (T, (val = DBL_MIN, 0.0), "1.23456789e-999", 15, 0, Eof);
402N/A+ TEST (T, (val = 0.0, -DBL_MIN), "-1.23456789e-999", 16, 0, Eof);
402N/A+ pmax = 0; // reset before next test
402N/A # ifdef _RWSTD_LDBL_MAX
402N/A // exercise bahvior on underflow
402N/A- long double val = LDBL_MIN;
402N/A+ static long double val = LDBL_MIN;
402N/A // on underflow, get() follows C99 requirements on strtold()
402N/A //
i.e., it stores a value in the range [0, +/-LDBL__MIN]
402N/A // normalized positive number in the return type; whether
402N/A // errno acquires the value ERANGE is implementation-defined.
402N/A- TEST (T_MAX, (val = LDBL_MIN, 0.0L), "1.987654321e-99999", 18, 0, Eof);
402N/A- TEST (T_MAX, (val = 0.0L, -LDBL_MIN), "-1.987654321e-99999", 19, 0, Eof);
402N/A+ TEST (T, (val = LDBL_MIN, 0.0L), "1.987654321e-99999", 18, 0, Eof);
402N/A+ TEST (T, (val = 0.0L, -LDBL_MIN), "-1.987654321e-99999", 19, 0, Eof);
402N/A const char fmt[] = "%Lg";
402N/A if (1 == std::sscanf ("3.456789e-4932", fmt, &ld) && ld < LDBL_MIN) {
402N/A- TEST (T_MAX, (val = LDBL_MIN, 0.0L), "3.456789e-4932", 14, 0, Eof);
402N/A- TEST (T_MAX, (val = 0.0L, -LDBL_MIN), "-3.456789e-4932", 15, 0, Eof);
402N/A+ TEST (T, (val = LDBL_MIN, 0.0L), "3.456789e-4932", 14, 0, Eof);
402N/A+ TEST (T, (val = 0.0L, -LDBL_MIN), "-3.456789e-4932", 15, 0, Eof);
402N/A if (1 == std::sscanf ("3.456789e-9999", fmt, &ld) && ld < LDBL_MIN) {
402N/A- TEST (T_MAX, (val = LDBL_MIN, 0.0L), "3.456789e-9999", 14, 0, Eof);
402N/A- TEST (T_MAX, (val = 0.0L, -LDBL_MIN), "-3.456789e-9999", 15, 0, Eof);
402N/A+ TEST (T, (val = LDBL_MIN, 0.0L), "3.456789e-9999", 14, 0, Eof);
402N/A+ TEST (T, (val = 0.0L, -LDBL_MIN), "-3.456789e-9999", 15, 0, Eof);
402N/A+ pmax = 0; // reset before next test
402N/A # ifdef _RWSTD_LDBL_MAX