diff --git a/src/json.hpp b/src/json.hpp index 90bd097fb88bbdda439f0488f6cb01d9a38c9743..a96851581211a41b019e4516ffedab6c4518af8f 100644 --- a/src/json.hpp +++ b/src/json.hpp @@ -7514,11 +7514,6 @@ class basic_json m_limit = m_content + len; } - /// a lexer from a string literal - explicit lexer(const typename string_t::value_type* buff) noexcept - : lexer(reinterpret_cast(buff), strlen(buff)) - {} - /// a lexer from an input stream explicit lexer(std::istream& s) : m_stream(&s), m_line_buffer() @@ -8881,7 +8876,9 @@ basic_json_parser_63: public: /// a parser reading from a string literal parser(const typename string_t::value_type* buff, parser_callback_t cb = nullptr) - : callback(cb), m_lexer(buff) + : callback(cb), + m_lexer(reinterpret_cast(buff), + strlen(buff)) {} /// a parser reading from a string container diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c index 8a9a6c1f631b6a83aea2f71ad8c9dc1c493e9902..82b6a123f8acb69510eec891db0fb8cf75594217 100644 --- a/src/json.hpp.re2c +++ b/src/json.hpp.re2c @@ -7514,11 +7514,6 @@ class basic_json m_limit = m_content + len; } - /// a lexer from a string literal - explicit lexer(const typename string_t::value_type* buff) noexcept - : lexer(reinterpret_cast(buff), strlen(buff)) - {} - /// a lexer from an input stream explicit lexer(std::istream& s) : m_stream(&s), m_line_buffer() @@ -8178,7 +8173,9 @@ class basic_json public: /// a parser reading from a string literal parser(const typename string_t::value_type* buff, parser_callback_t cb = nullptr) - : callback(cb), m_lexer(buff) + : callback(cb), + m_lexer(reinterpret_cast(buff), + strlen(buff)) {} /// a parser reading from a string container diff --git a/test/src/unit-class_lexer.cpp b/test/src/unit-class_lexer.cpp index 708a8cbfa7b1ba21d7e2ee7276518e95b16fa0a5..7cece21c687ee81ec03be519a2ca4a3e1bb84909 100644 --- a/test/src/unit-class_lexer.cpp +++ b/test/src/unit-class_lexer.cpp @@ -38,43 +38,67 @@ TEST_CASE("lexer class") { SECTION("structural characters") { - CHECK(json::lexer("[").scan() == json::lexer::token_type::begin_array); - CHECK(json::lexer("]").scan() == json::lexer::token_type::end_array); - CHECK(json::lexer("{").scan() == json::lexer::token_type::begin_object); - CHECK(json::lexer("}").scan() == json::lexer::token_type::end_object); - CHECK(json::lexer(",").scan() == json::lexer::token_type::value_separator); - CHECK(json::lexer(":").scan() == json::lexer::token_type::name_separator); + CHECK(json::lexer(reinterpret_cast("["), + 1).scan() == json::lexer::token_type::begin_array); + CHECK(json::lexer(reinterpret_cast("]"), + 1).scan() == json::lexer::token_type::end_array); + CHECK(json::lexer(reinterpret_cast("{"), + 1).scan() == json::lexer::token_type::begin_object); + CHECK(json::lexer(reinterpret_cast("}"), + 1).scan() == json::lexer::token_type::end_object); + CHECK(json::lexer(reinterpret_cast(","), + 1).scan() == json::lexer::token_type::value_separator); + CHECK(json::lexer(reinterpret_cast(":"), + 1).scan() == json::lexer::token_type::name_separator); } SECTION("literal names") { - CHECK(json::lexer("null").scan() == json::lexer::token_type::literal_null); - CHECK(json::lexer("true").scan() == json::lexer::token_type::literal_true); - CHECK(json::lexer("false").scan() == json::lexer::token_type::literal_false); + CHECK(json::lexer(reinterpret_cast("null"), + 4).scan() == json::lexer::token_type::literal_null); + CHECK(json::lexer(reinterpret_cast("true"), + 4).scan() == json::lexer::token_type::literal_true); + CHECK(json::lexer(reinterpret_cast("false"), + 5).scan() == json::lexer::token_type::literal_false); } SECTION("numbers") { - CHECK(json::lexer("0").scan() == json::lexer::token_type::value_number); - CHECK(json::lexer("1").scan() == json::lexer::token_type::value_number); - CHECK(json::lexer("2").scan() == json::lexer::token_type::value_number); - CHECK(json::lexer("3").scan() == json::lexer::token_type::value_number); - CHECK(json::lexer("4").scan() == json::lexer::token_type::value_number); - CHECK(json::lexer("5").scan() == json::lexer::token_type::value_number); - CHECK(json::lexer("6").scan() == json::lexer::token_type::value_number); - CHECK(json::lexer("7").scan() == json::lexer::token_type::value_number); - CHECK(json::lexer("8").scan() == json::lexer::token_type::value_number); - CHECK(json::lexer("9").scan() == json::lexer::token_type::value_number); + CHECK(json::lexer(reinterpret_cast("0"), + 1).scan() == json::lexer::token_type::value_number); + CHECK(json::lexer(reinterpret_cast("1"), + 1).scan() == json::lexer::token_type::value_number); + CHECK(json::lexer(reinterpret_cast("2"), + 1).scan() == json::lexer::token_type::value_number); + CHECK(json::lexer(reinterpret_cast("3"), + 1).scan() == json::lexer::token_type::value_number); + CHECK(json::lexer(reinterpret_cast("4"), + 1).scan() == json::lexer::token_type::value_number); + CHECK(json::lexer(reinterpret_cast("5"), + 1).scan() == json::lexer::token_type::value_number); + CHECK(json::lexer(reinterpret_cast("6"), + 1).scan() == json::lexer::token_type::value_number); + CHECK(json::lexer(reinterpret_cast("7"), + 1).scan() == json::lexer::token_type::value_number); + CHECK(json::lexer(reinterpret_cast("8"), + 1).scan() == json::lexer::token_type::value_number); + CHECK(json::lexer(reinterpret_cast("9"), + 1).scan() == json::lexer::token_type::value_number); } SECTION("whitespace") { // result is end_of_input, because not token is following - CHECK(json::lexer(" ").scan() == json::lexer::token_type::end_of_input); - CHECK(json::lexer("\t").scan() == json::lexer::token_type::end_of_input); - CHECK(json::lexer("\n").scan() == json::lexer::token_type::end_of_input); - CHECK(json::lexer("\r").scan() == json::lexer::token_type::end_of_input); - CHECK(json::lexer(" \t\n\r\n\t ").scan() == json::lexer::token_type::end_of_input); + CHECK(json::lexer(reinterpret_cast(" "), + 1).scan() == json::lexer::token_type::end_of_input); + CHECK(json::lexer(reinterpret_cast("\t"), + 1).scan() == json::lexer::token_type::end_of_input); + CHECK(json::lexer(reinterpret_cast("\n"), + 1).scan() == json::lexer::token_type::end_of_input); + CHECK(json::lexer(reinterpret_cast("\r"), + 1).scan() == json::lexer::token_type::end_of_input); + CHECK(json::lexer(reinterpret_cast(" \t\n\r\n\t "), + 7).scan() == json::lexer::token_type::end_of_input); } } @@ -100,7 +124,11 @@ TEST_CASE("lexer class") { for (int c = 1; c < 128; ++c) { - auto s = std::string(1, c); + // create string from the ASCII code + const auto s = std::string(1, c); + // store scan() result + const auto res = json::lexer(reinterpret_cast(s.c_str()), + 1).scan(); switch (c) { @@ -122,7 +150,7 @@ TEST_CASE("lexer class") case ('8'): case ('9'): { - CHECK(json::lexer(s.c_str()).scan() != json::lexer::token_type::parse_error); + CHECK(res != json::lexer::token_type::parse_error); break; } @@ -132,14 +160,14 @@ TEST_CASE("lexer class") case ('\n'): case ('\r'): { - CHECK(json::lexer(s.c_str()).scan() == json::lexer::token_type::end_of_input); + CHECK(res == json::lexer::token_type::end_of_input); break; } // anything else is not expected default: { - CHECK(json::lexer(s.c_str()).scan() == json::lexer::token_type::parse_error); + CHECK(res == json::lexer::token_type::parse_error); break; } }