mirror of
https://github.com/bblanchon/ArduinoJson.git
synced 2025-07-15 11:36:36 +02:00
Check for NUL terminator in MemoryPool::findString()
This commit is contained in:
@ -37,6 +37,12 @@ class String {
|
||||
return *this;
|
||||
}
|
||||
|
||||
char operator[](unsigned int index) const {
|
||||
if (index >= _str.size())
|
||||
return 0;
|
||||
return _str[index];
|
||||
}
|
||||
|
||||
friend std::ostream& operator<<(std::ostream& lhs, const ::String& rhs) {
|
||||
lhs << rhs._str;
|
||||
return lhs;
|
||||
|
@ -166,9 +166,21 @@ class MemoryPool {
|
||||
|
||||
#if ARDUINOJSON_ENABLE_STRING_DEDUPLICATION
|
||||
template <typename TAdaptedString>
|
||||
const char* findString(const TAdaptedString& str) {
|
||||
for (char* next = _begin; next < _left; ++next) {
|
||||
if (str.compare(next) == 0)
|
||||
static bool stringEquals(const char* p, size_t n, const TAdaptedString& s) {
|
||||
if (p[n]) // check terminator first
|
||||
return false;
|
||||
for (size_t i = 0; i < n; i++) {
|
||||
if (p[i] != s[i])
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename TAdaptedString>
|
||||
const char* findString(const TAdaptedString& str) const {
|
||||
size_t n = str.size();
|
||||
for (char* next = _begin; next + n < _left; ++next) {
|
||||
if (stringEquals(next, n, str))
|
||||
return next;
|
||||
|
||||
// jump to next terminator
|
||||
|
@ -32,6 +32,11 @@ class StringAdapter< ::String> {
|
||||
return safe_strcmp(me, other);
|
||||
}
|
||||
|
||||
char operator[](size_t i) const {
|
||||
ARDUINOJSON_ASSERT(_str != 0);
|
||||
return _str->operator[](static_cast<unsigned int>(i));
|
||||
}
|
||||
|
||||
size_t size() const {
|
||||
return _str->length();
|
||||
}
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include <stddef.h> // size_t
|
||||
#include <string.h> // strcmp
|
||||
|
||||
#include <ArduinoJson/Polyfills/assert.hpp>
|
||||
#include <ArduinoJson/Polyfills/safe_strcmp.hpp>
|
||||
#include <ArduinoJson/Strings/StoragePolicy.hpp>
|
||||
#include <ArduinoJson/Strings/StringAdapter.hpp>
|
||||
@ -32,6 +33,12 @@ class StringAdapter<const char*> {
|
||||
return strlen(_str);
|
||||
}
|
||||
|
||||
char operator[](size_t i) const {
|
||||
ARDUINOJSON_ASSERT(_str != 0);
|
||||
ARDUINOJSON_ASSERT(i <= size());
|
||||
return _str[i];
|
||||
}
|
||||
|
||||
const char* data() const {
|
||||
return _str;
|
||||
}
|
||||
|
@ -39,6 +39,13 @@ class StringAdapter<const __FlashStringHelper*> {
|
||||
return strlen_P(reinterpret_cast<const char*>(_str));
|
||||
}
|
||||
|
||||
char operator[](size_t i) const {
|
||||
ARDUINOJSON_ASSERT(_str != 0);
|
||||
ARDUINOJSON_ASSERT(i <= size());
|
||||
return static_cast<char>(
|
||||
pgm_read_byte(reinterpret_cast<const char*>(_str) + i));
|
||||
}
|
||||
|
||||
typedef storage_policies::store_by_copy storage_policy;
|
||||
|
||||
private:
|
||||
|
@ -34,6 +34,14 @@ class StringAdapter<const __FlashStringHelper*, true> {
|
||||
memcpy_P(p, reinterpret_cast<const char*>(_str), n);
|
||||
}
|
||||
|
||||
// TODO: not covered by the tests
|
||||
char operator[](size_t i) const {
|
||||
ARDUINOJSON_ASSERT(_str != 0);
|
||||
ARDUINOJSON_ASSERT(i <= _size);
|
||||
return static_cast<char>(
|
||||
pgm_read_byte(reinterpret_cast<const char*>(_str) + i));
|
||||
}
|
||||
|
||||
size_t size() const {
|
||||
return _size;
|
||||
}
|
||||
|
@ -33,6 +33,12 @@ class StringAdapter<TChar*, true> {
|
||||
return _size;
|
||||
}
|
||||
|
||||
char operator[](size_t i) const {
|
||||
ARDUINOJSON_ASSERT(_str != 0);
|
||||
ARDUINOJSON_ASSERT(i <= _size);
|
||||
return _str[i];
|
||||
}
|
||||
|
||||
typedef storage_policies::store_by_copy storage_policy;
|
||||
|
||||
private:
|
||||
|
@ -33,6 +33,11 @@ class StringAdapter<std::basic_string<char, TCharTraits, TAllocator> > {
|
||||
return _str->compare(other);
|
||||
}
|
||||
|
||||
char operator[](size_t i) const {
|
||||
ARDUINOJSON_ASSERT(i <= size());
|
||||
return _str->operator[](i);
|
||||
}
|
||||
|
||||
size_t size() const {
|
||||
return _str->size();
|
||||
}
|
||||
|
@ -31,6 +31,11 @@ class StringAdapter<std::string_view> {
|
||||
return _str.compare(other);
|
||||
}
|
||||
|
||||
char operator[](size_t i) const {
|
||||
ARDUINOJSON_ASSERT(i <= size());
|
||||
return _str[i];
|
||||
}
|
||||
|
||||
size_t size() const {
|
||||
return _str.size();
|
||||
}
|
||||
|
Reference in New Issue
Block a user