Skip to content

Commit

Permalink
Fix FileReadStream::Peek4().
Browse files Browse the repository at this point in the history
Until Read() reaches EOF, Peek4() must not take off by one in
bufferLast_ into account; otherwise a buffer of size exactly 4 always
returns NULL.
  • Loading branch information
ylavic committed Dec 6, 2018
1 parent 30d92a6 commit 38d25d7
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 2 deletions.
1 change: 1 addition & 0 deletions bin/data/abcde.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
abcde
2 changes: 1 addition & 1 deletion include/rapidjson/filereadstream.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ class FileReadStream {

// For encoding detection only.
const Ch* Peek4() const {
return (current_ + 4 <= bufferLast_) ? current_ : 0;
return (current_ + 4 - !eof_ <= bufferLast_) ? current_ : 0;
}

private:
Expand Down
45 changes: 44 additions & 1 deletion test/unittest/filestreamtest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down Expand Up @@ -49,6 +49,24 @@ class FileStreamTest : public ::testing::Test {
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() {
Expand All @@ -64,6 +82,7 @@ class FileStreamTest : public ::testing::Test {
const char* filename_;
char *json_;
size_t length_;
const char* abcde_;
};

FileStreamTest::~FileStreamTest() {}
Expand All @@ -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);
Expand Down

0 comments on commit 38d25d7

Please sign in to comment.