diff options
author | Milo Yip <miloyip@gmail.com> | 2018-12-06 23:44:10 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-06 23:44:10 +0800 |
commit | 66eb6067b10fd02e419f88816a8833a64eb33551 (patch) | |
tree | 6a1b03edeec52d0eb19d72d9264e17899fcdaa5f | |
parent | b4b0e13b4d05b5977b66ef38ddef769bc49faa20 (diff) | |
parent | 38d25d7458526c3dbf15b4935e5c9d736ef4209f (diff) | |
download | rapidjson-66eb6067b10fd02e419f88816a8833a64eb33551.tar.gz |
Merge pull request #1425 from ylavic/filereadstream_peek4
Fix off by one in FileReadStream::Peek4()
-rw-r--r-- | bin/data/abcde.txt | 1 | ||||
-rw-r--r-- | include/rapidjson/filereadstream.h | 2 | ||||
-rw-r--r-- | test/unittest/filestreamtest.cpp | 45 |
3 files changed, 46 insertions, 2 deletions
diff --git a/bin/data/abcde.txt b/bin/data/abcde.txt new file mode 100644 index 0000000..6a81654 --- /dev/null +++ b/bin/data/abcde.txt @@ -0,0 +1 @@ +abcde
\ No newline at end of file diff --git a/include/rapidjson/filereadstream.h b/include/rapidjson/filereadstream.h index f1bfb7d..6b34370 100644 --- a/include/rapidjson/filereadstream.h +++ b/include/rapidjson/filereadstream.h @@ -59,7 +59,7 @@ public: // For encoding detection only. const Ch* Peek4() const { - return (current_ + 4 <= bufferLast_) ? current_ : 0; + return (current_ + 4 - !eof_ <= bufferLast_) ? current_ : 0; } private: diff --git a/test/unittest/filestreamtest.cpp b/test/unittest/filestreamtest.cpp index a38133f..0e243ab 100644 --- a/test/unittest/filestreamtest.cpp +++ b/test/unittest/filestreamtest.cpp @@ -21,7 +21,7 @@ using namespace rapidjson; class FileStreamTest : public ::testing::Test { public: - FileStreamTest() : filename_(), json_(), length_() {} + FileStreamTest() : filename_(), json_(), length_(), abcde_() {} virtual ~FileStreamTest(); virtual void SetUp() { @@ -49,6 +49,24 @@ public: size_t readLength = fread(json_, 1, length_, fp); json_[readLength] = '\0'; fclose(fp); + + const char *abcde_paths[] = { + "data/abcde.txt", + "bin/data/abcde.txt", + "../bin/data/abcde.txt", + "../../bin/data/abcde.txt", + "../../../bin/data/abcde.txt" + }; + fp = 0; + for (size_t i = 0; i < sizeof(abcde_paths) / sizeof(abcde_paths[0]); i++) { + fp = fopen(abcde_paths[i], "rb"); + if (fp) { + abcde_ = abcde_paths[i]; + break; + } + } + ASSERT_TRUE(fp != 0); + fclose(fp); } virtual void TearDown() { @@ -64,6 +82,7 @@ protected: const char* filename_; char *json_; size_t length_; + const char* abcde_; }; FileStreamTest::~FileStreamTest() {} @@ -86,6 +105,30 @@ TEST_F(FileStreamTest, FileReadStream) { fclose(fp); } +TEST_F(FileStreamTest, FileReadStream_Peek4) { + FILE *fp = fopen(abcde_, "rb"); + ASSERT_TRUE(fp != 0); + char buffer[4]; + FileReadStream s(fp, buffer, sizeof(buffer)); + + const char* c = s.Peek4(); + for (int i = 0; i < 4; i++) + EXPECT_EQ('a' + i, c[i]); + EXPECT_EQ(0u, s.Tell()); + + for (int i = 0; i < 5; i++) { + EXPECT_EQ(static_cast<size_t>(i), s.Tell()); + EXPECT_EQ('a' + i, s.Peek()); + EXPECT_EQ('a' + i, s.Peek()); + EXPECT_EQ('a' + i, s.Take()); + } + EXPECT_EQ(5u, s.Tell()); + EXPECT_EQ(0, s.Peek()); + EXPECT_EQ(0, s.Take()); + + fclose(fp); +} + TEST_F(FileStreamTest, FileWriteStream) { char filename[L_tmpnam]; FILE* fp = TempFile(filename); |