#include "processing.h" #include "utils.h" #define RT_DEFINE_UIDTAB_FILE_STRUCTURES #include "runtime/threading.h" #include "runtime/uidtab.h" #include #include #include #include #include static rt_uidtab_entry *_entries; static size_t _entry_capacity; static size_t _entry_count; rt_uid rtCalculateUID(const char *name) { assert(sizeof(XXH32_hash_t) == sizeof(rt_uid)); size_t len = strlen(name); return (rt_uid)XXH32(name, len, 0); } rt_result rtAddUIDTabEntry(rt_file_id package_fid, rt_uid uid, uint64_t offset, uint64_t size) { assert(rtIsMainThread()); if (_entry_count == _entry_capacity) { size_t new_cap = (_entry_capacity > 0) ? _entry_capacity * 2 : 256; void *t = realloc(_entries, sizeof(rt_uidtab_entry) * new_cap); if (!t) return RT_UNKNOWN_ERROR; _entry_capacity = new_cap; _entries = t; } _entries[_entry_count].file = package_fid; _entries[_entry_count].offset = offset; _entries[_entry_count].size = size; _entries[_entry_count].uid = uid; _entry_count++; return RT_SUCCESS; } rt_result rtWriteUIDTab(void) { rt_uidtab_header header; XXH64_hash_t checksum = XXH3_64bits(_entries, sizeof(rt_uidtab_entry) * _entry_count); XXH64_canonicalFromHash(&header.checksum, checksum); header.num_entries = (uint32_t)_entry_count; FILE *f = fopen("data/uidtab.bin", "wb"); if (!f) { rtReportError("ASSETC", "Failed to open 'uidtab.bin' for writing."); return RT_UNKNOWN_ERROR; } if (fwrite(&header, sizeof(header), 1, f) != 1) { rtReportError("ASSETC", "Failed to write header to 'uidtab.bin'"); fclose(f); return RT_UNKNOWN_ERROR; } if (fwrite(_entries, sizeof(rt_uidtab_entry), _entry_count, f) != _entry_count) { rtReportError("ASSETC", "Failed to write entries to 'uidtab.bin'"); fclose(f); return RT_UNKNOWN_ERROR; } fclose(f); return RT_SUCCESS; }