Skip to content

Commit 56d3f7c

Browse files
committed
Return excess unconsumed characters
1 parent 9ed22d9 commit 56d3f7c

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

include/boost/int128/iostream.hpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ auto operator>>(std::basic_istream<charT, traits>& is, LibIntegerType& v)
4343
charT t_buffer[64] {};
4444
is >> std::ws >> std::setw(63) >> t_buffer;
4545

46+
const auto t_buffer_len {std::char_traits<charT>::length(t_buffer)};
47+
4648
char buffer[64] {};
4749
auto buffer_start {buffer};
4850

@@ -81,7 +83,18 @@ auto operator>>(std::basic_istream<charT, traits>& is, LibIntegerType& v)
8183
}
8284
}
8385

84-
detail::from_chars(buffer_start, buffer + detail::strlen(buffer), v, base);
86+
const auto r {detail::from_chars(buffer_start, buffer + detail::strlen(buffer), v, base)};
87+
88+
// Put back unconsumed characters
89+
// If r is greater than 0 then an errno values has been hit
90+
const auto consumed {r > 0 ? 0 : -r};
91+
BOOST_INT128_ASSERT(t_buffer_len >= consumed);
92+
const auto return_chars {static_cast<std::size_t>(t_buffer_len - consumed)};
93+
94+
for (std::size_t i {}; i < return_chars; ++i)
95+
{
96+
is.putback(t_buffer[t_buffer_len - i - 1]);
97+
}
8598

8699
return is;
87100
}

0 commit comments

Comments
 (0)