1313#include < fstream> // std::ifstream
1414#include < istream> // std::basic_istream
1515#include < ostream> // std::basic_ostream
16+ #include < sstream> // std::basic_ostringstream
1617#include < system_error> // std::make_error_code, std::errc
1718
1819namespace sourcemeta ::core {
@@ -21,7 +22,20 @@ namespace sourcemeta::core {
2122auto parse_json (std::basic_istream<JSON::Char, JSON::CharTraits> &stream,
2223 std::uint64_t &line, std::uint64_t &column,
2324 const JSON::ParseCallback &callback) -> JSON {
24- return internal_parse_json (stream, line, column, callback);
25+ const auto start_position{stream.tellg ()};
26+ std::basic_ostringstream<JSON::Char, JSON::CharTraits> buffer;
27+ buffer << stream.rdbuf ();
28+ const auto input{buffer.str ()};
29+ const char *cursor{input.data ()};
30+ const char *end{input.data () + input.size ()};
31+ auto result{internal_parse_json (cursor, end, line, column, callback)};
32+ if (start_position != static_cast <std::streampos>(-1 )) {
33+ const auto consumed{static_cast <std::streamoff>(cursor - input.data ())};
34+ stream.clear ();
35+ stream.seekg (start_position + consumed);
36+ }
37+
38+ return result;
2539}
2640
2741auto parse_json (const std::basic_string<JSON::Char, JSON::CharTraits> &input,
0 commit comments