| 3126 | **/ |
| 3127 | template <typename T> |
| 3128 | from_chars_result FASTFLOAT_CONSTEXPR14 |
| 3129 | parse_infnan(const char *first, const char *last, T &value) noexcept { |
| 3130 | from_chars_result answer{}; |
| 3131 | answer.ptr = first; |
| 3132 | answer.ec = std::errc(); // be optimistic |
| 3133 | bool minusSign = false; |
| 3134 | if (*first == '-') { // assume first < last, so dereference without checks; C++17 20.19.3.(7.1) explicitly forbids '+' here |
| 3135 | minusSign = true; |
| 3136 | ++first; |
| 3137 | } |
| 3138 | #if FASTFLOAT_ALLOWS_LEADING_PLUS // disabled by default |
| 3139 | if (*first == '+') { |
| 3140 | ++first; |
| 3141 | } |
| 3142 | #endif |
| 3143 | if (last - first >= 3) { |
| 3144 | if (fastfloat_strncasecmp(first, "nan", 3)) { |
| 3145 | answer.ptr = (first += 3); |
| 3146 | value = minusSign ? -std::numeric_limits<T>::quiet_NaN() : std::numeric_limits<T>::quiet_NaN(); |
| 3147 | // Check for possible nan(n-char-seq-opt), C++17 20.19.3.7, C11 7.20.1.3.3. At least MSVC produces nan(ind) and nan(snan). |
| 3148 | if(first != last && *first == '(') { |
| 3149 | for(const char* ptr = first + 1; ptr != last; ++ptr) { |
| 3150 | if (*ptr == ')') { |
| 3151 | answer.ptr = ptr + 1; // valid nan(n-char-seq-opt) |
| 3152 | break; |
| 3153 | } |
| 3154 | else if(!(('a' <= *ptr && *ptr <= 'z') || ('A' <= *ptr && *ptr <= 'Z') || ('0' <= *ptr && *ptr <= '9') || *ptr == '_')) |
| 3155 | break; // forbidden char, not nan(n-char-seq-opt) |
| 3156 | } |
| 3157 | } |
| 3158 | return answer; |
| 3159 | } |
| 3160 | if (fastfloat_strncasecmp(first, "inf", 3)) { |
| 3161 | if ((last - first >= 8) && fastfloat_strncasecmp(first + 3, "inity", 5)) { |
| 3162 | answer.ptr = first + 8; |
| 3163 | } else { |
| 3164 | answer.ptr = first + 3; |
| 3165 | } |
| 3166 | value = minusSign ? -std::numeric_limits<T>::infinity() : std::numeric_limits<T>::infinity(); |
| 3167 | return answer; |
| 3168 | } |
| 3169 | } |
| 3170 | answer.ec = std::errc::invalid_argument; |
| 3171 | return answer; |
| 3172 | } |
| 3173 | |
| 3174 | /** |
| 3175 | * Returns true if the floating-pointing rounding mode is to 'nearest'. |
nothing calls this directly
no test coverage detected