🐛 fixed a bug in the unget function

parent 011b15dd
...@@ -154,11 +154,6 @@ class parse_error : public exception ...@@ -154,11 +154,6 @@ class parse_error : public exception
static std::string position_string(const position_t& pos) static std::string position_string(const position_t& pos)
{ {
if (pos.chars_read_total == 0)
{
return "";
}
return " at line " + std::to_string(pos.lines_read + 1) + return " at line " + std::to_string(pos.lines_read + 1) +
", column " + std::to_string(pos.chars_read_current_line); ", column " + std::to_string(pos.chars_read_current_line);
} }
......
...@@ -1278,12 +1278,18 @@ scan_number_done: ...@@ -1278,12 +1278,18 @@ scan_number_done:
next_unget = true; next_unget = true;
--position.chars_read_total; --position.chars_read_total;
--position.chars_read_current_line;
// in case we "unget" a newline, we have to also decrement the lines_read // in case we "unget" a newline, we have to also decrement the lines_read
if (position.lines_read != 0 and position.chars_read_current_line == 0) if (position.chars_read_current_line == 0)
{ {
--position.lines_read; if (position.lines_read > 0)
{
--position.lines_read;
}
}
else
{
--position.chars_read_current_line;
} }
if (JSON_LIKELY(current != std::char_traits<char>::eof())) if (JSON_LIKELY(current != std::char_traits<char>::eof()))
......
...@@ -795,11 +795,6 @@ class parse_error : public exception ...@@ -795,11 +795,6 @@ class parse_error : public exception
static std::string position_string(const position_t& pos) static std::string position_string(const position_t& pos)
{ {
if (pos.chars_read_total == 0)
{
return "";
}
return " at line " + std::to_string(pos.lines_read + 1) + return " at line " + std::to_string(pos.lines_read + 1) +
", column " + std::to_string(pos.chars_read_current_line); ", column " + std::to_string(pos.chars_read_current_line);
} }
...@@ -3595,12 +3590,18 @@ scan_number_done: ...@@ -3595,12 +3590,18 @@ scan_number_done:
next_unget = true; next_unget = true;
--position.chars_read_total; --position.chars_read_total;
--position.chars_read_current_line;
// in case we "unget" a newline, we have to also decrement the lines_read // in case we "unget" a newline, we have to also decrement the lines_read
if (position.lines_read != 0 and position.chars_read_current_line == 0) if (position.chars_read_current_line == 0)
{
if (position.lines_read > 0)
{
--position.lines_read;
}
}
else
{ {
--position.lines_read; --position.chars_read_current_line;
} }
if (JSON_LIKELY(current != std::char_traits<char>::eof())) if (JSON_LIKELY(current != std::char_traits<char>::eof()))
......
...@@ -1292,6 +1292,9 @@ TEST_CASE("parser class") ...@@ -1292,6 +1292,9 @@ TEST_CASE("parser class")
CHECK(accept_helper("\"\\u01") == false); CHECK(accept_helper("\"\\u01") == false);
CHECK(accept_helper("\"\\u012") == false); CHECK(accept_helper("\"\\u012") == false);
// unget of newline
CHECK(parser_helper("\n123\n") == 123);
// invalid escapes // invalid escapes
for (int c = 1; c < 128; ++c) for (int c = 1; c < 128; ++c)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment