forked from bblanchon/ArduinoJson
Append terminator in saveStringFromFreeZone()
This commit is contained in:
@ -401,8 +401,6 @@ class JsonDeserializer {
|
||||
_stringStorage.append(c);
|
||||
}
|
||||
|
||||
_stringStorage.append('\0');
|
||||
|
||||
if (!_stringStorage.isValid()) {
|
||||
_error = DeserializationError::NoMemory;
|
||||
return false;
|
||||
@ -426,8 +424,6 @@ class JsonDeserializer {
|
||||
return false;
|
||||
}
|
||||
|
||||
_stringStorage.append('\0');
|
||||
|
||||
if (!_stringStorage.isValid()) {
|
||||
_error = DeserializationError::NoMemory;
|
||||
return false;
|
||||
|
@ -87,13 +87,14 @@ class MemoryPool {
|
||||
|
||||
const char* saveStringFromFreeZone(size_t len) {
|
||||
#if ARDUINOJSON_ENABLE_STRING_DEDUPLICATION
|
||||
const char* dup = findString(adaptString(_left));
|
||||
const char* dup = findString(adaptString(_left, len));
|
||||
if (dup)
|
||||
return dup;
|
||||
#endif
|
||||
|
||||
const char* str = _left;
|
||||
_left += len;
|
||||
*_left++ = 0;
|
||||
checkInvariants();
|
||||
return str;
|
||||
}
|
||||
|
@ -343,7 +343,6 @@ class MsgPackDeserializer {
|
||||
return false;
|
||||
_stringStorage.append(static_cast<char>(c));
|
||||
}
|
||||
_stringStorage.append('\0');
|
||||
if (!_stringStorage.isValid()) {
|
||||
_error = DeserializationError::NoMemory;
|
||||
return false;
|
||||
|
@ -17,10 +17,13 @@ class StringCopier {
|
||||
void startString() {
|
||||
_pool->getFreeZone(&_ptr, &_capacity);
|
||||
_size = 0;
|
||||
if (_capacity == 0)
|
||||
_pool->markAsOverflowed();
|
||||
}
|
||||
|
||||
string_type save() {
|
||||
ARDUINOJSON_ASSERT(_ptr);
|
||||
ARDUINOJSON_ASSERT(_size < _capacity); // needs room for the terminator
|
||||
return _pool->saveStringFromFreeZone(_size);
|
||||
}
|
||||
|
||||
@ -33,23 +36,24 @@ class StringCopier {
|
||||
}
|
||||
|
||||
void append(char c) {
|
||||
if (!_ptr)
|
||||
return;
|
||||
|
||||
if (_size >= _capacity) {
|
||||
_ptr = 0;
|
||||
if (_size + 1 < _capacity)
|
||||
_ptr[_size++] = c;
|
||||
else
|
||||
_pool->markAsOverflowed();
|
||||
return;
|
||||
}
|
||||
|
||||
_ptr[_size++] = c;
|
||||
}
|
||||
|
||||
bool isValid() {
|
||||
return _ptr != 0;
|
||||
bool isValid() const {
|
||||
return !_pool->overflowed();
|
||||
}
|
||||
|
||||
size_t size() const {
|
||||
return _size;
|
||||
}
|
||||
|
||||
string_type str() const {
|
||||
ARDUINOJSON_ASSERT(_ptr);
|
||||
ARDUINOJSON_ASSERT(_size < _capacity);
|
||||
_ptr[_size] = 0;
|
||||
return _ptr;
|
||||
}
|
||||
|
||||
|
@ -20,7 +20,10 @@ class StringMover {
|
||||
}
|
||||
|
||||
FORCE_INLINE string_type save() {
|
||||
return _startPtr;
|
||||
_writePtr[0] = 0; // terminator
|
||||
string_type s = str();
|
||||
_writePtr++;
|
||||
return s;
|
||||
}
|
||||
|
||||
void append(char c) {
|
||||
@ -35,6 +38,10 @@ class StringMover {
|
||||
return string_type(_startPtr);
|
||||
}
|
||||
|
||||
size_t size() const {
|
||||
return size_t(_writePtr - _startPtr);
|
||||
}
|
||||
|
||||
private:
|
||||
char* _writePtr;
|
||||
char* _startPtr;
|
||||
|
@ -204,8 +204,7 @@ class MemoryPoolPrint : public Print {
|
||||
}
|
||||
|
||||
CopiedString str() {
|
||||
_string[_size++] = 0;
|
||||
ARDUINOJSON_ASSERT(_size <= _capacity);
|
||||
ARDUINOJSON_ASSERT(_size < _capacity);
|
||||
return _pool->saveStringFromFreeZone(_size);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user