diff options
-rw-r--r-- | editor/json.cpp | 8 | ||||
-rw-r--r-- | serialize/world.cpp | 14 |
2 files changed, 12 insertions, 10 deletions
diff --git a/editor/json.cpp b/editor/json.cpp index 40c26952..777f9d22 100644 --- a/editor/json.cpp +++ b/editor/json.cpp @@ -39,13 +39,7 @@ void app::do_quicksave() if (Path::exists(quicksave_tmp)) Path::remove(quicksave_tmp); fputs("quicksave...", stderr); fflush(stderr); -#if 0 -#ifdef FM_SAVE_BINARY - json_helper::to_binary(world, quicksave_tmp); -#else - json_helper::to_json(world, quicksave_tmp); -#endif -#endif + world.serialize(quicksave_tmp); Path::move(quicksave_tmp, quicksave_file); fputs(" done\n", stderr); fflush(stderr); } diff --git a/serialize/world.cpp b/serialize/world.cpp index e4ccbb67..ff8eade9 100644 --- a/serialize/world.cpp +++ b/serialize/world.cpp @@ -162,6 +162,7 @@ void state::serialize_atlases() const auto& [atlas, index] = t; const auto name = atlas->name(); const auto namesiz = name.size(); + fm_assert_debug(s.bytes_written() + namesiz + 1 <= atlasbuf_size); fm_assert(namesiz <= atlas_name_max - 1); // null terminated fm_assert_debug(name.find('\0') == name.cend()); s.write_asciiz_string(name); @@ -194,8 +195,15 @@ ArrayView<const char> state::serialize_world() len += atlas_buf.size(); file_buf.resize(len); auto it = file_buf.begin(); - const auto copy = [&](const auto& in) { it = std::copy(std::cbegin(in), std::cend(in), it); }; - copy(file_magic); + const auto copy = [&](const auto& in) { +#ifndef FM_NO_DEBUG + auto len1 = std::distance(std::cbegin(in), std::cend(in)), + len2 = std::distance(it, file_buf.end()); + fm_assert(len1 <= len2); +#endif + it = std::copy(std::cbegin(in), std::cend(in), it); + }; + copy(Containers::StringView{file_magic, std::size(file_magic)-1}); copy(std::initializer_list<char>{ char(proto_version & 0xff), char((proto_version >> 8) & 0xff) }); copy(atlas_buf); for (const auto& buf : chunk_bufs) @@ -240,7 +248,7 @@ void world::serialize(StringView filename) fm_abort("fopen(\"%s\", \"w\"): %s", filename.data(), strerror(errbuf)); Serialize::state s{*this}; const auto array = s.serialize_world(); - if (auto len = ::fwrite(array.data(), array.size(), 1, file)) + if (auto len = ::fwrite(array.data(), array.size(), 1, file); len != 1) fm_abort("fwrite: %s", strerror(errbuf)); if (int ret = ::fflush(file); ret != 0) fm_abort("fflush: %s", strerror(errbuf)); |