LibC: Fix strtou{,l,ll} for negative values

Also set endp if base is invalid
This commit is contained in:
Bananymous 2025-05-20 21:13:31 +03:00
parent bce3dd045f
commit 356935bd4f
1 changed files with 12 additions and 5 deletions

View File

@ -69,10 +69,8 @@ static constexpr int get_base_digit(char c, int base)
} }
template<BAN::integral T> template<BAN::integral T>
static constexpr bool will_digit_append_overflow(bool negative, T current, int digit, int base) static constexpr bool will_digit_append_overflow(T current, int digit, int base)
{ {
if (BAN::is_unsigned_v<T> && negative && digit)
return true;
if (BAN::Math::will_multiplication_overflow<T>(current, base)) if (BAN::Math::will_multiplication_overflow<T>(current, base))
return true; return true;
if (BAN::Math::will_addition_overflow<T>(current * base, current < 0 ? -digit : digit)) if (BAN::Math::will_addition_overflow<T>(current * base, current < 0 ? -digit : digit))
@ -86,6 +84,8 @@ static T strtoT(const char* str, char** endp, int base, int& error)
// validate base // validate base
if (base != 0 && (base < 2 || base > 36)) if (base != 0 && (base < 2 || base > 36))
{ {
if (endp)
*endp = const_cast<char*>(str);
error = EINVAL; error = EINVAL;
return 0; return 0;
} }
@ -134,11 +134,18 @@ static T strtoT(const char* str, char** endp, int base, int& error)
break; break;
str++; str++;
overflow = will_digit_append_overflow(negative, result, digit, base); overflow = will_digit_append_overflow(result, digit, base);
if (!overflow) if (!overflow)
result = result * base + (negative ? -digit : digit); {
if (negative && !BAN::is_unsigned_v<T>)
digit = -digit;
result = result * base + digit;
}
} }
if (negative && BAN::is_unsigned_v<T>)
result = -result;
// save endp if asked // save endp if asked
if (endp) if (endp)
{ {