diff --git a/src/object.h b/src/object.h index dfc9c3519c..b4b95ca07f 100644 --- a/src/object.h +++ b/src/object.h @@ -122,4 +122,7 @@ void object_create_identifier_name(char* string_buffer, const rct_object_entry* rct_object_entry *object_list_find_by_name(const char *name); rct_object_entry *object_list_find(rct_object_entry *entry); +void object_entry_get_name(utf8 * buffer, size_t bufferSize, const rct_object_entry * entry); +void object_entry_get_name_fixed(utf8 * buffer, size_t bufferSize, const rct_object_entry * entry); + #endif diff --git a/src/object/ObjectFactory.cpp b/src/object/ObjectFactory.cpp index 2900f9130e..83a292d2a5 100644 --- a/src/object/ObjectFactory.cpp +++ b/src/object/ObjectFactory.cpp @@ -172,8 +172,8 @@ namespace ObjectFactory Object * result = CreateObject(*entry); if (result != nullptr) { - utf8 objectName[9] = { 0 }; - Memory::Copy(objectName, entry->name, 8); + utf8 objectName[9]; + object_entry_get_name_fixed(objectName, sizeof(objectName), entry); auto readContext = ReadObjectContext(objectName); auto chunkStream = MemoryStream(data, dataSize); diff --git a/src/object/ObjectRepository.cpp b/src/object/ObjectRepository.cpp index f7417fddc9..cb29d02549 100644 --- a/src/object/ObjectRepository.cpp +++ b/src/object/ObjectRepository.cpp @@ -192,8 +192,8 @@ public: void AddObject(const rct_object_entry * objectEntry, const void * data, size_t dataSize) override { - char objectName[9] = { 0 }; - Memory::Copy(objectName, objectEntry->name, 8); + utf8 objectName[9]; + object_entry_get_name_fixed(objectName, sizeof(objectName), objectEntry); int realChecksum = object_calculate_checksum(objectEntry, (const uint8 *)data, (int)dataSize); if (realChecksum != objectEntry->checksum) diff --git a/src/object_list.c b/src/object_list.c index d43f0070fa..9bebda6519 100644 --- a/src/object_list.c +++ b/src/object_list.c @@ -26,6 +26,7 @@ #include "ride/track.h" #include "ride/track_design.h" #include "util/sawyercoding.h" +#include "util/util.h" #include "world/entrance.h" #include "world/footpath.h" #include "world/scenery.h" @@ -255,3 +256,24 @@ void * get_loaded_object_chunk(size_t index) void *entry = object_entry_groups[objectType].chunks[entryIndex]; return entry; } + +void object_entry_get_name(utf8 * buffer, size_t bufferSize, const rct_object_entry * entry) +{ + size_t nameLength = 8; + const char * end = memchr(entry->name, ' ', 8); + if (end != NULL) + { + nameLength = (size_t)(end - entry->name); + } + + bufferSize = min(nameLength + 1, bufferSize); + memcpy(buffer, entry->name, bufferSize - 1); + buffer[bufferSize - 1] = 0; +} + +void object_entry_get_name_fixed(utf8 * buffer, size_t bufferSize, const rct_object_entry * entry) +{ + bufferSize = min(9, bufferSize); + memcpy(buffer, entry->name, bufferSize - 1); + buffer[bufferSize - 1] = 0; +}