From 59c8343851ffb9ce48ec9f20bee233730835f990 Mon Sep 17 00:00:00 2001
From: Niels <niels.lohmann@gmail.com>
Date: Wed, 2 Nov 2016 15:44:46 +0100
Subject: [PATCH] cleanup

---
 src/json.hpp                      | 48 +++++++++++++++----------------
 src/json.hpp.re2c                 | 32 ++++++++++-----------
 test/src/unit-deserialization.cpp | 27 +++++++++--------
 3 files changed, 55 insertions(+), 52 deletions(-)

diff --git a/src/json.hpp b/src/json.hpp
index 54266ba3..a52d2c24 100644
--- a/src/json.hpp
+++ b/src/json.hpp
@@ -7836,7 +7836,7 @@ class basic_json
                     };
                     if ((m_limit - m_cursor) < 5)
                     {
-                        fill_line_buffer();    // LCOV_EXCL_LINE;
+                        fill_line_buffer(5);    // LCOV_EXCL_LINE
                     }
                     yych = *m_cursor;
                     if (yybm[0 + yych] & 32)
@@ -7966,7 +7966,7 @@ basic_json_parser_6:
                     ++m_cursor;
                     if (m_limit <= m_cursor)
                     {
-                        fill_line_buffer();    // LCOV_EXCL_LINE;
+                        fill_line_buffer(1);    // LCOV_EXCL_LINE
                     }
                     yych = *m_cursor;
                     if (yybm[0 + yych] & 32)
@@ -8048,7 +8048,7 @@ basic_json_parser_15:
                     m_marker = ++m_cursor;
                     if ((m_limit - m_cursor) < 3)
                     {
-                        fill_line_buffer();    // LCOV_EXCL_LINE;
+                        fill_line_buffer(3);    // LCOV_EXCL_LINE
                     }
                     yych = *m_cursor;
                     if (yybm[0 + yych] & 64)
@@ -8133,7 +8133,7 @@ basic_json_parser_30:
                     ++m_cursor;
                     if (m_limit <= m_cursor)
                     {
-                        fill_line_buffer();    // LCOV_EXCL_LINE;
+                        fill_line_buffer(1);    // LCOV_EXCL_LINE
                     }
                     yych = *m_cursor;
 basic_json_parser_31:
@@ -8214,7 +8214,7 @@ basic_json_parser_35:
                     ++m_cursor;
                     if (m_limit <= m_cursor)
                     {
-                        fill_line_buffer();    // LCOV_EXCL_LINE;
+                        fill_line_buffer(1);    // LCOV_EXCL_LINE
                     }
                     yych = *m_cursor;
                     if (yych <= 'e')
@@ -8293,7 +8293,7 @@ basic_json_parser_36:
                     ++m_cursor;
                     if (m_limit <= m_cursor)
                     {
-                        fill_line_buffer();    // LCOV_EXCL_LINE;
+                        fill_line_buffer(1);    // LCOV_EXCL_LINE
                     }
                     yych = *m_cursor;
                     if (yych <= 0x7F)
@@ -8309,7 +8309,7 @@ basic_json_parser_37:
                     ++m_cursor;
                     if (m_limit <= m_cursor)
                     {
-                        fill_line_buffer();    // LCOV_EXCL_LINE;
+                        fill_line_buffer(1);    // LCOV_EXCL_LINE
                     }
                     yych = *m_cursor;
                     if (yych <= 0x9F)
@@ -8325,7 +8325,7 @@ basic_json_parser_38:
                     ++m_cursor;
                     if (m_limit <= m_cursor)
                     {
-                        fill_line_buffer();    // LCOV_EXCL_LINE;
+                        fill_line_buffer(1);    // LCOV_EXCL_LINE
                     }
                     yych = *m_cursor;
                     if (yych <= 0x7F)
@@ -8341,7 +8341,7 @@ basic_json_parser_39:
                     ++m_cursor;
                     if (m_limit <= m_cursor)
                     {
-                        fill_line_buffer();    // LCOV_EXCL_LINE;
+                        fill_line_buffer(1);    // LCOV_EXCL_LINE
                     }
                     yych = *m_cursor;
                     if (yych <= 0x7F)
@@ -8357,7 +8357,7 @@ basic_json_parser_40:
                     ++m_cursor;
                     if (m_limit <= m_cursor)
                     {
-                        fill_line_buffer();    // LCOV_EXCL_LINE;
+                        fill_line_buffer(1);    // LCOV_EXCL_LINE
                     }
                     yych = *m_cursor;
                     if (yych <= 0x8F)
@@ -8373,7 +8373,7 @@ basic_json_parser_41:
                     ++m_cursor;
                     if (m_limit <= m_cursor)
                     {
-                        fill_line_buffer();    // LCOV_EXCL_LINE;
+                        fill_line_buffer(1);    // LCOV_EXCL_LINE
                     }
                     yych = *m_cursor;
                     if (yych <= 0x7F)
