From 6fe99777e44fdfc7786df4ffd4bf9dd885922af4 Mon Sep 17 00:00:00 2001 From: Etienne Laurin Date: Wed, 11 Sep 2019 17:03:35 +0100 Subject: [PATCH 1/3] Allow pointer tokens to have non-null-terminated strings --- include/rapidjson/pointer.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/rapidjson/pointer.h b/include/rapidjson/pointer.h index 063abab..7ee7414 100644 --- a/include/rapidjson/pointer.h +++ b/include/rapidjson/pointer.h @@ -488,7 +488,7 @@ public: v = &((*v)[t->index]); } else { - typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + typename ValueType::MemberIterator m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); if (m == v->MemberEnd()) { v->AddMember(ValueType(t->name, t->length, allocator).Move(), ValueType().Move(), allocator); v = &(--v->MemberEnd())->value; // Assumes AddMember() appends at the end @@ -543,7 +543,7 @@ public: switch (v->GetType()) { case kObjectType: { - typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + typename ValueType::MemberIterator m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); if (m == v->MemberEnd()) break; v = &m->value; @@ -779,7 +779,7 @@ public: switch (v->GetType()) { case kObjectType: { - typename ValueType::MemberIterator m = v->FindMember(GenericStringRef(t->name, t->length)); + typename ValueType::MemberIterator m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); if (m == v->MemberEnd()) return false; v = &m->value; From 6102f0bd06e9ee8531fa5beb5c1440641b1655dc Mon Sep 17 00:00:00 2001 From: Etienne Laurin Date: Wed, 11 Sep 2019 17:23:15 +0100 Subject: [PATCH 2/3] fix template parameter --- include/rapidjson/pointer.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/rapidjson/pointer.h b/include/rapidjson/pointer.h index 7ee7414..189b303 100644 --- a/include/rapidjson/pointer.h +++ b/include/rapidjson/pointer.h @@ -488,7 +488,7 @@ public: v = &((*v)[t->index]); } else { - typename ValueType::MemberIterator m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); + typename ValueType::MemberIterator m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); if (m == v->MemberEnd()) { v->AddMember(ValueType(t->name, t->length, allocator).Move(), ValueType().Move(), allocator); v = &(--v->MemberEnd())->value; // Assumes AddMember() appends at the end @@ -779,7 +779,7 @@ public: switch (v->GetType()) { case kObjectType: { - typename ValueType::MemberIterator m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); + typename ValueType::MemberIterator m = v->FindMember(GenericValue(GenericStringRef(t->name, t->length))); if (m == v->MemberEnd()) return false; v = &m->value; From 123d7c89a4d6312264d8bfe0857fe7fef7f5c4c8 Mon Sep 17 00:00:00 2001 From: Etienne Laurin Date: Thu, 12 Sep 2019 08:12:06 +0100 Subject: [PATCH 3/3] add test for non-null-terminated token --- test/unittest/pointertest.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/unittest/pointertest.cpp b/test/unittest/pointertest.cpp index 858fd2a..4629f76 100644 --- a/test/unittest/pointertest.cpp +++ b/test/unittest/pointertest.cpp @@ -674,6 +674,9 @@ TEST(Pointer, Get) { EXPECT_EQ(2u, unresolvedTokenIndex); EXPECT_TRUE(Pointer("/foo/0/a").Get(d, &unresolvedTokenIndex) == 0); // "/foo/0" is an string, cannot further query EXPECT_EQ(2u, unresolvedTokenIndex); + + Pointer::Token tokens[] = { { "foo ...", 3, kPointerInvalidIndex } }; + EXPECT_EQ(&d["foo"], Pointer(tokens, 1).Get(d)); } TEST(Pointer, GetWithDefault) {