diff --git a/src/saveload/saveload.cpp b/src/saveload/saveload.cpp index a8b2bc037a..df170a1ced 100644 --- a/src/saveload/saveload.cpp +++ b/src/saveload/saveload.cpp @@ -2050,6 +2050,54 @@ void SlAutolength(AutolengthProc *proc, void *arg) _sl.dumper->CopyBytes(result.first, result.second); } +/** + * Run proc, saving result to a std::vector + * @param proc The callback procedure that is called + * @param arg The variable that will be used for the callback procedure + */ +std::vector SlSaveToVector(AutolengthProc *proc, void *arg) +{ + assert(_sl.action == SLA_SAVE); + NeedLength orig_need_length = _sl.need_length; + + _sl.need_length = NL_NONE; + _sl.dumper->StartAutoLength(); + proc(arg); + auto result = _sl.dumper->StopAutoLength(); + /* Setup length */ + _sl.need_length = orig_need_length; + return std::vector(result.first, result.first + result.second); +} + +/** + * Run proc, loading exactly length bytes from the contents of buffer + * @param proc The callback procedure that is called + * @param arg The variable that will be used for the callback procedure + */ +void SlLoadFromBuffer(const byte *buffer, size_t length, AutolengthProc *proc, void *arg) +{ + assert(_sl.action == SLA_LOAD || _sl.action == SLA_LOAD_CHECK); + + size_t old_obj_len = _sl.obj_len; + _sl.obj_len = length; + + ReadBuffer *reader = ReadBuffer::GetCurrent(); + byte *old_bufp = reader->bufp; + byte *old_bufe = reader->bufe; + reader->bufp = const_cast(buffer); + reader->bufe = const_cast(buffer) + length; + + proc(arg); + + if (reader->bufp != reader->bufe || reader->bufe != buffer + length) { + SlErrorCorrupt("SlLoadFromBuffer: Wrong number of bytes read"); + } + + _sl.obj_len = old_obj_len; + reader->bufp = old_bufp; + reader->bufe = old_bufe; +} + /* * Notes on extended chunk header: * diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index 6c8f3aa1d3..fb8c0a637e 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -620,6 +620,8 @@ void SlSetArrayIndex(uint index); int SlIterateArray(); void SlAutolength(AutolengthProc *proc, void *arg); +std::vector SlSaveToVector(AutolengthProc *proc, void *arg); +void SlLoadFromBuffer(const byte *buffer, size_t length, AutolengthProc *proc, void *arg); size_t SlGetFieldLength(); void SlSetLength(size_t length); size_t SlCalcObjMemberLength(const void *object, const SaveLoad &sld);