@@ -8389,7 +8389,7 @@ basic_json_parser_42:
                     ++m_cursor;
                     if (m_limit <= m_cursor)
                     {
-                        fill_line_buffer();    // LCOV_EXCL_LINE;
+                        fill_line_buffer(1);    // LCOV_EXCL_LINE
                     }
                     yych = *m_cursor;
                     if (yych <= 0x7F)
@@ -8463,7 +8463,7 @@ basic_json_parser_48:
                     ++m_cursor;
                     if (m_limit <= m_cursor)
                     {
-                        fill_line_buffer();    // LCOV_EXCL_LINE;
+                        fill_line_buffer(1);    // LCOV_EXCL_LINE
                     }
                     yych = *m_cursor;
                     if (yych <= '@')
@@ -8499,7 +8499,7 @@ basic_json_parser_49:
                     m_marker = ++m_cursor;
                     if ((m_limit - m_cursor) < 3)
                     {
-                        fill_line_buffer();    // LCOV_EXCL_LINE;
+                        fill_line_buffer(3);    // LCOV_EXCL_LINE
                     }
                     yych = *m_cursor;
                     if (yych <= 'D')
@@ -8540,7 +8540,7 @@ basic_json_parser_52:
                     ++m_cursor;
                     if (m_limit <= m_cursor)
                     {
-                        fill_line_buffer();    // LCOV_EXCL_LINE;
+                        fill_line_buffer(1);    // LCOV_EXCL_LINE
                     }
                     yych = *m_cursor;
                     if (yych <= '/')
@@ -8577,7 +8577,7 @@ basic_json_parser_57:
                     ++m_cursor;
                     if (m_limit <= m_cursor)
                     {
-                        fill_line_buffer();    // LCOV_EXCL_LINE;
+                        fill_line_buffer(1);    // LCOV_EXCL_LINE
                     }
                     yych = *m_cursor;
                     if (yych <= '@')
@@ -8631,7 +8631,7 @@ basic_json_parser_63:
                     ++m_cursor;
                     if (m_limit <= m_cursor)
                     {
-                        fill_line_buffer();    // LCOV_EXCL_LINE;
+                        fill_line_buffer(1);    // LCOV_EXCL_LINE
                     }
                     yych = *m_cursor;
                     if (yych <= '@')
@@ -8672,7 +8672,7 @@ basic_json_parser_66:
                     ++m_cursor;
                     if (m_limit <= m_cursor)
                     {
-                        fill_line_buffer();    // LCOV_EXCL_LINE;
+                        fill_line_buffer(1);    // LCOV_EXCL_LINE
                     }
                     yych = *m_cursor;
                     if (yych <= '@')
@@ -8738,7 +8738,7 @@ basic_json_parser_66:
             m_start
             m_content
         */
-        void fill_line_buffer()
+        void fill_line_buffer(size_t n = 0)
         {
             // number of processed characters (p)
             const auto offset_start = m_start - m_content;
@@ -8761,10 +8761,10 @@ basic_json_parser_66:
                     }
                 }
 
-                // append 5 characters (size of longest keyword "false") to
-                // make sure that there is sufficient space between m_cursor
-                // and m_limit
-                m_line_buffer.append(5, '\0');
+                // append n characters to make sure that there is sufficient
+                // space between m_cursor and m_limit
+                m_line_buffer.append(1, '\x00');
+                m_line_buffer.append(n - 1, '\x01');
             }
             else
             {
@@ -8772,7 +8772,7 @@ basic_json_parser_66:
                 m_line_buffer.erase(0, static_cast<size_t>(offset_start));
                 // read next line from input stream
                 std::string line;
-                std::getline(*m_stream, line);
+                std::getline(*m_stream, line, '\n');
                 // add line with newline symbol to the line buffer
                 m_line_buffer += line + "\n";
             }
diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c
index eeebd309..476903cd 100644
--- a/src/json.hpp.re2c
+++ b/src/json.hpp.re2c
@@ -7796,15 +7796,15 @@ class basic_json
                 assert(m_start != nullptr);
 
                 /*!re2c
-                    re2c:define:YYCTYPE   = lexer_char_t;
-                    re2c:define:YYCURSOR  = m_cursor;
-                    re2c:define:YYLIMIT   = m_limit;
-                    re2c:define:YYMARKER  = m_marker;
-                    re2c:define:YYFILL    = "fill_line_buffer(); // LCOV_EXCL_LINE";
-                    re2c:yyfill:parameter = 0;
-                    re2c:indent:string    = "    ";
-                    re2c:indent:top       = 1;
-                    re2c:labelprefix      = "basic_json_parser_";
+                    re2c:define:YYCTYPE      = lexer_char_t;
+                    re2c:define:YYCURSOR     = m_cursor;
+                    re2c:define:YYLIMIT      = m_limit;
+                    re2c:define:YYMARKER     = m_marker;
+                    re2c:define:YYFILL       = "fill_line_buffer(@@); // LCOV_EXCL_LINE";
+                    re2c:define:YYFILL:naked = 1;
+                    re2c:indent:string       = "    ";
+                    re2c:indent:top          = 1;
+                    re2c:labelprefix         = "basic_json_parser_";
 
                     // ignore whitespace
                     ws = [ \t\n\r]+;
@@ -7849,7 +7849,7 @@ class basic_json
                     string          { last_token_type = token_type::value_string; break; }
 
                     // end of file
-                    "\000"         { last_token_type = token_type::end_of_input; break; }
+                    "\x00"         { last_token_type = token_type::end_of_input; break; }
 
                     // anything else is an error
                     *              { last_token_type = token_type::parse_error; break; }
@@ -7887,7 +7887,7 @@ class basic_json
             m_start
             m_content
         */
-        void fill_line_buffer()
+        void fill_line_buffer(size_t n = 0)
         {
             // number of processed characters (p)
             const auto offset_start = m_start - m_content;
@@ -7910,10 +7910,10 @@ class basic_json
                     }
                 }
 
-                // append 5 characters (size of longest keyword "false") to
-                // make sure that there is sufficient space between m_cursor
-                // and m_limit
-                m_line_buffer.append(5, '\0');
+                // append n characters to make sure that there is sufficient
+                // space between m_cursor and m_limit
+                m_line_buffer.append(1, '\x00');
+                m_line_buffer.append(n - 1, '\x01');
             }
             else
             {
@@ -7921,7 +7921,7 @@ class basic_json
                 m_line_buffer.erase(0, static_cast<size_t>(offset_start));
                 // read next line from input stream
                 std::string line;
-                std::getline(*m_stream, line);
+                std::getline(*m_stream, line, '\n');
                 // add line with newline symbol to the line buffer
                 m_line_buffer += line + "\n";
             }
diff --git a/test/src/unit-deserialization.cpp b/test/src/unit-deserialization.cpp
index a46ffced..5d6fcb34 100644
--- a/test/src/unit-deserialization.cpp
+++ b/test/src/unit-deserialization.cpp
@@ -87,10 +87,11 @@ TEST_CASE("deserialization")
     {
         SECTION("stream")
         {
-            std::stringstream ss;
-            ss << "[\"foo\",1,2,3,false,{\"one\":1}";
-            CHECK_THROWS_AS(json::parse(ss), std::invalid_argument);
-            CHECK_THROWS_WITH(json::parse(ss), "parse error - unexpected end of input");
+            std::stringstream ss1, ss2;
+            ss1 << "[\"foo\",1,2,3,false,{\"one\":1}";
+            ss2 << "[\"foo\",1,2,3,false,{\"one\":1}";
+            CHECK_THROWS_AS(json::parse(ss1), std::invalid_argument);
+            CHECK_THROWS_WITH(json::parse(ss2), "parse error - unexpected end of input; expected ']'");
         }
 
         SECTION("string")
@@ -102,20 +103,22 @@ TEST_CASE("deserialization")
 
         SECTION("operator<<")
         {
-            std::stringstream ss;
-            ss << "[\"foo\",1,2,3,false,{\"one\":1}";
+            std::stringstream ss1, ss2;
+            ss1 << "[\"foo\",1,2,3,false,{\"one\":1}";
+            ss2 << "[\"foo\",1,2,3,false,{\"one\":1}";
             json j;
-            CHECK_THROWS_AS(j << ss, std::invalid_argument);
-            CHECK_THROWS_WITH(j << ss, "parse error - unexpected end of input");
+            CHECK_THROWS_AS(j << ss1, std::invalid_argument);
+            CHECK_THROWS_WITH(j << ss2, "parse error - unexpected end of input; expected ']'");
         }
 
         SECTION("operator>>")
         {
-            std::stringstream ss;
-            ss << "[\"foo\",1,2,3,false,{\"one\":1}";
+            std::stringstream ss1, ss2;
+            ss1 << "[\"foo\",1,2,3,false,{\"one\":1}";
+            ss2 << "[\"foo\",1,2,3,false,{\"one\":1}";
             json j;
-            CHECK_THROWS_AS(ss >> j, std::invalid_argument);
-            CHECK_THROWS_WITH(ss >> j, "parse error - unexpected end of input");
+            CHECK_THROWS_AS(ss1 >> j, std::invalid_argument);
+            CHECK_THROWS_WITH(ss2 >> j, "parse error - unexpected end of input; expected ']'");
         }
 
         SECTION("user-defined string literal")