From d24e007c8487246d0c66b877d2273a3d9e9695ac Mon Sep 17 00:00:00 2001 From: korenkonder Date: Fri, 19 Sep 2025 19:19:14 +0300 Subject: [PATCH] Formatted some code with SAL (Semantics of APIs) --- src/CRE/Glitter/file_reader.cpp | 2 +- src/CRE/Glitter/file_writer.cpp | 22 ++-- src/KKdLib/a3da.cpp | 12 ++ src/KKdLib/database/aet.cpp | 24 ++++ src/KKdLib/database/auth_3d.cpp | 12 ++ src/KKdLib/database/bone.cpp | 24 ++++ src/KKdLib/database/hand_item.cpp | 40 ++++-- src/KKdLib/database/item_table.cpp | 40 ++++-- src/KKdLib/database/motion.cpp | 6 + src/KKdLib/database/object.cpp | 24 ++++ src/KKdLib/database/sprite.cpp | 24 ++++ src/KKdLib/database/stage.cpp | 24 ++++ src/KKdLib/database/texture.cpp | 24 ++++ src/KKdLib/dds.cpp | 6 + src/KKdLib/default.cpp | 8 +- src/KKdLib/default.hpp | 71 ++++++++-- src/KKdLib/divafile.cpp | 6 + src/KKdLib/farc.cpp | 15 ++- src/KKdLib/hash.hpp | 18 +++ src/KKdLib/io/file_stream.cpp | 14 +- src/KKdLib/io/file_stream.hpp | 4 +- src/KKdLib/io/path.cpp | 165 ++++++++++++++++++------ src/KKdLib/io/path.hpp | 60 ++++----- src/KKdLib/io/stream.cpp | 16 +-- src/KKdLib/io/stream.hpp | 16 +-- src/KKdLib/light_param/face.cpp | 12 ++ src/KKdLib/light_param/fog.cpp | 12 ++ src/KKdLib/light_param/glow.cpp | 12 ++ src/KKdLib/light_param/ibl.cpp | 6 + src/KKdLib/light_param/light.cpp | 12 ++ src/KKdLib/light_param/wind.cpp | 12 ++ src/KKdLib/msgpack.cpp | 53 ++++---- src/KKdLib/msgpack.hpp | 69 +++++----- src/KKdLib/obj.cpp | 80 +++++++----- src/KKdLib/post_process_table/dof.cpp | 32 +++-- src/KKdLib/pvpp.cpp | 6 + src/KKdLib/pvsr.cpp | 6 + src/KKdLib/sound/diva.cpp | 12 ++ src/KKdLib/sound/vag.cpp | 12 ++ src/KKdLib/stage_param/fog_ring.cpp | 12 ++ src/KKdLib/stage_param/leaf.cpp | 12 ++ src/KKdLib/stage_param/litproj.cpp | 12 ++ src/KKdLib/stage_param/rain.cpp | 12 ++ src/KKdLib/stage_param/ripple.cpp | 12 ++ src/KKdLib/stage_param/snow.cpp | 12 ++ src/KKdLib/stage_param/splash.cpp | 12 ++ src/KKdLib/stage_param/star.cpp | 12 ++ src/KKdLib/str_utils.cpp | 123 ++++++++++++------ src/KKdLib/str_utils.hpp | 120 +++++++++++------ src/ReDIVA/data_edit/glitter_editor.cpp | 9 +- src/ReDIVA/data_test/glitter_test.cpp | 8 +- src/ReDIVA/imgui_helper.cpp | 8 +- src/ReDIVA/print_work.cpp | 21 ++- src/ReDIVA/x_pv_game.cpp | 5 +- 54 files changed, 1041 insertions(+), 362 deletions(-) diff --git a/src/CRE/Glitter/file_reader.cpp b/src/CRE/Glitter/file_reader.cpp index 8763ce38..3b204c07 100644 --- a/src/CRE/Glitter/file_reader.cpp +++ b/src/CRE/Glitter/file_reader.cpp @@ -41,7 +41,7 @@ namespace Glitter { char* file_temp = utf16_to_utf8(file); this->path = path_temp ? path_temp : (GLT_VAL != Glitter::FT ? "root+/particle/" : "rom/particle/"); - this->file = file_temp; + this->file = file_temp ? file_temp : ""; this->emission = emission; this->type = GLT_VAL; this->hash = GLT_VAL != Glitter::FT diff --git a/src/CRE/Glitter/file_writer.cpp b/src/CRE/Glitter/file_writer.cpp index e0680f75..d0f70d5e 100644 --- a/src/CRE/Glitter/file_writer.cpp +++ b/src/CRE/Glitter/file_writer.cpp @@ -2214,18 +2214,20 @@ namespace Glitter { } char* temp = str_utils_add(path, file); - if (glt_type != Glitter::FT && save_lst) { + if (glt_type != Glitter::FT && save_lst && temp) { char* list_temp = str_utils_add(temp, ".glitter.txt"); - file_stream s; - s.open(list_temp, "wb"); - if (s.check_not_null()) { - for (Glitter::Effect*& i : eff_group->effects) - if (i) { - s.write_string(i->name); - s.write_char('\n'); - } + if (list_temp) { + file_stream s; + s.open(list_temp, "wb"); + if (s.check_not_null()) { + for (Glitter::Effect*& i : eff_group->effects) + if (i) { + s.write_string(i->name); + s.write_char('\n'); + } + } + free_def(list_temp); } - free_def(list_temp); } f.write(temp, signature, flags, true, false); free_def(temp); diff --git a/src/KKdLib/a3da.cpp b/src/KKdLib/a3da.cpp index 0cc29744..e9016d72 100644 --- a/src/KKdLib/a3da.cpp +++ b/src/KKdLib/a3da.cpp @@ -327,6 +327,9 @@ void a3da::read(const char* path) { return; char* path_a3da = str_utils_add(path, (char*)".a3da"); + if (!path_a3da) + return; + if (path_check_file_exists(path_a3da)) { file_stream s; s.open(path_a3da, "rb"); @@ -341,6 +344,9 @@ void a3da::read(const wchar_t* path) { return; wchar_t* path_a3da = str_utils_add(path, (wchar_t*)L".a3da"); + if (!path_a3da) + return; + if (path_check_file_exists(path_a3da)) { file_stream s; s.open(path_a3da, L"rb"); @@ -364,6 +370,9 @@ void a3da::write(const char* path) { return; char* path_a3da = str_utils_add(path, ".a3da"); + if (!path_a3da) + return; + file_stream s; s.open(path_a3da, "wb"); if (s.check_not_null()) @@ -376,6 +385,9 @@ void a3da::write(const wchar_t* path) { return; wchar_t* path_a3da = str_utils_add(path, L".a3da"); + if (!path_a3da) + return; + file_stream s; s.open(path_a3da, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/database/aet.cpp b/src/KKdLib/database/aet.cpp index 9ab62ec4..a5303296 100644 --- a/src/KKdLib/database/aet.cpp +++ b/src/KKdLib/database/aet.cpp @@ -74,6 +74,9 @@ void aet_database_file::read(const char* path, bool modern) { if (!modern) { char* path_bin = str_utils_add(path, ".bin"); + if (!path_bin) + return; + if (path_check_file_exists(path_bin)) { file_stream s; s.open(path_bin, "rb"); @@ -90,6 +93,9 @@ void aet_database_file::read(const char* path, bool modern) { } else { char* path_aei = str_utils_add(path, ".aei"); + if (!path_aei) + return; + if (path_check_file_exists(path_aei)) { f2_struct st; st.read(path_aei); @@ -110,6 +116,9 @@ void aet_database_file::read(const wchar_t* path, bool modern) { if (!modern) { wchar_t* path_bin = str_utils_add(path, L".bin"); + if (!path_bin) + return; + if (path_check_file_exists(path_bin)) { file_stream s; s.open(path_bin, L"rb"); @@ -126,6 +135,9 @@ void aet_database_file::read(const wchar_t* path, bool modern) { } else { wchar_t* path_aei = str_utils_add(path, L".aei"); + if (!path_aei) + return; + if (path_check_file_exists(path_aei)) { f2_struct st; st.read(path_aei); @@ -167,6 +179,9 @@ void aet_database_file::write(const char* path) { if (!modern) { char* path_bin = str_utils_add(path, ".bin"); + if (!path_bin) + return; + file_stream s; s.open(path_bin, "wb"); if (s.check_not_null()) @@ -175,6 +190,9 @@ void aet_database_file::write(const char* path) { } else { char* path_aei = str_utils_add(path, ".aei"); + if (!path_aei) + return; + file_stream s; s.open(path_aei, "wb"); if (s.check_not_null()) @@ -189,6 +207,9 @@ void aet_database_file::write(const wchar_t* path) { if (!modern) { wchar_t* path_bin = str_utils_add(path, L".bin"); + if (!path_bin) + return; + file_stream s; s.open(path_bin, L"wb"); if (s.check_not_null()) @@ -197,6 +218,9 @@ void aet_database_file::write(const wchar_t* path) { } else { wchar_t* path_aei = str_utils_add(path, L".aei"); + if (!path_aei) + return; + file_stream s; s.open(path_aei, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/database/auth_3d.cpp b/src/KKdLib/database/auth_3d.cpp index 0517bd4d..34286aa1 100644 --- a/src/KKdLib/database/auth_3d.cpp +++ b/src/KKdLib/database/auth_3d.cpp @@ -61,6 +61,9 @@ void auth_3d_database_file::read(const char* path) { return; char* path_bin = str_utils_add(path, ".bin"); + if (!path_bin) + return; + if (path_check_file_exists(path_bin)) { file_stream s; s.open(path_bin, "rb"); @@ -75,6 +78,9 @@ void auth_3d_database_file::read(const wchar_t* path) { return; wchar_t* path_bin = str_utils_add(path, L".bin"); + if (!path_bin) + return; + if (path_check_file_exists(path_bin)) { file_stream s; s.open(path_bin, L"rb"); @@ -98,6 +104,9 @@ void auth_3d_database_file::write(const char* path) { return; char* path_bin = str_utils_add(path, ".bin"); + if (!path_bin) + return; + file_stream s; s.open(path_bin, "wb"); if (s.check_not_null()) @@ -110,6 +119,9 @@ void auth_3d_database_file::write(const wchar_t* path) { return; wchar_t* path_bin = str_utils_add(path, L".bin"); + if (!path_bin) + return; + file_stream s; s.open(path_bin, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/database/bone.cpp b/src/KKdLib/database/bone.cpp index 64c12934..1f4acd6a 100644 --- a/src/KKdLib/database/bone.cpp +++ b/src/KKdLib/database/bone.cpp @@ -60,6 +60,9 @@ void bone_database::read(const char* path, bool modern) { if (!modern) { char* path_bin = str_utils_add(path, ".bin"); + if (!path_bin) + return; + if (path_check_file_exists(path_bin)) { file_stream s; s.open(path_bin, "rb"); @@ -76,6 +79,9 @@ void bone_database::read(const char* path, bool modern) { } else { char* path_bon = str_utils_add(path, ".bon"); + if (!path_bon) + return; + if (path_check_file_exists(path_bon)) { f2_struct st; st.read(path_bon); @@ -96,6 +102,9 @@ void bone_database::read(const wchar_t* path, bool modern) { if (!modern) { wchar_t* path_bin = str_utils_add(path, L".bin"); + if (!path_bin) + return; + if (path_check_file_exists(path_bin)) { file_stream s; s.open(path_bin, L"rb"); @@ -112,6 +121,9 @@ void bone_database::read(const wchar_t* path, bool modern) { } else { wchar_t* path_bon = str_utils_add(path, L".bon"); + if (!path_bon) + return; + if (path_check_file_exists(path_bon)) { f2_struct st; st.read(path_bon); @@ -153,6 +165,9 @@ void bone_database::write(const char* path) { if (!modern) { char* path_bin = str_utils_add(path, ".bin"); + if (!path_bin) + return; + file_stream s; s.open(path_bin, "wb"); if (s.check_not_null()) @@ -161,6 +176,9 @@ void bone_database::write(const char* path) { } else { char* path_bon = str_utils_add(path, ".bon"); + if (!path_bon) + return; + file_stream s; s.open(path_bon, "wb"); if (s.check_not_null()) @@ -175,6 +193,9 @@ void bone_database::write(const wchar_t* path) { if (!modern) { wchar_t* path_bin = str_utils_add(path, L".bin"); + if (!path_bin) + return; + file_stream s; s.open(path_bin, L"wb"); if (s.check_not_null()) @@ -183,6 +204,9 @@ void bone_database::write(const wchar_t* path) { } else { wchar_t* path_bon = str_utils_add(path, L".bon"); + if (!path_bon) + return; + file_stream s; s.open(path_bon, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/database/hand_item.cpp b/src/KKdLib/database/hand_item.cpp index dcdcd537..8d5da5ee 100644 --- a/src/KKdLib/database/hand_item.cpp +++ b/src/KKdLib/database/hand_item.cpp @@ -36,28 +36,34 @@ void hnd_itm::read(const char* path) { if (!path) return; - char* path_bin = str_utils_add(path, ".txt"); - if (path_check_file_exists(path_bin)) { + char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + + if (path_check_file_exists(path_txt)) { file_stream s; - s.open(path_bin, "rb"); + s.open(path_txt, "rb"); if (s.check_not_null()) hnd_itm_read_inner(this, s); } - free_def(path_bin); + free_def(path_txt); } void hnd_itm::read(const wchar_t* path) { if (!path) return; - wchar_t* path_bin = str_utils_add(path, L".txt"); - if (path_check_file_exists(path_bin)) { + wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + + if (path_check_file_exists(path_txt)) { file_stream s; - s.open(path_bin, L"rb"); + s.open(path_txt, L"rb"); if (s.check_not_null()) hnd_itm_read_inner(this, s); } - free_def(path_bin); + free_def(path_txt); } void hnd_itm::read(const void* data, size_t size) { @@ -73,24 +79,30 @@ void hnd_itm::write(const char* path) { if (!path || !ready) return; - char* path_bin = str_utils_add(path, ".txt"); + char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + file_stream s; - s.open(path_bin, "wb"); + s.open(path_txt, "wb"); if (s.check_not_null()) hnd_itm_write_inner(this, s); - free_def(path_bin); + free_def(path_txt); } void hnd_itm::write(const wchar_t* path) { if (!path || !ready) return; - wchar_t* path_bin = str_utils_add(path, L".txt"); + wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + file_stream s; - s.open(path_bin, L"wb"); + s.open(path_txt, L"wb"); if (s.check_not_null()) hnd_itm_write_inner(this, s); - free_def(path_bin); + free_def(path_txt); } void hnd_itm::write(void** data, size_t* size) { diff --git a/src/KKdLib/database/item_table.cpp b/src/KKdLib/database/item_table.cpp index 56bdd314..d6a5f8ca 100644 --- a/src/KKdLib/database/item_table.cpp +++ b/src/KKdLib/database/item_table.cpp @@ -207,28 +207,34 @@ void itm_table::read(const char* path) { if (!path) return; - char* path_bin = str_utils_add(path, ".txt"); - if (path_check_file_exists(path_bin)) { + char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + + if (path_check_file_exists(path_txt)) { file_stream s; - s.open(path_bin, "rb"); + s.open(path_txt, "rb"); if (s.check_not_null()) itm_table_read_inner(this, s); } - free_def(path_bin); + free_def(path_txt); } void itm_table::read(const wchar_t* path) { if (!path) return; - wchar_t* path_bin = str_utils_add(path, L".txt"); - if (path_check_file_exists(path_bin)) { + wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + + if (path_check_file_exists(path_txt)) { file_stream s; - s.open(path_bin, L"rb"); + s.open(path_txt, L"rb"); if (s.check_not_null()) itm_table_read_inner(this, s); } - free_def(path_bin); + free_def(path_txt); } void itm_table::read(const void* data, size_t size) { @@ -244,24 +250,30 @@ void itm_table::write(const char* path) { if (!path || !ready) return; - char* path_bin = str_utils_add(path, ".txt"); + char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + file_stream s; - s.open(path_bin, "wb"); + s.open(path_txt, "wb"); if (s.check_not_null()) itm_table_write_inner(this, s); - free_def(path_bin); + free_def(path_txt); } void itm_table::write(const wchar_t* path) { if (!path || !ready) return; - wchar_t* path_bin = str_utils_add(path, L".txt"); + wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + file_stream s; - s.open(path_bin, L"wb"); + s.open(path_txt, L"wb"); if (s.check_not_null()) itm_table_write_inner(this, s); - free_def(path_bin); + free_def(path_txt); } void itm_table::write(void** data, size_t* size) { diff --git a/src/KKdLib/database/motion.cpp b/src/KKdLib/database/motion.cpp index fd78fe37..e2a64c38 100644 --- a/src/KKdLib/database/motion.cpp +++ b/src/KKdLib/database/motion.cpp @@ -62,6 +62,9 @@ void motion_database_file::read(const char* path) { return; char* path_farc = str_utils_add(path, ".farc"); + if (!path_farc) + return; + if (path_check_file_exists(path_farc)) { farc f; f.read(path_farc, true, false); @@ -81,6 +84,9 @@ void motion_database_file::read(const wchar_t* path) { return; wchar_t* path_farc = str_utils_add(path, L".farc"); + if (!path_farc) + return; + if (path_check_file_exists(path_farc)) { farc f; f.read(path_farc, true, false); diff --git a/src/KKdLib/database/object.cpp b/src/KKdLib/database/object.cpp index d3892f6e..5603cecd 100644 --- a/src/KKdLib/database/object.cpp +++ b/src/KKdLib/database/object.cpp @@ -67,6 +67,9 @@ void object_database_file::read(const char* path, bool modern) { if (!modern) { char* path_bin = str_utils_add(path, ".bin"); + if (!path_bin) + return; + if (path_check_file_exists(path_bin)) { file_stream s; s.open(path_bin, "rb"); @@ -83,6 +86,9 @@ void object_database_file::read(const char* path, bool modern) { } else { char* path_osi = str_utils_add(path, ".osi"); + if (!path_osi) + return; + if (path_check_file_exists(path_osi)) { f2_struct st; st.read(path_osi); @@ -103,6 +109,9 @@ void object_database_file::read(const wchar_t* path, bool modern) { if (!modern) { wchar_t* path_bin = str_utils_add(path, L".bin"); + if (!path_bin) + return; + if (path_check_file_exists(path_bin)) { file_stream s; s.open(path_bin, L"rb"); @@ -119,6 +128,9 @@ void object_database_file::read(const wchar_t* path, bool modern) { } else { wchar_t* path_osi = str_utils_add(path, L".osi"); + if (!path_osi) + return; + if (path_check_file_exists(path_osi)) { f2_struct st; st.read(path_osi); @@ -160,6 +172,9 @@ void object_database_file::write(const char* path) { if (!modern) { char* path_bin = str_utils_add(path, ".bin"); + if (!path_bin) + return; + file_stream s; s.open(path_bin, "wb"); if (s.check_not_null()) @@ -168,6 +183,9 @@ void object_database_file::write(const char* path) { } else { char* path_osi = str_utils_add(path, ".osi"); + if (!path_osi) + return; + file_stream s; s.open(path_osi, "wb"); if (s.check_not_null()) @@ -182,6 +200,9 @@ void object_database_file::write(const wchar_t* path) { if (!modern) { wchar_t* path_bin = str_utils_add(path, L".bin"); + if (!path_bin) + return; + file_stream s; s.open(path_bin, L"wb"); if (s.check_not_null()) @@ -190,6 +211,9 @@ void object_database_file::write(const wchar_t* path) { } else { wchar_t* path_osi = str_utils_add(path, L".osi"); + if (!path_osi) + return; + file_stream s; s.open(path_osi, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/database/sprite.cpp b/src/KKdLib/database/sprite.cpp index 87408318..4417f598 100644 --- a/src/KKdLib/database/sprite.cpp +++ b/src/KKdLib/database/sprite.cpp @@ -71,6 +71,9 @@ void sprite_database_file::read(const char* path, bool modern) { if (!modern) { char* path_bin = str_utils_add(path, ".bin"); + if (!path_bin) + return; + if (path_check_file_exists(path_bin)) { file_stream s; s.open(path_bin, "rb"); @@ -87,6 +90,9 @@ void sprite_database_file::read(const char* path, bool modern) { } else { char* path_spi = str_utils_add(path, ".spi"); + if (!path_spi) + return; + if (path_check_file_exists(path_spi)) { f2_struct st; st.read(path_spi); @@ -107,6 +113,9 @@ void sprite_database_file::read(const wchar_t* path, bool modern) { if (!modern) { wchar_t* path_bin = str_utils_add(path, L".bin"); + if (!path_bin) + return; + if (path_check_file_exists(path_bin)) { file_stream s; s.open(path_bin, L"rb"); @@ -123,6 +132,9 @@ void sprite_database_file::read(const wchar_t* path, bool modern) { } else { wchar_t* path_spi = str_utils_add(path, L".spi"); + if (!path_spi) + return; + if (path_check_file_exists(path_spi)) { f2_struct st; st.read(path_spi); @@ -164,6 +176,9 @@ void sprite_database_file::write(const char* path) { if (!modern) { char* path_bin = str_utils_add(path, ".bin"); + if (!path_bin) + return; + file_stream s; s.open(path_bin, "wb"); if (s.check_not_null()) @@ -172,6 +187,9 @@ void sprite_database_file::write(const char* path) { } else { char* path_spi = str_utils_add(path, ".spi"); + if (!path_spi) + return; + file_stream s; s.open(path_spi, "wb"); if (s.check_not_null()) @@ -186,6 +204,9 @@ void sprite_database_file::write(const wchar_t* path) { if (!modern) { wchar_t* path_bin = str_utils_add(path, L".bin"); + if (!path_bin) + return; + file_stream s; s.open(path_bin, L"wb"); if (s.check_not_null()) @@ -194,6 +215,9 @@ void sprite_database_file::write(const wchar_t* path) { } else { wchar_t* path_spi = str_utils_add(path, L".spi"); + if (!path_spi) + return; + file_stream s; s.open(path_spi, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/database/stage.cpp b/src/KKdLib/database/stage.cpp index 2bf9e0ad..138a11fc 100644 --- a/src/KKdLib/database/stage.cpp +++ b/src/KKdLib/database/stage.cpp @@ -96,6 +96,9 @@ void stage_database_file::read(const char* path, bool modern) { if (!modern) { char* path_bin = str_utils_add(path, ".bin"); + if (!path_bin) + return; + if (path_check_file_exists(path_bin)) { file_stream s; s.open(path_bin, "rb"); @@ -112,6 +115,9 @@ void stage_database_file::read(const char* path, bool modern) { } else { char* path_stg = str_utils_add(path, ".stg"); + if (!path_stg) + return; + if (path_check_file_exists(path_stg)) { f2_struct st; st.read(path_stg); @@ -132,6 +138,9 @@ void stage_database_file::read(const wchar_t* path, bool modern) { if (!modern) { wchar_t* path_bin = str_utils_add(path, L".bin"); + if (!path_bin) + return; + if (path_check_file_exists(path_bin)) { file_stream s; s.open(path_bin, L"rb"); @@ -148,6 +157,9 @@ void stage_database_file::read(const wchar_t* path, bool modern) { } else { wchar_t* path_stg = str_utils_add(path, L".stg"); + if (!path_stg) + return; + if (path_check_file_exists(path_stg)) { f2_struct st; st.read(path_stg); @@ -189,6 +201,9 @@ void stage_database_file::write(const char* path) { if (!modern) { char* path_bin = str_utils_add(path, ".bin"); + if (!path_bin) + return; + file_stream s; s.open(path_bin, "wb"); if (s.check_not_null()) @@ -197,6 +212,9 @@ void stage_database_file::write(const char* path) { } else { char* path_stg = str_utils_add(path, ".stg"); + if (!path_stg) + return; + file_stream s; s.open(path_stg, "wb"); if (s.check_not_null()) @@ -211,6 +229,9 @@ void stage_database_file::write(const wchar_t* path) { if (!modern) { wchar_t* path_bin = str_utils_add(path, L".bin"); + if (!path_bin) + return; + file_stream s; s.open(path_bin, L"wb"); if (s.check_not_null()) @@ -219,6 +240,9 @@ void stage_database_file::write(const wchar_t* path) { } else { wchar_t* path_stg = str_utils_add(path, L".stg"); + if (!path_stg) + return; + file_stream s; s.open(path_stg, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/database/texture.cpp b/src/KKdLib/database/texture.cpp index 636c70ce..d4738602 100644 --- a/src/KKdLib/database/texture.cpp +++ b/src/KKdLib/database/texture.cpp @@ -51,6 +51,9 @@ void texture_database_file::read(const char* path, bool modern) { if (!modern) { char* path_bin = str_utils_add(path, ".bin"); + if (!path_bin) + return; + if (path_check_file_exists(path_bin)) { file_stream s; s.open(path_bin, "rb"); @@ -67,6 +70,9 @@ void texture_database_file::read(const char* path, bool modern) { } else { char* path_txi = str_utils_add(path, ".txi"); + if (!path_txi) + return; + if (path_check_file_exists(path_txi)) { f2_struct st; st.read(path_txi); @@ -87,6 +93,9 @@ void texture_database_file::read(const wchar_t* path, bool modern) { if (!modern) { wchar_t* path_bin = str_utils_add(path, L".bin"); + if (!path_bin) + return; + if (path_check_file_exists(path_bin)) { file_stream s; s.open(path_bin, L"rb"); @@ -103,6 +112,9 @@ void texture_database_file::read(const wchar_t* path, bool modern) { } else { wchar_t* path_txi = str_utils_add(path, L".txi"); + if (!path_txi) + return; + if (path_check_file_exists(path_txi)) { f2_struct st; st.read(path_txi); @@ -144,6 +156,9 @@ void texture_database_file::write(const char* path) { if (!modern) { char* path_bin = str_utils_add(path, ".bin"); + if (!path_bin) + return; + file_stream s; s.open(path_bin, "wb"); if (s.check_not_null()) @@ -152,6 +167,9 @@ void texture_database_file::write(const char* path) { } else { char* path_txi = str_utils_add(path, ".txi"); + if (!path_txi) + return; + file_stream s; s.open(path_txi, "wb"); if (s.check_not_null()) @@ -166,6 +184,9 @@ void texture_database_file::write(const wchar_t* path) { if (!modern) { wchar_t* path_bin = str_utils_add(path, L".bin"); + if (!path_bin) + return; + file_stream s; s.open(path_bin, L"wb"); if (s.check_not_null()) @@ -174,6 +195,9 @@ void texture_database_file::write(const wchar_t* path) { } else { wchar_t* path_txi = str_utils_add(path, L".txi"); + if (!path_txi) + return; + file_stream s; s.open(path_txi, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/dds.cpp b/src/KKdLib/dds.cpp index 22888ed9..86670736 100644 --- a/src/KKdLib/dds.cpp +++ b/src/KKdLib/dds.cpp @@ -181,6 +181,9 @@ void dds::read(const wchar_t* path) { data.shrink_to_fit(); wchar_t* path_dds = str_utils_add(path, L".dds"); + if (!path_dds) + return; + file_stream s; s.open(path_dds, L"rb"); if (s.check_not_null()) { @@ -358,6 +361,9 @@ void dds::write(const wchar_t* path) { } wchar_t* path_dds = str_utils_add(path, L".dds"); + if (!path_dds) + return; + file_stream s; s.open(path_dds, L"wb"); if (s.check_not_null()) { diff --git a/src/KKdLib/default.cpp b/src/KKdLib/default.cpp index ca31da9f..272e57aa 100644 --- a/src/KKdLib/default.cpp +++ b/src/KKdLib/default.cpp @@ -54,7 +54,7 @@ void* force_malloc(size_t size) { return buf; } -wchar_t* utf8_to_utf16(const char* s) { +_Check_return_ _Ret_maybenull_z_ wchar_t* utf8_to_utf16(_In_z_ const char* s) { if (!s) return 0; @@ -109,7 +109,7 @@ wchar_t* utf8_to_utf16(const char* s) { return str; } -wchar_t* utf8_to_utf16(const char* s, size_t length) { +_Check_return_ _Ret_maybenull_z_ wchar_t* utf8_to_utf16(_In_z_ const char* s, _In_ size_t length) { if (!s || !length) return 0; @@ -165,7 +165,7 @@ wchar_t* utf8_to_utf16(const char* s, size_t length) { return str; } -char* utf16_to_utf8(const wchar_t* s) { +_Check_return_ _Ret_maybenull_z_ char* utf16_to_utf8(_In_z_ const wchar_t* s) { if (!s) return 0; @@ -217,7 +217,7 @@ char* utf16_to_utf8(const wchar_t* s) { return str; } -char* utf16_to_utf8(const wchar_t* s, size_t length) { +_Check_return_ _Ret_maybenull_z_ char* utf16_to_utf8(_In_z_ const wchar_t* s, _In_ size_t length) { if (!s || !length) return 0; diff --git a/src/KKdLib/default.hpp b/src/KKdLib/default.hpp index c4e462fd..20ebf05a 100644 --- a/src/KKdLib/default.hpp +++ b/src/KKdLib/default.hpp @@ -21,6 +21,51 @@ #pragma warning(push) #pragma warning(disable: 26812) +template +inline _Check_return_ _Ret_maybenull_ _Post_writable_byte_size_(sizeof(T)) T* malloc_T() { + return (T*)malloc(sizeof(T)); +} + +template +inline _Check_return_ _Ret_maybenull_ _Post_writable_byte_size_(sizeof(T) * count) T* malloc_T(_In_ size_t count) { + return (T*)malloc(sizeof(T) * count); +} + +template +inline T* memset_T(_Out_writes_bytes_all_(sizeof(T)) T* dest, _In_ int32_t ch) { + return (T*)memset(dest, ch, sizeof(T)); +} + +template +inline T* memset_T(_Out_writes_bytes_all_(sizeof(T) * count) T* dest, _In_ int32_t ch, _In_ size_t count) { + return (T*)memset(dest, ch, sizeof(T) * count); +} + +inline _Check_return_ _Ret_maybenull_ void* malloc_memset(_In_ size_t size, _In_ int32_t ch = 0) { + void* ptr = malloc(size); + if (ptr) + return memset(ptr, ch, size); + return ptr; +} + +template +inline _Check_return_ _Ret_maybenull_ T* malloc_memset_T() { + T* ptr = (T*)malloc(sizeof(T)); + if (ptr) + return (T*)memset(ptr, 0, sizeof(T)); + return ptr; +} + +template +inline _Check_return_ _Ret_maybenull_ T* malloc_memset_T(_In_ size_t count) { + T* ptr = (T*)malloc(sizeof(T) * count); + if (ptr) + free(ptr); + ptr = 0; + return (T*)memset(ptr, 0, sizeof(T) * count); + return ptr; +} + template inline void free_def(T& ptr) { if (ptr) @@ -328,7 +373,7 @@ inline double_t reverse_endianness_double_t(double_t value) { return *(double_t*)&v; } -inline void printf_debug(const char* fmt, ...) { +inline void printf_debug(_In_z_ _Printf_format_string_ const char* fmt, ...) { #ifdef DEBUG va_list args; va_start(args, fmt); @@ -337,7 +382,7 @@ inline void printf_debug(const char* fmt, ...) { #endif } -inline void wprintf_debug(const wchar_t* fmt, ...) { +inline void wprintf_debug(_In_z_ _Printf_format_string_ const wchar_t* fmt, ...) { #ifdef DEBUG va_list args; va_start(args, fmt); @@ -346,7 +391,7 @@ inline void wprintf_debug(const wchar_t* fmt, ...) { #endif } -inline constexpr size_t utf8_length(const char* s) { +inline _Check_return_ constexpr size_t utf8_length(_In_z_ const char* s) { if (!s) return 0; @@ -356,7 +401,7 @@ inline constexpr size_t utf8_length(const char* s) { return len; } -inline constexpr size_t utf16_length(const wchar_t* s) { +inline _Check_return_ constexpr size_t utf16_length(_In_z_ const wchar_t* s) { if (!s) return 0; @@ -366,7 +411,7 @@ inline constexpr size_t utf16_length(const wchar_t* s) { return len; } -inline constexpr bool utf8_check_for_ascii_only(const char* s) { +inline _Check_return_ constexpr bool utf8_check_for_ascii_only(_In_z_ const char* s) { char c = 0; while (c = *s++) if (c & 0x80) @@ -374,7 +419,7 @@ inline constexpr bool utf8_check_for_ascii_only(const char* s) { return true; } -inline constexpr size_t utf8_to_utf16_length(const char* s) { +inline _Check_return_ constexpr size_t utf8_to_utf16_length(_In_z_ const char* s) { if (!s) return 0; @@ -422,7 +467,7 @@ inline constexpr size_t utf8_to_utf16_length(const char* s) { return length; } -inline constexpr size_t utf8_to_utf16_length(const char* s, size_t length) { +inline _Check_return_ constexpr size_t utf8_to_utf16_length(_In_z_ const char* s, _In_ size_t length) { if (!s || !length) return 0; @@ -471,7 +516,7 @@ inline constexpr size_t utf8_to_utf16_length(const char* s, size_t length) { return _length; } -inline constexpr size_t utf16_to_utf8_length(const wchar_t* s) { +inline _Check_return_ constexpr size_t utf16_to_utf8_length(_In_z_ const wchar_t* s) { if (!s) return 0; @@ -507,7 +552,7 @@ inline constexpr size_t utf16_to_utf8_length(const wchar_t* s) { return length; } -inline constexpr size_t utf16_to_utf8_length(const wchar_t* s, size_t length) { +inline _Check_return_ constexpr size_t utf16_to_utf8_length(_In_z_ const wchar_t* s, _In_ size_t length) { if (!s || !length) return 0; @@ -544,10 +589,10 @@ inline constexpr size_t utf16_to_utf8_length(const wchar_t* s, size_t length) { return _length; } -extern wchar_t* utf8_to_utf16(const char* s); -extern wchar_t* utf8_to_utf16(const char* s, size_t length); -extern char* utf16_to_utf8(const wchar_t* s); -extern char* utf16_to_utf8(const wchar_t* s, size_t length); +extern _Check_return_ _Ret_maybenull_z_ wchar_t* utf8_to_utf16(_In_z_ const char* s); +extern _Check_return_ _Ret_maybenull_z_ wchar_t* utf8_to_utf16(_In_z_ const char* s, _In_ size_t length); +extern _Check_return_ _Ret_maybenull_z_ char* utf16_to_utf8(_In_z_ const wchar_t* s); +extern _Check_return_ _Ret_maybenull_z_ char* utf16_to_utf8(_In_z_ const wchar_t* s, _In_ size_t length); extern std::wstring utf8_to_utf16(const std::string& s); extern std::string utf16_to_utf8(const std::wstring& s); diff --git a/src/KKdLib/divafile.cpp b/src/KKdLib/divafile.cpp index b0217a0f..71dcf24e 100644 --- a/src/KKdLib/divafile.cpp +++ b/src/KKdLib/divafile.cpp @@ -22,6 +22,9 @@ namespace divafile { void decrypt(const wchar_t* path) { wchar_t* file_temp = str_utils_add(path, L"_dec"); + if (!file_temp) + return; + file_stream s_enc; s_enc.open(path, L"rb"); if (s_enc.check_not_null()) { @@ -106,6 +109,9 @@ namespace divafile { void encrypt(const wchar_t* path) { wchar_t* file_temp = str_utils_add(path, L"_enc"); + if (!file_temp) + return; + file_stream s_dec; s_dec.open(path, L"rb"); if (s_dec.check_not_null()) { diff --git a/src/KKdLib/farc.cpp b/src/KKdLib/farc.cpp index 852eb3fb..bcda74fb 100644 --- a/src/KKdLib/farc.cpp +++ b/src/KKdLib/farc.cpp @@ -118,7 +118,8 @@ farc_file* farc::add_file(const wchar_t* name) { files.push_back({}); if (name) { char* name_temp = utf16_to_utf8(name); - files.back().name.assign(name_temp); + if (name_temp) + files.back().name.assign(name_temp); free_def(name_temp); } @@ -254,6 +255,9 @@ void farc::read(const wchar_t* path, bool unpack, bool save) { return; char* dir_temp = utf16_to_utf8(full_path_buf); + if (!dir_temp) + return; + size_t dir_temp_len = utf8_length(dir_temp); file_path.assign(dir_temp, dir_temp_len); directory_path.assign(dir_temp, dir_temp_len); @@ -356,6 +360,9 @@ void farc::write(const wchar_t* path, farc_signature signature, return; char* dir_temp = utf16_to_utf8(full_path_buf); + if (!dir_temp) + return; + size_t dir_temp_len = utf8_length(dir_temp); directory_path.assign(dir_temp, dir_temp_len); file_path.assign(dir_temp, dir_temp_len); @@ -394,7 +401,8 @@ bool farc::load_file(void* data, const char* dir, const char* file, uint32_t has char buf[0x1000]; memcpy(buf, dir, dir_len); - memcpy(buf + dir_len, file, file_len + 1); + memcpy(buf + dir_len, file, file_len); + buf[dir_len + file_len] = 0; if (!path_check_file_exists(buf)) return false; @@ -946,7 +954,8 @@ static void farc_unpack_files(farc* f, stream& s, bool save) { if (save) { wchar_t* dir_temp = utf8_to_utf16(f->directory_path.c_str()); - path_create_directory(dir_temp); + if (dir_temp) + path_create_directory(dir_temp); free_def(dir_temp); } diff --git a/src/KKdLib/hash.hpp b/src/KKdLib/hash.hpp index a921d62c..b4ea69b9 100644 --- a/src/KKdLib/hash.hpp +++ b/src/KKdLib/hash.hpp @@ -34,6 +34,8 @@ inline uint64_t hash_utf8_fnv1a64m(const char* data, bool make_upper = false) { inline uint64_t hash_utf16_fnv1a64m(const wchar_t* data, bool make_upper = false) { char* temp = utf16_to_utf8(data); + if (!temp) + return hash_fnv1a64m(0, 0, make_upper); uint64_t hash = hash_fnv1a64m(temp, utf8_length(temp), make_upper); free_def(temp); return hash; @@ -49,6 +51,8 @@ inline uint32_t hash_utf8_murmurhash(const char* data, uint32_t seed = 0, bool u inline uint32_t hash_utf16_murmurhash(const wchar_t* data, uint32_t seed = 0, bool upper = false) { char* temp = utf16_to_utf8(data); + if (!temp) + return hash_murmurhash(0, 0, seed, upper); uint32_t hash = hash_murmurhash(temp, utf8_length(temp), seed, upper); free_def(temp); return hash; @@ -64,6 +68,8 @@ inline uint16_t hash_utf8_crc16_ccitt(const char* data, bool make_upper = false) inline uint16_t hash_utf16_crc16_ccitt(const wchar_t* data, bool make_upper = false) { char* temp = utf16_to_utf8(data); + if (!temp) + return hash_murmurhash(0, 0, make_upper); uint16_t hash = hash_crc16_ccitt(temp, utf8_length(temp), make_upper); free_def(temp); return hash; @@ -96,6 +102,9 @@ inline uint64_t hash_utf8_xxh3_64bits(const char* data, bool make_upper = false) inline uint64_t hash_utf16_xxh3_64bits(const wchar_t* data, bool make_upper = false) { if (make_upper) { // Modification for only uppercase latin text char* temp = utf16_to_utf8(data); + if (!temp) + return hash_xxh3_64bits(0, 0); + size_t size = utf8_length(temp); uint8_t* d = (uint8_t*)temp; @@ -111,6 +120,9 @@ inline uint64_t hash_utf16_xxh3_64bits(const wchar_t* data, bool make_upper = fa } char* temp = utf16_to_utf8(data); + if (!temp) + return hash_xxh3_64bits(0, 0); + size_t size = utf8_length(temp); uint64_t hash = hash_xxh3_64bits(temp, size); free_def(temp); @@ -161,6 +173,9 @@ inline uint64_t hash_utf8_adler32(uint32_t adler, const char* data, bool make_up inline uint64_t hash_utf16_adler32(uint32_t adler, const wchar_t* data, bool make_upper = false) { if (make_upper) { // Modification for only uppercase latin text char* temp = utf16_to_utf8(data); + if (!temp) + return hash_adler32(adler, 0, 0); + size_t size = utf8_length(temp); uint8_t* d = (uint8_t*)temp; @@ -176,6 +191,9 @@ inline uint64_t hash_utf16_adler32(uint32_t adler, const wchar_t* data, bool mak } char* temp = utf16_to_utf8(data); + if (!temp) + return hash_adler32(adler, 0, 0); + size_t size = utf8_length(temp); uint64_t hash = hash_adler32(adler, temp, size); free_def(temp); diff --git a/src/KKdLib/io/file_stream.cpp b/src/KKdLib/io/file_stream.cpp index 511aecc0..44159469 100644 --- a/src/KKdLib/io/file_stream.cpp +++ b/src/KKdLib/io/file_stream.cpp @@ -157,7 +157,7 @@ int32_t file_stream::set_position(int64_t pos, int32_t seek) { return _fseeki64(stream, pos, seek); } -void file_stream::open(const char* path, const char* mode) { +void file_stream::open(_In_z_ const char* path, _In_z_ const char* mode) { close(); if (!path || !mode) @@ -165,13 +165,15 @@ void file_stream::open(const char* path, const char* mode) { wchar_t* temp_path = utf8_to_utf16(path); wchar_t* temp_mode = utf8_to_utf16(mode); - stream = _wfsopen(temp_path, temp_mode, _SH_DENYNO); - get_length(); - free_def(temp_path); - free_def(temp_mode); + if (temp_path && temp_mode) { + stream = _wfsopen(temp_path, temp_mode, _SH_DENYNO); + get_length(); + } + free(temp_path); + free(temp_mode); } -void file_stream::open(const wchar_t* path, const wchar_t* mode) { +void file_stream::open(_In_z_ const wchar_t* path, _In_z_ const wchar_t* mode) { close(); if (!path || !mode) diff --git a/src/KKdLib/io/file_stream.hpp b/src/KKdLib/io/file_stream.hpp index 896ee9ea..3ca58ff7 100644 --- a/src/KKdLib/io/file_stream.hpp +++ b/src/KKdLib/io/file_stream.hpp @@ -34,8 +34,8 @@ public: virtual int64_t get_position() override; virtual int32_t set_position(int64_t pos, int32_t seek) override; - void open(const char* path, const char* mode); - void open(const wchar_t* path, const wchar_t* mode); + void open(_In_z_ const char* path, _In_z_ const char* mode); + void open(_In_z_ const wchar_t* path, _In_z_ const wchar_t* mode); template size_t read_data(T& data) { diff --git a/src/KKdLib/io/path.cpp b/src/KKdLib/io/path.cpp index bb885fd4..bfab60e0 100644 --- a/src/KKdLib/io/path.cpp +++ b/src/KKdLib/io/path.cpp @@ -8,8 +8,14 @@ #include "file_stream.hpp" #include -bool path_check_path_exists(const char* path) { +bool path_check_path_exists(_In_z_ const char* path) { + if (!path) + return false; + wchar_t* path_temp = utf8_to_utf16(path); + if (!path_temp) + return false; + DWORD ftyp = GetFileAttributesW(path_temp); free_def(path_temp); if (ftyp == INVALID_FILE_ATTRIBUTES) @@ -18,7 +24,10 @@ bool path_check_path_exists(const char* path) { return true; } -bool path_check_path_exists(const wchar_t* path) { +bool path_check_path_exists(_In_z_ const wchar_t* path) { + if (!path) + return false; + DWORD ftyp = GetFileAttributesW(path); if (ftyp == INVALID_FILE_ATTRIBUTES) return false; @@ -26,8 +35,14 @@ bool path_check_path_exists(const wchar_t* path) { return true; } -bool path_check_file_exists(const char* path) { +bool path_check_file_exists(_In_z_ const char* path) { + if (!path) + return false; + wchar_t* path_temp = utf8_to_utf16(path); + if (!path_temp) + return false; + DWORD ftyp = GetFileAttributesW(path_temp); free_def(path_temp); if (ftyp == INVALID_FILE_ATTRIBUTES) @@ -36,7 +51,10 @@ bool path_check_file_exists(const char* path) { return ftyp & FILE_ATTRIBUTE_DIRECTORY ? false : true; } -bool path_check_file_exists(const wchar_t* path) { +bool path_check_file_exists(_In_z_ const wchar_t* path) { + if (!path) + return false; + DWORD ftyp = GetFileAttributesW(path); if (ftyp == INVALID_FILE_ATTRIBUTES) return false; @@ -44,8 +62,14 @@ bool path_check_file_exists(const wchar_t* path) { return ftyp & FILE_ATTRIBUTE_DIRECTORY ? false : true; } -bool path_check_directory_exists(const char* path) { +bool path_check_directory_exists(_In_z_ const char* path) { + if (!path) + return false; + wchar_t* path_temp = utf8_to_utf16(path); + if (!path_temp) + return false; + DWORD ftyp = GetFileAttributesW(path_temp); free_def(path_temp); if (ftyp == INVALID_FILE_ATTRIBUTES) @@ -54,7 +78,10 @@ bool path_check_directory_exists(const char* path) { return ftyp & FILE_ATTRIBUTE_DIRECTORY ? true : false; } -bool path_check_directory_exists(const wchar_t* path) { +bool path_check_directory_exists(_In_z_ const wchar_t* path) { + if (!path) + return false; + DWORD ftyp = GetFileAttributesW(path); if (ftyp == INVALID_FILE_ATTRIBUTES) return false; @@ -62,8 +89,14 @@ bool path_check_directory_exists(const wchar_t* path) { return ftyp & FILE_ATTRIBUTE_DIRECTORY ? true : false; } -std::vector path_get_files(const char* path) { +std::vector path_get_files(_In_z_ const char* path) { + if (!path) + return {}; + wchar_t* dir_temp = utf8_to_utf16(path); + if (!dir_temp) + return {}; + size_t dir_len = utf16_length(dir_temp); if (!dir_temp) return {}; @@ -88,14 +121,17 @@ std::vector path_get_files(const char* path) { char* file_temp = utf16_to_utf8(fdata.cFileName); if (file_temp) { files.push_back(file_temp); - free(file_temp); + free_def(file_temp); } } while (FindNextFileW(h, &fdata)); FindClose(h); return files; } -std::vector path_get_files(const wchar_t* path) { +std::vector path_get_files(_In_z_ const wchar_t* path) { + if (!path) + return {}; + size_t dir_len = utf16_length(path); std::wstring dir; @@ -121,8 +157,14 @@ std::vector path_get_files(const wchar_t* path) { } std::vector path_get_directories( - const char* path, const char** exclude_list, size_t exclude_count) { + _In_z_ const char* path, _In_opt_ const char** exclude_list, _In_opt_ size_t exclude_count) { + if (!path) + return {}; + wchar_t* dir_temp = utf8_to_utf16(path); + if (!dir_temp) + return {}; + size_t dir_len = utf16_length(dir_temp); if (!dir_temp) return {}; @@ -178,7 +220,10 @@ std::vector path_get_directories( } std::vector path_get_directories( - const wchar_t* path, const wchar_t** exclude_list, size_t exclude_count) { + _In_z_ const wchar_t* path, _In_opt_ const wchar_t** exclude_list, _In_opt_ size_t exclude_count) { + if (!path) + return {}; + size_t dir_len = utf16_length(path); std::wstring dir; @@ -227,8 +272,14 @@ std::vector path_get_directories( } std::vector path_get_directories_recursive( - const char* path, const char** exclude_list, size_t exclude_count) { + _In_z_ const char* path, _In_opt_ const char** exclude_list, _In_opt_ size_t exclude_count) { + if (!path) + return {}; + wchar_t* dir_temp = utf8_to_utf16(path); + if (!dir_temp) + return {}; + size_t dir_len = utf16_length(dir_temp); if (!dir_temp) return {}; @@ -321,7 +372,10 @@ std::vector path_get_directories_recursive( } std::vector path_get_directories_recursive( - const wchar_t* path, const wchar_t** exclude_list, size_t exclude_count) { + _In_z_ const wchar_t* path, _In_opt_ const wchar_t** exclude_list, _In_opt_ size_t exclude_count) { + if (!path) + return {}; + size_t dir_len = utf16_length(path); std::wstring dir; @@ -408,7 +462,7 @@ std::vector path_get_directories_recursive( return directories; } -void path_get_full_path(std::string& str) { +void path_get_full_path(_Inout_ std::string& str) { wchar_t buf[MAX_PATH * 2]; buf[0] = 0; wchar_t* utf16_temp = utf8_to_utf16(str.c_str()); @@ -416,20 +470,20 @@ void path_get_full_path(std::string& str) { GetFullPathNameW(utf16_temp, MAX_PATH * 2, buf, 0); free_def(utf16_temp); - char* utf0_temp = utf16_to_utf8(buf); - if (utf0_temp) - str.assign(utf0_temp); - free_def(utf0_temp); + char* utf8_temp = utf16_to_utf8(buf); + if (utf8_temp) + str.assign(utf8_temp); + free_def(utf8_temp); } -void path_get_full_path(std::wstring& str) { +void path_get_full_path(_Inout_ std::wstring& str) { wchar_t buf[MAX_PATH * 2]; buf[0] = 0; GetFullPathNameW(str.c_str(), MAX_PATH * 2, buf, 0); str.assign(buf); } -bool path_create_file(const char* path) { +bool path_create_file(_In_z_ const char* path) { file_stream fs; fs.open(path, "wb"); bool ret = fs.check_not_null(); @@ -437,7 +491,7 @@ bool path_create_file(const char* path) { return ret; } -bool path_create_file(const wchar_t* path) { +bool path_create_file(_In_z_ const wchar_t* path) { file_stream fs; fs.open(path, L"wb"); bool ret = fs.check_not_null(); @@ -445,8 +499,11 @@ bool path_create_file(const wchar_t* path) { return ret; } -bool path_create_directory(const char* path) { +bool path_create_directory(_In_z_ const char* path) { wchar_t* path_temp = utf8_to_utf16(path); + if (!path_temp) + return false; + const wchar_t* _path = path_temp; while (true) { const wchar_t* c = wcschr(_path, L'\\'); @@ -469,8 +526,11 @@ bool path_create_directory(const char* path) { return ret; } -bool path_create_directory(const wchar_t* path) { +bool path_create_directory(_In_z_ const wchar_t* path) { const wchar_t* _path = path; + if (!_path) + return false; + while (true) { const wchar_t* c = wcschr(_path, L'\\'); if (!c) @@ -488,18 +548,24 @@ bool path_create_directory(const wchar_t* path) { return path_check_directory_exists(path) || CreateDirectoryW(path, 0); } -bool path_delete_file(const char* path) { +bool path_delete_file(_In_z_ const char* path) { wchar_t* path_temp = utf8_to_utf16(path); + if (!path_temp) + return false; + bool ret = !path_check_file_exists(path_temp) || DeleteFileW(path_temp); free_def(path_temp); return ret; } -bool path_delete_file(const wchar_t* path) { +bool path_delete_file(_In_z_ const wchar_t* path) { + if (!path) + return false; + return !path_check_file_exists(path) || DeleteFileW(path); } -bool path_delete_directory(const char* path) { +bool path_delete_directory(_In_z_ const char* path) { std::string dir; dir.assign(path); if (dir.size() && dir.back() != L'\\' && dir.back() != L'/') @@ -514,12 +580,15 @@ bool path_delete_directory(const char* path) { path_delete_directory((dir + i).c_str()); wchar_t* path_temp = utf8_to_utf16(path); + if (!path_temp) + return false; + bool ret = !path_check_directory_exists(path_temp) || RemoveDirectoryW(path_temp); free_def(path_temp); return ret; } -bool path_delete_directory(const wchar_t* path) { +bool path_delete_directory(_In_z_ const wchar_t* path) { std::wstring dir; dir.assign(path); if (dir.size() && dir.back() != L'\\' && dir.back() != L'/') @@ -536,7 +605,7 @@ bool path_delete_directory(const wchar_t* path) { return !path_check_directory_exists(path) || RemoveDirectoryW(path); } -bool path_copy_file(const char* src, const char* dst) { +bool path_copy_file(_In_z_ const char* src, _In_z_ const char* dst) { if (!path_check_file_exists(src) || path_check_directory_exists(dst)) return false; @@ -558,7 +627,7 @@ bool path_copy_file(const char* src, const char* dst) { return true; } -bool path_copy_file(const wchar_t* src, const wchar_t* dst) { +bool path_copy_file(_In_z_ const wchar_t* src, _In_z_ const wchar_t* dst) { if (!path_check_file_exists(src) || path_check_directory_exists(dst)) return false; @@ -576,9 +645,14 @@ bool path_copy_file(const wchar_t* src, const wchar_t* dst) { return true; } -int32_t path_compare_files(const char* path_1, const char* path_2) { +_Check_return_ int32_t path_compare_files(_In_z_ const char* path_1, _In_z_ const char* path_2) { wchar_t* path_1_temp = utf8_to_utf16(path_1); wchar_t* path_2_temp = utf8_to_utf16(path_2); + if (!path_1_temp || !path_2_temp) { + free_def(path_1_temp); + free_def(path_2_temp); + return 0; + } int32_t ret; if (!path_check_path_exists(path_1_temp)) @@ -607,8 +681,8 @@ int32_t path_compare_files(const char* path_1, const char* path_2) { std::ifstream ifs_1(path_1_temp, std::ios::in | std::ios::binary); std::ifstream ifs_2(path_2_temp, std::ios::in | std::ios::binary); while (ifs_1.good() && ifs_2.good()) { - char buf_1[0x200]; - char buf_2[0x200]; + char buf_1[0x400]; + char buf_2[0x400]; ifs_1.read(buf_1, sizeof(buf_1)); ifs_2.read(buf_2, sizeof(buf_2)); if (ifs_1.gcount() != ifs_2.gcount()) { @@ -630,7 +704,7 @@ int32_t path_compare_files(const char* path_1, const char* path_2) { return ret; } -int32_t path_compare_files(const wchar_t* path_1, const wchar_t* path_2) { +_Check_return_ int32_t path_compare_files(_In_z_ const wchar_t* path_1, _In_z_ const wchar_t* path_2) { int32_t ret; if (!path_check_path_exists(path_1)) ret = -1; @@ -658,8 +732,8 @@ int32_t path_compare_files(const wchar_t* path_1, const wchar_t* path_2) { std::ifstream ifs_1(path_1, std::ios::in | std::ios::binary); std::ifstream ifs_2(path_2, std::ios::in | std::ios::binary); while (ifs_1.good() && ifs_2.good()) { - char buf_1[0x200]; - char buf_2[0x200]; + char buf_1[0x400]; + char buf_2[0x400]; ifs_1.read(buf_1, sizeof(buf_1)); ifs_2.read(buf_2, sizeof(buf_2)); if (ifs_1.gcount() != ifs_2.gcount()) { @@ -678,7 +752,7 @@ int32_t path_compare_files(const wchar_t* path_1, const wchar_t* path_2) { return ret; } -bool path_fs_copy_file(const char* src, const char* dst) { +bool path_fs_copy_file(_In_z_ const char* src, _In_z_ const char* dst) { std::string _dst(dst); _dst.append(".fs_copy_file.tmp"); if (path_copy_file(src, _dst.c_str())) @@ -686,7 +760,7 @@ bool path_fs_copy_file(const char* src, const char* dst) { return false; } -bool path_fs_copy_file(const wchar_t* src, const wchar_t* dst) { +bool path_fs_copy_file(_In_z_ const wchar_t* src, _In_z_ const wchar_t* dst) { std::wstring _dst(dst); _dst.append(L".fs_copy_file.tmp"); if (path_copy_file(src, _dst.c_str())) @@ -694,17 +768,26 @@ bool path_fs_copy_file(const wchar_t* src, const wchar_t* dst) { return false; } -bool path_move_file(const char* old_path, const char* new_path) { +bool path_move_file(_In_z_ const char* old_path, _In_z_ const char* new_path) { + if (!old_path || !new_path) + return false; + wchar_t* old_path_temp = utf8_to_utf16(old_path); wchar_t* new_path_temp = utf8_to_utf16(new_path); - path_delete_file(new_path_temp); - bool ret = MoveFileW(old_path_temp, new_path_temp); + bool ret = false; + if (old_path_temp && new_path_temp) { + path_delete_file(new_path_temp); + ret = MoveFileW(old_path_temp, new_path_temp); + } free_def(old_path_temp); free_def(new_path_temp); return ret; } -bool path_move_file(const wchar_t* old_path, const wchar_t* new_path) { +bool path_move_file(_In_z_ const wchar_t* old_path, _In_z_ const wchar_t* new_path) { + if (!old_path || !new_path) + return false; + path_delete_file(new_path); return MoveFileW(old_path, new_path); } diff --git a/src/KKdLib/io/path.hpp b/src/KKdLib/io/path.hpp index c3f6fe10..76fb9fbc 100644 --- a/src/KKdLib/io/path.hpp +++ b/src/KKdLib/io/path.hpp @@ -9,38 +9,38 @@ #include #include "../default.hpp" -extern bool path_check_path_exists(const char* path); -extern bool path_check_path_exists(const wchar_t* path); -extern bool path_check_file_exists(const char* path); -extern bool path_check_file_exists(const wchar_t* path); -extern bool path_check_directory_exists(const char* path); -extern bool path_check_directory_exists(const wchar_t* path); -extern std::vector path_get_files(const char* path); -extern std::vector path_get_files(const wchar_t* path); +extern bool path_check_path_exists(_In_z_ const char* path); +extern bool path_check_path_exists(_In_z_ const wchar_t* path); +extern bool path_check_file_exists(_In_z_ const char* path); +extern bool path_check_file_exists(_In_z_ const wchar_t* path); +extern bool path_check_directory_exists(_In_z_ const char* path); +extern bool path_check_directory_exists(_In_z_ const wchar_t* path); +extern std::vector path_get_files(_In_z_ const char* path); +extern std::vector path_get_files(_In_z_ const wchar_t* path); extern std::vector path_get_directories( - const char* path, const char** exclude_list = 0, size_t exclude_count = 0); + _In_z_ const char* path, _In_opt_ const char** exclude_list = 0, _In_opt_ size_t exclude_count = 0); extern std::vector path_get_directories( - const wchar_t* path, const wchar_t** exclude_list = 0, size_t exclude_count = 0); + _In_z_ const wchar_t* path, _In_opt_ const wchar_t** exclude_list = 0, _In_opt_ size_t exclude_count = 0); extern std::vector path_get_directories_recursive( - const char* path, const char** exclude_list = 0, size_t exclude_count = 0); + _In_z_ const char* path, _In_opt_ const char** exclude_list = 0, _In_opt_ size_t exclude_count = 0); extern std::vector path_get_directories_recursive( - const wchar_t* path, const wchar_t** exclude_list = 0, size_t exclude_count = 0); -extern void path_get_full_path(std::string& str); -extern void path_get_full_path(std::wstring& str); + _In_z_ const wchar_t* path, _In_opt_ const wchar_t** exclude_list = 0, _In_opt_ size_t exclude_count = 0); +extern void path_get_full_path(_Inout_ std::string& str); +extern void path_get_full_path(_Inout_ std::wstring& str); -extern bool path_create_file(const char* path); -extern bool path_create_file(const wchar_t* path); -extern bool path_create_directory(const char* path); -extern bool path_create_directory(const wchar_t* path); -extern bool path_delete_file(const char* path); -extern bool path_delete_file(const wchar_t* path); -extern bool path_delete_directory(const char* path); -extern bool path_delete_directory(const wchar_t* path); -extern bool path_copy_file(const char* src, const char* dst); -extern bool path_copy_file(const wchar_t* src, const wchar_t* dst); -extern int32_t path_compare_files(const char* path_1, const char* path_2); -extern int32_t path_compare_files(const wchar_t* path_1, const wchar_t* path_2); -extern bool path_fs_copy_file(const char* src, const char* dst); -extern bool path_fs_copy_file(const wchar_t* src, const wchar_t* dst); -extern bool path_move_file(const char* old_path, const char* new_path); -extern bool path_move_file(const wchar_t* old_path, const wchar_t* new_path); +extern bool path_create_file(_In_z_ const char* path); +extern bool path_create_file(_In_z_ const wchar_t* path); +extern bool path_create_directory(_In_z_ const char* path); +extern bool path_create_directory(_In_z_ const wchar_t* path); +extern bool path_delete_file(_In_z_ const char* path); +extern bool path_delete_file(_In_z_ const wchar_t* path); +extern bool path_delete_directory(_In_z_ const char* path); +extern bool path_delete_directory(_In_z_ const wchar_t* path); +extern bool path_copy_file(_In_z_ const char* src, _In_z_ const char* dst); +extern bool path_copy_file(_In_z_ const wchar_t* src, _In_z_ const wchar_t* dst); +extern _Check_return_ int32_t path_compare_files(_In_z_ const char* path_1, _In_z_ const char* path_2); +extern _Check_return_ int32_t path_compare_files(_In_z_ const wchar_t* path_1, _In_z_ const wchar_t* path_2); +extern bool path_fs_copy_file(_In_z_ const char* src, _In_z_ const char* dst); +extern bool path_fs_copy_file(_In_z_ const wchar_t* src, _In_z_ const wchar_t* dst); +extern bool path_move_file(_In_z_ const char* old_path, _In_z_ const char* new_path); +extern bool path_move_file(_In_z_ const wchar_t* old_path, _In_z_ const wchar_t* new_path); diff --git a/src/KKdLib/io/stream.cpp b/src/KKdLib/io/stream.cpp index 33407c69..dd857f31 100644 --- a/src/KKdLib/io/stream.cpp +++ b/src/KKdLib/io/stream.cpp @@ -129,17 +129,17 @@ std::wstring stream::read_wstring_null_terminated_offset(int64_t offset) { return str; } -char* stream::read_utf8_string_null_terminated() { +_Check_return_ _Ret_maybenull_z_ char* stream::read_utf8_string_null_terminated() { int64_t offset = get_position(); return read_utf8_string_null_terminated_offset(offset); } -wchar_t* stream::read_utf16_string_null_terminated() { +_Check_return_ _Ret_maybenull_z_ wchar_t* stream::read_utf16_string_null_terminated() { int64_t offset = get_position(); return read_utf16_string_null_terminated_offset(offset); } -char* stream::read_utf8_string_null_terminated_offset(int64_t offset) { +_Check_return_ _Ret_maybenull_z_ char* stream::read_utf8_string_null_terminated_offset(int64_t offset) { size_t len = read_utf8_string_null_terminated_offset_length(offset); if (!len) { return 0; @@ -153,7 +153,7 @@ char* stream::read_utf8_string_null_terminated_offset(int64_t offset) { return str; } -wchar_t* stream::read_utf16_string_null_terminated_offset(int64_t offset) { +_Check_return_ _Ret_maybenull_z_ wchar_t* stream::read_utf16_string_null_terminated_offset(int64_t offset) { size_t len = read_utf16_string_null_terminated_offset_length(offset); if (!len) { position_pop(); @@ -635,20 +635,20 @@ void stream::write_wstring_null_terminated(const std::wstring& str) { write_uint16_t(0); } -void stream::write_utf8_string(const char* str) { +void stream::write_utf8_string(_In_z_ const char* str) { write(str, utf8_length(str)); } -void stream::write_utf16_string(const wchar_t* str) { +void stream::write_utf16_string(_In_z_ const wchar_t* str) { write(str, sizeof(wchar_t) * utf16_length(str)); } -void stream::write_utf8_string_null_terminated(const char* str) { +void stream::write_utf8_string_null_terminated(_In_z_ const char* str) { write(str, utf8_length(str)); write_uint8_t(0); } -void stream::write_utf16_string_null_terminated(const wchar_t* str) { +void stream::write_utf16_string_null_terminated(_In_z_ const wchar_t* str) { write(str, sizeof(wchar_t) * utf16_length(str)); write_uint16_t(0); } diff --git a/src/KKdLib/io/stream.hpp b/src/KKdLib/io/stream.hpp index 02580a84..f33b7157 100644 --- a/src/KKdLib/io/stream.hpp +++ b/src/KKdLib/io/stream.hpp @@ -117,10 +117,10 @@ public: std::wstring read_wstring_null_terminated(); std::string read_string_null_terminated_offset(int64_t offset); std::wstring read_wstring_null_terminated_offset(int64_t offset); - char* read_utf8_string_null_terminated(); - wchar_t* read_utf16_string_null_terminated(); - char* read_utf8_string_null_terminated_offset(int64_t offset); - wchar_t* read_utf16_string_null_terminated_offset(int64_t offset); + _Check_return_ _Ret_maybenull_z_ char* read_utf8_string_null_terminated(); + _Check_return_ _Ret_maybenull_z_ wchar_t* read_utf16_string_null_terminated(); + _Check_return_ _Ret_maybenull_z_ char* read_utf8_string_null_terminated_offset(int64_t offset); + _Check_return_ _Ret_maybenull_z_ wchar_t* read_utf16_string_null_terminated_offset(int64_t offset); size_t read_utf8_string_null_terminated_length(); size_t read_utf16_string_null_terminated_length(); size_t read_utf8_string_null_terminated_offset_length(int64_t offset); @@ -130,10 +130,10 @@ public: void write_wstring(const std::wstring& str); void write_string_null_terminated(const std::string& str); void write_wstring_null_terminated(const std::wstring& str); - void write_utf8_string(const char* str); - void write_utf16_string(const wchar_t* str); - void write_utf8_string_null_terminated(const char* str); - void write_utf16_string_null_terminated(const wchar_t* str); + void write_utf8_string(_In_z_ const char* str); + void write_utf16_string(_In_z_ const wchar_t* str); + void write_utf8_string_null_terminated(_In_z_ const char* str); + void write_utf16_string_null_terminated(_In_z_ const wchar_t* str); int64_t read_offset(int64_t offset, bool is_x); int64_t read_offset_f2(int64_t offset); diff --git a/src/KKdLib/light_param/face.cpp b/src/KKdLib/light_param/face.cpp index 7f8bfa6a..4c687871 100644 --- a/src/KKdLib/light_param/face.cpp +++ b/src/KKdLib/light_param/face.cpp @@ -23,6 +23,9 @@ light_param_face::~light_param_face() { void light_param_face::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, "rb"); @@ -34,6 +37,9 @@ void light_param_face::read(const char* path) { void light_param_face::read(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, L"rb"); @@ -54,6 +60,9 @@ void light_param_face::write(const char* path) { return; char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, "wb"); if (s.check_not_null()) @@ -66,6 +75,9 @@ void light_param_face::write(const wchar_t* path) { return; wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/light_param/fog.cpp b/src/KKdLib/light_param/fog.cpp index 99a3f365..a3bf5587 100644 --- a/src/KKdLib/light_param/fog.cpp +++ b/src/KKdLib/light_param/fog.cpp @@ -23,6 +23,9 @@ light_param_fog::~light_param_fog() { void light_param_fog::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, "rb"); @@ -34,6 +37,9 @@ void light_param_fog::read(const char* path) { void light_param_fog::read(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, L"rb"); @@ -54,6 +60,9 @@ void light_param_fog::write(const char* path) { return; char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, "wb"); if (s.check_not_null()) @@ -66,6 +75,9 @@ void light_param_fog::write(const wchar_t* path) { return; wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/light_param/glow.cpp b/src/KKdLib/light_param/glow.cpp index 51689d40..09ae750b 100644 --- a/src/KKdLib/light_param/glow.cpp +++ b/src/KKdLib/light_param/glow.cpp @@ -27,6 +27,9 @@ light_param_glow::~light_param_glow() { void light_param_glow::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, "rb"); @@ -38,6 +41,9 @@ void light_param_glow::read(const char* path) { void light_param_glow::read(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, L"rb"); @@ -58,6 +64,9 @@ void light_param_glow::write(const char* path) { return; char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, "wb"); if (s.check_not_null()) @@ -70,6 +79,9 @@ void light_param_glow::write(const wchar_t* path) { return; wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/light_param/ibl.cpp b/src/KKdLib/light_param/ibl.cpp index e508055b..7a5e1031 100644 --- a/src/KKdLib/light_param/ibl.cpp +++ b/src/KKdLib/light_param/ibl.cpp @@ -24,6 +24,9 @@ light_param_ibl::~light_param_ibl() { void light_param_ibl::read(const char* path) { char* path_ibl = str_utils_add(path, ".ibl"); + if (!path_ibl) + return; + if (path_check_file_exists(path_ibl)) { file_stream s; s.open(path_ibl, "rb"); @@ -35,6 +38,9 @@ void light_param_ibl::read(const char* path) { void light_param_ibl::read(const wchar_t* path) { wchar_t* path_ibl = str_utils_add(path, L".ibl"); + if (!path_ibl) + return; + if (path_check_file_exists(path_ibl)) { file_stream s; s.open(path_ibl, L"rb"); diff --git a/src/KKdLib/light_param/light.cpp b/src/KKdLib/light_param/light.cpp index 19722f42..904fd603 100644 --- a/src/KKdLib/light_param/light.cpp +++ b/src/KKdLib/light_param/light.cpp @@ -23,6 +23,9 @@ light_param_light::~light_param_light() { void light_param_light::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, "rb"); @@ -34,6 +37,9 @@ void light_param_light::read(const char* path) { void light_param_light::read(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, L"rb"); @@ -54,6 +60,9 @@ void light_param_light::write(const char* path) { return; char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, "wb"); if (s.check_not_null()) @@ -66,6 +75,9 @@ void light_param_light::write(const wchar_t* path) { return; wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/light_param/wind.cpp b/src/KKdLib/light_param/wind.cpp index 832fac49..6dbf8603 100644 --- a/src/KKdLib/light_param/wind.cpp +++ b/src/KKdLib/light_param/wind.cpp @@ -24,6 +24,9 @@ light_param_wind::~light_param_wind() { void light_param_wind::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, "rb"); @@ -35,6 +38,9 @@ void light_param_wind::read(const char* path) { void light_param_wind::read(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, L"rb"); @@ -55,6 +61,9 @@ void light_param_wind::write(const char* path) { return; char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, "wb"); if (s.check_not_null()) @@ -67,6 +76,9 @@ void light_param_wind::write(const wchar_t* path) { return; wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/msgpack.cpp b/src/KKdLib/msgpack.cpp index 2367fe16..fea01d68 100644 --- a/src/KKdLib/msgpack.cpp +++ b/src/KKdLib/msgpack.cpp @@ -5,7 +5,7 @@ #include "msgpack.hpp" -msgpack* msgpack::get_by_index(size_t index) { +_Ret_maybenull_ msgpack* msgpack::get_by_index(_In_ size_t index) { if (type != MSGPACK_ARRAY) return 0; @@ -15,7 +15,7 @@ msgpack* msgpack::get_by_index(size_t index) { return 0; } -void msgpack::set_by_index(msgpack* m, size_t index) { +void msgpack::set_by_index(_In_ msgpack* m, _In_ size_t index) { if (type != MSGPACK_ARRAY) return; @@ -26,7 +26,7 @@ void msgpack::set_by_index(msgpack* m, size_t index) { } } -msgpack* msgpack::get_by_name(const char* name) { +_Ret_maybenull_ msgpack* msgpack::get_by_name(_In_z_ const char* name) { if (type != MSGPACK_MAP) return 0; @@ -38,7 +38,7 @@ msgpack* msgpack::get_by_name(const char* name) { return 0; } -void msgpack::set_by_name(const char* name, msgpack* m) { +void msgpack::set_by_name(_In_z_ const char* name, _In_ msgpack* m) { if (type != MSGPACK_MAP) return; @@ -49,10 +49,11 @@ void msgpack::set_by_name(const char* name, msgpack* m) { return; } +#pragma warning(suppress: 6031) append(name, m); } -msgpack* msgpack::append(const char* name, msgpack* m) { +_Ret_maybenull_ msgpack* msgpack::append(_In_z_ const char* name, _Inout_ msgpack* m) { if (type != MSGPACK_MAP) return 0; @@ -69,7 +70,7 @@ msgpack* msgpack::append(const char* name, msgpack* m) { } } -msgpack* msgpack::append(const char* name, msgpack& m) { +_Ret_maybenull_ msgpack* msgpack::append(_In_z_ const char* name, _Inout_ msgpack& m) { if (type != MSGPACK_MAP) return 0; @@ -86,7 +87,7 @@ msgpack* msgpack::append(const char* name, msgpack& m) { } } -msgpack* msgpack::append(const char* name, msgpack&& m) { +_Ret_maybenull_ msgpack* msgpack::append(_In_z_ const char* name, _Inout_ msgpack&& m) { if (type != MSGPACK_MAP) return 0; @@ -103,14 +104,14 @@ msgpack* msgpack::append(const char* name, msgpack&& m) { } } -msgpack* msgpack::read(const char* name) { +_Ret_maybenull_ msgpack* msgpack::read(_In_opt_z_ const char* name) { if (!this) return 0; return name ? get_by_name(name) : this; } -msgpack* msgpack::read(const char* name, msgpack_type type) { +_Ret_maybenull_ msgpack* msgpack::read(_In_opt_z_ const char* name, _In_ msgpack_type type) { if (!this) return 0; @@ -125,7 +126,7 @@ msgpack* msgpack::read(const char* name, msgpack_type type) { return 0; } -msgpack* msgpack::read_array(const char* name) { +_Ret_maybenull_ msgpack* msgpack::read_array(_In_opt_z_ const char* name) { if (!this) return 0; @@ -135,7 +136,7 @@ msgpack* msgpack::read_array(const char* name) { return 0; } -msgpack* msgpack::read_map(const char* name) { +_Ret_maybenull_ msgpack* msgpack::read_map(_In_opt_z_ const char* name) { if (!this) return 0; @@ -145,7 +146,7 @@ msgpack* msgpack::read_map(const char* name) { return 0; } -bool msgpack::read_bool(const char* name) { +bool msgpack::read_bool(_In_opt_z_ const char* name) { if (!this) return 0; @@ -155,7 +156,7 @@ bool msgpack::read_bool(const char* name) { return 0; } -int8_t msgpack::read_int8_t(const char* name) { +int8_t msgpack::read_int8_t(_In_opt_z_ const char* name) { if (!this) return 0; @@ -172,7 +173,7 @@ int8_t msgpack::read_int8_t(const char* name) { return 0; } -uint8_t msgpack::read_uint8_t(const char* name) { +uint8_t msgpack::read_uint8_t(_In_opt_z_ const char* name) { if (!this) return 0; @@ -189,7 +190,7 @@ uint8_t msgpack::read_uint8_t(const char* name) { return 0; } -int16_t msgpack::read_int16_t(const char* name) { +int16_t msgpack::read_int16_t(_In_opt_z_ const char* name) { if (!this) return 0; @@ -210,7 +211,7 @@ int16_t msgpack::read_int16_t(const char* name) { return 0; } -uint16_t msgpack::read_uint16_t(const char* name) { +uint16_t msgpack::read_uint16_t(_In_opt_z_ const char* name) { if (!this) return 0; @@ -231,7 +232,7 @@ uint16_t msgpack::read_uint16_t(const char* name) { return 0; } -int32_t msgpack::read_int32_t(const char* name) { +int32_t msgpack::read_int32_t(_In_opt_z_ const char* name) { if (!this) return 0; @@ -256,7 +257,7 @@ int32_t msgpack::read_int32_t(const char* name) { return 0; } -uint32_t msgpack::read_uint32_t(const char* name) { +uint32_t msgpack::read_uint32_t(_In_opt_z_ const char* name) { if (!this) return 0; @@ -281,7 +282,7 @@ uint32_t msgpack::read_uint32_t(const char* name) { return 0; } -int64_t msgpack::read_int64_t(const char* name) { +int64_t msgpack::read_int64_t(_In_opt_z_ const char* name) { if (!this) return 0; @@ -310,7 +311,7 @@ int64_t msgpack::read_int64_t(const char* name) { return 0; } -uint64_t msgpack::read_uint64_t(const char* name) { +uint64_t msgpack::read_uint64_t(_In_opt_z_ const char* name) { if (!this) return 0; @@ -339,7 +340,7 @@ uint64_t msgpack::read_uint64_t(const char* name) { return 0; } -float_t msgpack::read_float_t(const char* name) { +float_t msgpack::read_float_t(_In_opt_z_ const char* name) { if (!this) return 0; @@ -372,7 +373,7 @@ float_t msgpack::read_float_t(const char* name) { return 0; } -double_t msgpack::read_double_t(const char* name) { +double_t msgpack::read_double_t(_In_opt_z_ const char* name) { if (!this) return 0; @@ -405,7 +406,7 @@ double_t msgpack::read_double_t(const char* name) { return 0; } -char* msgpack::read_utf8_string(const char* name) { +_Check_return_ _Ret_maybenull_z_ char* msgpack::read_utf8_string(_In_opt_z_ const char* name) { if (!this) return 0; @@ -420,7 +421,7 @@ char* msgpack::read_utf8_string(const char* name) { return 0; } -wchar_t* msgpack::read_utf16_string(const char* name) { +_Check_return_ _Ret_maybenull_z_ wchar_t* msgpack::read_utf16_string(_In_opt_z_ const char* name) { if (!this) return 0; @@ -430,7 +431,7 @@ wchar_t* msgpack::read_utf16_string(const char* name) { return 0; } -std::string msgpack::read_string(const char* name) { +std::string msgpack::read_string(_In_opt_z_ const char* name) { if (!this) return {}; @@ -440,7 +441,7 @@ std::string msgpack::read_string(const char* name) { return {}; } -std::wstring msgpack::read_wstring(const char* name) { +std::wstring msgpack::read_wstring(_In_opt_z_ const char* name) { if (!this) return {}; diff --git a/src/KKdLib/msgpack.hpp b/src/KKdLib/msgpack.hpp index 03c1a75d..092838d0 100644 --- a/src/KKdLib/msgpack.hpp +++ b/src/KKdLib/msgpack.hpp @@ -55,32 +55,32 @@ struct msgpack { msgpack_type type; msgpack_data data; - msgpack* get_by_index(size_t index); - void set_by_index(msgpack* m, size_t index); - msgpack* get_by_name(const char* name); - void set_by_name(const char* name, msgpack* m); - msgpack* append(const char* name, msgpack* m); - msgpack* append(const char* name, msgpack& m); - msgpack* append(const char* name, msgpack&& m); - msgpack* read(const char* name); - msgpack* read(const char* name, msgpack_type type); - msgpack* read_array(const char* name = 0); - msgpack* read_map(const char* name = 0); - bool read_bool(const char* name = 0); - int8_t read_int8_t(const char* name = 0); - uint8_t read_uint8_t(const char* name = 0); - int16_t read_int16_t(const char* name = 0); - uint16_t read_uint16_t(const char* name = 0); - int32_t read_int32_t(const char* name = 0); - uint32_t read_uint32_t(const char* name = 0); - int64_t read_int64_t(const char* name = 0); - uint64_t read_uint64_t(const char* name = 0); - float_t read_float_t(const char* name = 0); - double_t read_double_t(const char* name = 0); - char* read_utf8_string(const char* name = 0); - wchar_t* read_utf16_string(const char* name = 0); - std::string read_string(const char* name = 0); - std::wstring read_wstring(const char* name = 0); + _Ret_maybenull_ msgpack* get_by_index(_In_ size_t index); + void set_by_index(_In_ msgpack* m, _In_ size_t index); + _Ret_maybenull_ msgpack* get_by_name(_In_z_ const char* name); + void set_by_name(_In_z_ const char* name, _In_ msgpack* m); + _Ret_maybenull_ msgpack* append(_In_z_ const char* name, _Inout_ msgpack* m); + _Ret_maybenull_ msgpack* append(_In_z_ const char* name, _Inout_ msgpack& m); + _Ret_maybenull_ msgpack* append(_In_z_ const char* name, _Inout_ msgpack&& m); + _Ret_maybenull_ msgpack* read(_In_opt_z_ const char* name); + _Ret_maybenull_ msgpack* read(_In_opt_z_ const char* name, _In_ msgpack_type type); + _Ret_maybenull_ msgpack* read_array(_In_opt_z_ const char* name = 0); + _Ret_maybenull_ msgpack* read_map(_In_opt_z_ const char* name = 0); + bool read_bool(_In_opt_z_ const char* name = 0); + int8_t read_int8_t(_In_opt_z_ const char* name = 0); + uint8_t read_uint8_t(_In_opt_z_ const char* name = 0); + int16_t read_int16_t(_In_opt_z_ const char* name = 0); + uint16_t read_uint16_t(_In_opt_z_ const char* name = 0); + int32_t read_int32_t(_In_opt_z_ const char* name = 0); + uint32_t read_uint32_t(_In_opt_z_ const char* name = 0); + int64_t read_int64_t(_In_opt_z_ const char* name = 0); + uint64_t read_uint64_t(_In_opt_z_ const char* name = 0); + float_t read_float_t(_In_opt_z_ const char* name = 0); + double_t read_double_t(_In_opt_z_ const char* name = 0); + _Check_return_ _Ret_maybenull_z_ char* read_utf8_string(_In_opt_z_ const char* name = 0); + _Check_return_ _Ret_maybenull_z_ wchar_t* read_utf16_string(_In_opt_z_ const char* name = 0); + std::string read_string(_In_opt_z_ const char* name = 0); + std::wstring read_wstring(_In_opt_z_ const char* name = 0); msgpack& operator=(const msgpack& m); @@ -190,41 +190,44 @@ struct msgpack { data.str = new std::string; if (val) { char* temp = utf16_to_utf8(val); - data.str->assign(temp); + if (temp) + data.str->assign(temp); free_def(temp); } } - inline msgpack(std::string& val) : data() { + inline msgpack(const std::string& val) : data() { type = MSGPACK_STRING; data.str = new std::string; if (val.size()) data.str->assign(val); } - inline msgpack(std::string&& val) : data() { + inline msgpack(const std::string&& val) : data() { type = MSGPACK_STRING; data.str = new std::string; if (val.size()) data.str->assign(val); } - inline msgpack(std::wstring& val) : data() { + inline msgpack(const std::wstring& val) : data() { type = MSGPACK_STRING; data.str = new std::string; if (val.size()) { char* temp = utf16_to_utf8(val.c_str()); - data.str->assign(temp); + if (temp) + data.str->assign(temp); free_def(temp); } } - inline msgpack(std::wstring&& val) : data() { + inline msgpack(const std::wstring&& val) : data() { type = MSGPACK_STRING; data.str = new std::string; if (val.size()) { char* temp = utf16_to_utf8(val.c_str()); - data.str->assign(temp); + if (temp) + data.str->assign(temp); free_def(temp); } } diff --git a/src/KKdLib/obj.cpp b/src/KKdLib/obj.cpp index 9cf9b1bc..0d586c78 100644 --- a/src/KKdLib/obj.cpp +++ b/src/KKdLib/obj.cpp @@ -2992,11 +2992,12 @@ static obj_skin_block_constraint* obj_classic_read_skin_block_constraint( char* name = s.read_utf8_string_null_terminated_offset(name_offset); cns->name_index = 0; - for (const char** i = str; *i; i++) - if (!str_utils_compare(name, *i)) { - cns->name_index = 0x8000 | (int32_t)(i - str); - break; - } + if (name) + for (const char** i = str; *i; i++) + if (!str_utils_compare(name, *i)) { + cns->name_index = 0x8000 | (int32_t)(i - str); + break; + } free_def(name); cns->coupling = (obj_skin_block_constraint_coupling)s.read_uint32_t(); @@ -3004,7 +3005,11 @@ static obj_skin_block_constraint* obj_classic_read_skin_block_constraint( uint32_t source_node_name_offset = s.read_uint32_t(); cns->source_node_name = obj_read_utf8_string_null_terminated_offset(alloc, s, source_node_name_offset); - if (!str_utils_compare(type, "Orientation")) { + if (!type) { + cns->type = OBJ_SKIN_BLOCK_CONSTRAINT_NONE; + cns->data = 0; + } + else if (!str_utils_compare(type, "Orientation")) { cns->type = OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION; obj_skin_block_constraint_orientation* orientation @@ -3190,11 +3195,12 @@ static obj_skin_block_expression* obj_classic_read_skin_block_expression( char* name = s.read_utf8_string_null_terminated_offset(name_offset); exp->name_index = 0; - for (const char** i = str; *i; i++) - if (!str_utils_compare(name, *i)) { - exp->name_index = 0x8000 | (int32_t)(i - str); - break; - } + if (name) + for (const char** i = str; *i; i++) + if (!str_utils_compare(name, *i)) { + exp->name_index = 0x8000 | (int32_t)(i - str); + break; + } free_def(name); int32_t num_expression = s.read_int32_t(); @@ -3247,11 +3253,12 @@ static obj_skin_block_motion* obj_classic_read_skin_block_motion( char* name = s.read_utf8_string_null_terminated_offset(name_offset); mot->name_index = 0; - for (const char** i = str; *i; i++) - if (!str_utils_compare(name, *i)) { - mot->name_index = 0x8000 | (int32_t)(i - str); - break; - } + if (name) + for (const char** i = str; *i; i++) + if (!str_utils_compare(name, *i)) { + mot->name_index = 0x8000 | (int32_t)(i - str); + break; + } free_def(name); mot->node_array = 0; @@ -7054,12 +7061,13 @@ static obj_skin_block_constraint* obj_modern_read_skin_block_constraint( int64_t name_offset = s.read_offset(header_length, is_x); char* name = s.read_utf8_string_null_terminated_offset(name_offset); - uint32_t name_index = 0; - for (const char** i = str; *i; i++) - if (!str_utils_compare(name, *i)) { - cns->name_index = 0x8000 | (int32_t)(i - str); - break; - } + cns->name_index = 0; + if (name) + for (const char** i = str; *i; i++) + if (!str_utils_compare(name, *i)) { + cns->name_index = 0x8000 | (int32_t)(i - str); + break; + } free_def(name); cns->coupling = (obj_skin_block_constraint_coupling)s.read_uint32_t_reverse_endianness(); @@ -7067,7 +7075,11 @@ static obj_skin_block_constraint* obj_modern_read_skin_block_constraint( int64_t source_node_name_offset = s.read_offset(header_length, is_x); cns->source_node_name = obj_read_utf8_string_null_terminated_offset(alloc, s, source_node_name_offset); - if (!str_utils_compare(type, "Orientation")) { + if (!type) { + cns->type = OBJ_SKIN_BLOCK_CONSTRAINT_NONE; + cns->data = 0; + } + else if (!str_utils_compare(type, "Orientation")) { cns->type = OBJ_SKIN_BLOCK_CONSTRAINT_ORIENTATION; obj_skin_block_constraint_orientation* orientation @@ -7253,11 +7265,12 @@ static obj_skin_block_expression* obj_modern_read_skin_block_expression( char* name = s.read_utf8_string_null_terminated_offset(name_offset); exp->name_index = 0; - for (const char** i = str; *i; i++) - if (!str_utils_compare(name, *i)) { - exp->name_index = 0x8000 | (int32_t)(i - str); - break; - } + if (name) + for (const char** i = str; *i; i++) + if (!str_utils_compare(name, *i)) { + exp->name_index = 0x8000 | (int32_t)(i - str); + break; + } free_def(name); int32_t num_expression = s.read_int32_t_reverse_endianness(); @@ -7330,11 +7343,12 @@ static obj_skin_block_motion* obj_modern_read_skin_block_motion( if (!is_x) { mot->name_index = 0; char* name = s.read_utf8_string_null_terminated_offset(name_offset); - for (const char** i = str; *i; i++) - if (!str_utils_compare(name, *i)) { - mot->name_index = 0x8000 | (int32_t)(i - str); - break; - } + if (name) + for (const char** i = str; *i; i++) + if (!str_utils_compare(name, *i)) { + mot->name_index = 0x8000 | (int32_t)(i - str); + break; + } free_def(name); } else diff --git a/src/KKdLib/post_process_table/dof.cpp b/src/KKdLib/post_process_table/dof.cpp index e4180373..8e745fb1 100644 --- a/src/KKdLib/post_process_table/dof.cpp +++ b/src/KKdLib/post_process_table/dof.cpp @@ -27,6 +27,9 @@ void dof::read(const char* path) { return; char* path_dft = str_utils_add(path, ".dft"); + if (!path_dft) + return; + if (path_check_file_exists(path_dft)) { f2_struct st; st.read(path_dft); @@ -44,10 +47,13 @@ void dof::read(const wchar_t* path) { if (!path) return; - wchar_t* path_dex = str_utils_add(path, L".dft"); - if (path_check_file_exists(path_dex)) { + wchar_t* path_dft = str_utils_add(path, L".dft"); + if (!path_dft) + return; + + if (path_check_file_exists(path_dft)) { f2_struct st; - st.read(path_dex); + st.read(path_dft); if (st.header.signature == reverse_endianness_uint32_t('DOFT')) { memory_stream s_doft; s_doft.open(st.data); @@ -55,7 +61,7 @@ void dof::read(const wchar_t* path) { dof_read_inner(this, s_doft, st.header.get_length()); } } - free_def(path_dex); + free_def(path_dft); } void dof::read(const void* data, size_t size) { @@ -76,24 +82,30 @@ void dof::write(const char* path) { if (!path || !ready) return; - char* path_dex = str_utils_add(path, ".dft"); + char* path_dft = str_utils_add(path, ".dft"); + if (!path_dft) + return; + file_stream s; - s.open(path_dex, "wb"); + s.open(path_dft, "wb"); if (s.check_not_null()) dof_write_inner(this, s); - free_def(path_dex); + free_def(path_dft); } void dof::write(const wchar_t* path) { if (!path || !ready) return; - wchar_t* path_dex = str_utils_add(path, L".dft"); + wchar_t* path_dft = str_utils_add(path, L".dft"); + if (!path_dft) + return; + file_stream s; - s.open(path_dex, L"wb"); + s.open(path_dft, L"wb"); if (s.check_not_null()) dof_write_inner(this, s); - free_def(path_dex); + free_def(path_dft); } void dof::write(void** data, size_t* size) { diff --git a/src/KKdLib/pvpp.cpp b/src/KKdLib/pvpp.cpp index ce5919e4..299fa7d3 100644 --- a/src/KKdLib/pvpp.cpp +++ b/src/KKdLib/pvpp.cpp @@ -84,6 +84,9 @@ void pvpp::read(const char* path) { return; char* path_pvpp = str_utils_add(path, ".pvpp"); + if (!path_pvpp) + return; + if (path_check_file_exists(path_pvpp)) { file_stream s; s.open(path_pvpp, "rb"); @@ -98,6 +101,9 @@ void pvpp::read(const wchar_t* path) { return; wchar_t* path_pvpp = str_utils_add(path, L".pvpp"); + if (!path_pvpp) + return; + if (path_check_file_exists(path_pvpp)) { file_stream s; s.open(path_pvpp, L"rb"); diff --git a/src/KKdLib/pvsr.cpp b/src/KKdLib/pvsr.cpp index bc0d5c15..d8b145fd 100644 --- a/src/KKdLib/pvsr.cpp +++ b/src/KKdLib/pvsr.cpp @@ -122,6 +122,9 @@ void pvsr::read(const char* path) { return; char* path_pvsr = str_utils_add(path, ".pvsr"); + if (!path_pvsr) + return; + if (path_check_file_exists(path_pvsr)) { file_stream s; s.open(path_pvsr, "rb"); @@ -136,6 +139,9 @@ void pvsr::read(const wchar_t* path) { return; wchar_t* path_pvsr = str_utils_add(path, L".pvsr"); + if (!path_pvsr) + return; + if (path_check_file_exists(path_pvsr)) { file_stream s; s.open(path_pvsr, L"rb"); diff --git a/src/KKdLib/sound/diva.cpp b/src/KKdLib/sound/diva.cpp index 1b99ac80..27ca2b5c 100644 --- a/src/KKdLib/sound/diva.cpp +++ b/src/KKdLib/sound/diva.cpp @@ -55,6 +55,9 @@ void diva::read(const char* path) { return; char* path_diva = str_utils_add(path, ".diva"); + if (!path_diva) + return; + file_stream s; s.open(path_diva, "rb"); if (s.check_not_null()) { @@ -74,6 +77,9 @@ void diva::read(const wchar_t* path) { return; wchar_t* path_diva = str_utils_add(path, L".diva"); + if (!path_diva) + return; + file_stream s; s.open(path_diva, L"rb"); if (s.check_not_null()) { @@ -99,6 +105,9 @@ void diva::write(const char* path) { } char* path_diva = str_utils_add(path, ".diva"); + if (!path_diva) + return; + file_stream s; s.open(path_diva, "wb"); if (s.check_not_null()) @@ -118,6 +127,9 @@ void diva::write(const wchar_t* path) { return; wchar_t* path_diva = str_utils_add(path, L".diva"); + if (!path_diva) + return; + file_stream s; s.open(path_diva, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/sound/vag.cpp b/src/KKdLib/sound/vag.cpp index 8b1f4030..985ae161 100644 --- a/src/KKdLib/sound/vag.cpp +++ b/src/KKdLib/sound/vag.cpp @@ -172,6 +172,9 @@ vag::~vag() { void vag::read(const char* path) { char* path_vag = str_utils_add(path, ".vag"); + if (!path_vag) + return; + file_stream s; s.open(path_vag, "rb"); if (s.check_not_null()) { @@ -191,6 +194,9 @@ void vag::read(const char* path) { void vag::read(const wchar_t* path) { wchar_t* path_vag = str_utils_add(path, L".vag"); + if (!path_vag) + return; + file_stream s; s.open(path_vag, L"rb"); if (s.check_not_null()) { @@ -220,6 +226,9 @@ void vag::write(const char* path, vag_option option) { size = align_val_divide(num_samples, BLOCK_SIZE, BLOCK_SIZE); char* path_vag = str_utils_add(path, ".vag"); + if (!path_vag) + return; + file_stream s; s.open(path_vag, "wb"); if (s.check_not_null()) @@ -241,6 +250,9 @@ void vag::write(const wchar_t* path, vag_option option) { size = align_val_divide(num_samples, BLOCK_SIZE, BLOCK_SIZE); wchar_t* path_vag = str_utils_add(path, L".vag"); + if (!path_vag) + return; + file_stream s; s.open(path_vag, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/stage_param/fog_ring.cpp b/src/KKdLib/stage_param/fog_ring.cpp index e872a91e..5e375861 100644 --- a/src/KKdLib/stage_param/fog_ring.cpp +++ b/src/KKdLib/stage_param/fog_ring.cpp @@ -28,6 +28,9 @@ stage_param_fog_ring::~stage_param_fog_ring() { void stage_param_fog_ring::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, "rb"); @@ -39,6 +42,9 @@ void stage_param_fog_ring::read(const char* path) { void stage_param_fog_ring::read(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, L"rb"); @@ -59,6 +65,9 @@ void stage_param_fog_ring::write(const char* path) { return; char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, "wb"); if (s.check_not_null()) @@ -71,6 +80,9 @@ void stage_param_fog_ring::write(const wchar_t* path) { return; wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/stage_param/leaf.cpp b/src/KKdLib/stage_param/leaf.cpp index 02f82473..1fac0ffc 100644 --- a/src/KKdLib/stage_param/leaf.cpp +++ b/src/KKdLib/stage_param/leaf.cpp @@ -32,6 +32,9 @@ stage_param_leaf::~stage_param_leaf() { void stage_param_leaf::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, "rb"); @@ -43,6 +46,9 @@ void stage_param_leaf::read(const char* path) { void stage_param_leaf::read(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, L"rb"); @@ -63,6 +69,9 @@ void stage_param_leaf::write(const char* path) { return; char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, "wb"); if (s.check_not_null()) @@ -75,6 +84,9 @@ void stage_param_leaf::write(const wchar_t* path) { return; wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/stage_param/litproj.cpp b/src/KKdLib/stage_param/litproj.cpp index 97f0994d..9e3def96 100644 --- a/src/KKdLib/stage_param/litproj.cpp +++ b/src/KKdLib/stage_param/litproj.cpp @@ -25,6 +25,9 @@ stage_param_litproj::~stage_param_litproj() { void stage_param_litproj::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, "rb"); @@ -36,6 +39,9 @@ void stage_param_litproj::read(const char* path) { void stage_param_litproj::read(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, L"rb"); @@ -56,6 +62,9 @@ void stage_param_litproj::write(const char* path) { return; char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, "wb"); if (s.check_not_null()) @@ -68,6 +77,9 @@ void stage_param_litproj::write(const wchar_t* path) { return; wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/stage_param/rain.cpp b/src/KKdLib/stage_param/rain.cpp index a57dbbf9..6bc0a607 100644 --- a/src/KKdLib/stage_param/rain.cpp +++ b/src/KKdLib/stage_param/rain.cpp @@ -27,6 +27,9 @@ stage_param_rain::~stage_param_rain() { void stage_param_rain::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, "rb"); @@ -38,6 +41,9 @@ void stage_param_rain::read(const char* path) { void stage_param_rain::read(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, L"rb"); @@ -58,6 +64,9 @@ void stage_param_rain::write(const char* path) { return; char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, "wb"); if (s.check_not_null()) @@ -70,6 +79,9 @@ void stage_param_rain::write(const wchar_t* path) { return; wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/stage_param/ripple.cpp b/src/KKdLib/stage_param/ripple.cpp index 573c460c..362e829b 100644 --- a/src/KKdLib/stage_param/ripple.cpp +++ b/src/KKdLib/stage_param/ripple.cpp @@ -30,6 +30,9 @@ stage_param_ripple::~stage_param_ripple() { void stage_param_ripple::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, "rb"); @@ -41,6 +44,9 @@ void stage_param_ripple::read(const char* path) { void stage_param_ripple::read(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, L"rb"); @@ -61,6 +67,9 @@ void stage_param_ripple::write(const char* path) { return; char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, "wb"); if (s.check_not_null()) @@ -73,6 +82,9 @@ void stage_param_ripple::write(const wchar_t* path) { return; wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/stage_param/snow.cpp b/src/KKdLib/stage_param/snow.cpp index 57685954..e3627825 100644 --- a/src/KKdLib/stage_param/snow.cpp +++ b/src/KKdLib/stage_param/snow.cpp @@ -32,6 +32,9 @@ stage_param_snow::~stage_param_snow() { void stage_param_snow::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, "rb"); @@ -43,6 +46,9 @@ void stage_param_snow::read(const char* path) { void stage_param_snow::read(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, L"rb"); @@ -63,6 +69,9 @@ void stage_param_snow::write(const char* path) { return; char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, "wb"); if (s.check_not_null()) @@ -75,6 +84,9 @@ void stage_param_snow::write(const wchar_t* path) { return; wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/stage_param/splash.cpp b/src/KKdLib/stage_param/splash.cpp index 0d6bd046..ba1f2b64 100644 --- a/src/KKdLib/stage_param/splash.cpp +++ b/src/KKdLib/stage_param/splash.cpp @@ -28,6 +28,9 @@ stage_param_splash::~stage_param_splash() { void stage_param_splash::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, "rb"); @@ -39,6 +42,9 @@ void stage_param_splash::read(const char* path) { void stage_param_splash::read(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, L"rb"); @@ -59,6 +65,9 @@ void stage_param_splash::write(const char* path) { return; char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, "wb"); if (s.check_not_null()) @@ -71,6 +80,9 @@ void stage_param_splash::write(const wchar_t* path) { return; wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/stage_param/star.cpp b/src/KKdLib/stage_param/star.cpp index e9e974b4..07409234 100644 --- a/src/KKdLib/stage_param/star.cpp +++ b/src/KKdLib/stage_param/star.cpp @@ -78,6 +78,9 @@ stage_param_star::~stage_param_star() { void stage_param_star::read(const char* path) { char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, "rb"); @@ -89,6 +92,9 @@ void stage_param_star::read(const char* path) { void stage_param_star::read(const wchar_t* path) { wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + if (path_check_file_exists(path_txt)) { file_stream s; s.open(path_txt, L"rb"); @@ -109,6 +115,9 @@ void stage_param_star::write(const char* path) { return; char* path_txt = str_utils_add(path, ".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, "wb"); if (s.check_not_null()) @@ -121,6 +130,9 @@ void stage_param_star::write(const wchar_t* path) { return; wchar_t* path_txt = str_utils_add(path, L".txt"); + if (!path_txt) + return; + file_stream s; s.open(path_txt, L"wb"); if (s.check_not_null()) diff --git a/src/KKdLib/str_utils.cpp b/src/KKdLib/str_utils.cpp index 6b841c7c..b1a0fd19 100644 --- a/src/KKdLib/str_utils.cpp +++ b/src/KKdLib/str_utils.cpp @@ -5,7 +5,8 @@ #include "str_utils.hpp" -bool str_utils_check_ends_with(const char* str, const char* mask) { +_Check_return_ bool str_utils_check_ends_with( + _In_z_ const char* str, _In_z_ const char* mask) { if (!str || !mask) return false; @@ -23,7 +24,8 @@ bool str_utils_check_ends_with(const char* str, const char* mask) { return false; } -bool str_utils_check_ends_with(const wchar_t* str, const wchar_t* mask) { +_Check_return_ bool str_utils_check_ends_with( + _In_z_ const wchar_t* str, _In_z_ const wchar_t* mask) { if (!str || !mask) return false; @@ -41,35 +43,40 @@ bool str_utils_check_ends_with(const wchar_t* str, const wchar_t* mask) { return false; } -const char* str_utils_get_next_int32_t(const char* str, int32_t& value, const char split) { +_Check_return_ _Ret_maybenull_ const char* str_utils_get_next_int32_t( + _In_opt_z_ const char* str, _Out_ int32_t& value, _In_ const char split) { std::string s; str = str_utils_get_next_string(str, s, split); sscanf_s(s.c_str(), "%d", &value); return str; } -const wchar_t* str_utils_get_next_int32_t(const wchar_t* str, int32_t& value, const wchar_t split) { +_Check_return_ _Ret_maybenull_ const wchar_t* str_utils_get_next_int32_t( + _In_opt_z_ const wchar_t* str, _Out_ int32_t& value, _In_ const wchar_t split) { std::wstring s; str = str_utils_get_next_string(str, s, split); swscanf_s(s.c_str(), L"%d", &value); return str; } -const char* str_utils_get_next_float_t(const char* str, float_t& value, const char split) { +_Check_return_ _Ret_maybenull_ const char* str_utils_get_next_float_t( + _In_opt_z_ const char* str, _Out_ float_t& value, _In_ const char split) { std::string s; str = str_utils_get_next_string(str, s, split); sscanf_s(s.c_str(), "%f", &value); return str; } -const wchar_t* str_utils_get_next_float_t(const wchar_t* str, float_t& value, const wchar_t split) { +_Check_return_ _Ret_maybenull_ const wchar_t* str_utils_get_next_float_t( + _In_opt_z_ const wchar_t* str, _Out_ float_t& value, _In_ const wchar_t split) { std::wstring s; str = str_utils_get_next_string(str, s, split); swscanf_s(s.c_str(), L"%f", &value); return str; } -const char* str_utils_get_next_string(const char* str, std::string& value, const char split) { +_Check_return_ _Ret_maybenull_ const char* str_utils_get_next_string( + _In_opt_z_ const char* str, _Out_ std::string& value, _In_ const char split) { value.clear(); if (!str) @@ -86,7 +93,8 @@ const char* str_utils_get_next_string(const char* str, std::string& value, const return *t ? t : 0; } -const wchar_t* str_utils_get_next_string(const wchar_t* str, std::wstring& value, const wchar_t split) { +_Check_return_ _Ret_maybenull_ const wchar_t* str_utils_get_next_string( + _In_opt_z_ const wchar_t* str, _Out_ std::wstring& value, _In_ const wchar_t split) { value.clear(); if (!str) @@ -103,7 +111,8 @@ const wchar_t* str_utils_get_next_string(const wchar_t* str, std::wstring& value return *t ? t : 0; } -char* str_utils_split_get_right(const char* str, const char split) { +_Check_return_ _Ret_maybenull_ char* str_utils_split_get_right( + _In_z_ const char* str, _In_ const char split) { if (!str) return 0; @@ -119,7 +128,8 @@ char* str_utils_split_get_right(const char* str, const char split) { return p; } -wchar_t* str_utils_split_get_right(const wchar_t* str, const wchar_t split) { +_Check_return_ _Ret_maybenull_ wchar_t* str_utils_split_get_right( + _In_z_ const wchar_t* str, _In_ const wchar_t split) { if (!str) return 0; @@ -135,7 +145,8 @@ wchar_t* str_utils_split_get_right(const wchar_t* str, const wchar_t split) { return p; } -char* str_utils_split_get_left(const char* str, const char split) { +_Check_return_ _Ret_maybenull_ char* str_utils_split_get_left( + _In_z_ const char* str, _In_ const char split) { if (!str) return 0; @@ -148,7 +159,8 @@ char* str_utils_split_get_left(const char* str, const char split) { return p; } -wchar_t* str_utils_split_get_left(const wchar_t* str, const wchar_t split) { +_Check_return_ _Ret_maybenull_ wchar_t* str_utils_split_get_left( + _In_z_ const wchar_t* str, _In_ const wchar_t split) { if (!str) return 0; @@ -161,7 +173,8 @@ wchar_t* str_utils_split_get_left(const wchar_t* str, const wchar_t split) { return p; } -char* str_utils_split_get_right_include(const char* str, const char split) { +_Check_return_ _Ret_maybenull_ char* str_utils_split_get_right_include( + _In_z_ const char* str, _In_ const char split) { if (!str) return 0; @@ -176,7 +189,8 @@ char* str_utils_split_get_right_include(const char* str, const char split) { return p; } -wchar_t* str_utils_split_get_right_include(const wchar_t* str, const wchar_t split) { +_Check_return_ _Ret_maybenull_ wchar_t* str_utils_split_get_right_include( + _In_z_ const wchar_t* str, _In_ const wchar_t split) { if (!str) return 0; @@ -191,7 +205,8 @@ wchar_t* str_utils_split_get_right_include(const wchar_t* str, const wchar_t spl return p; } -char* str_utils_split_get_left_include(const char* str, const char split) { +_Check_return_ _Ret_maybenull_ char* str_utils_split_get_left_include( + _In_z_ const char* str, _In_ const char split) { if (!str) return 0; @@ -205,7 +220,8 @@ char* str_utils_split_get_left_include(const char* str, const char split) { return p; } -wchar_t* str_utils_split_get_left_include(const wchar_t* str, const wchar_t split) { +_Check_return_ _Ret_maybenull_ wchar_t* str_utils_split_get_left_include( + _In_z_ const wchar_t* str, _In_ const wchar_t split) { if (!str) return 0; @@ -219,7 +235,8 @@ wchar_t* str_utils_split_get_left_include(const wchar_t* str, const wchar_t spli return p; } -char* str_utils_split_right_get_right(const char* str, const char split) { +_Check_return_ _Ret_maybenull_ char* str_utils_split_right_get_right( + _In_z_ const char* str, _In_ const char split) { if (!str) return 0; @@ -235,7 +252,8 @@ char* str_utils_split_right_get_right(const char* str, const char split) { return p; } -wchar_t* str_utils_split_right_get_right(const wchar_t* str, const wchar_t split) { +_Check_return_ _Ret_maybenull_ wchar_t* str_utils_split_right_get_right( + _In_z_ const wchar_t* str, _In_ const wchar_t split) { if (!str) return 0; @@ -251,7 +269,8 @@ wchar_t* str_utils_split_right_get_right(const wchar_t* str, const wchar_t split return p; } -char* str_utils_split_right_get_left(const char* str, const char split) { +_Check_return_ _Ret_maybenull_ char* str_utils_split_right_get_left( + _In_z_ const char* str, _In_ const char split) { if (!str) return 0; @@ -264,7 +283,8 @@ char* str_utils_split_right_get_left(const char* str, const char split) { return p; } -wchar_t* str_utils_split_right_get_left(const wchar_t* str, const wchar_t split) { +_Check_return_ _Ret_maybenull_ wchar_t* str_utils_split_right_get_left( + _In_z_ const wchar_t* str, _In_ const wchar_t split) { if (!str) return 0; @@ -277,7 +297,8 @@ wchar_t* str_utils_split_right_get_left(const wchar_t* str, const wchar_t split) return p; } -char* str_utils_split_right_get_right_include(const char* str, const char split) { +_Check_return_ _Ret_maybenull_ char* str_utils_split_right_get_right_include( + _In_z_ const char* str, _In_ const char split) { if (!str) return 0; @@ -292,7 +313,8 @@ char* str_utils_split_right_get_right_include(const char* str, const char split) return p; } -wchar_t* str_utils_split_right_get_right_include(const wchar_t* str, const wchar_t split) { +_Check_return_ _Ret_maybenull_ wchar_t* str_utils_split_right_get_right_include( + _In_z_ const wchar_t* str, _In_ const wchar_t split) { if (!str) return 0; @@ -307,7 +329,8 @@ wchar_t* str_utils_split_right_get_right_include(const wchar_t* str, const wchar return p; } -char* str_utils_split_right_get_left_include(const char* str, const char split) { +_Check_return_ _Ret_maybenull_ char* str_utils_split_right_get_left_include( + _In_z_ const char* str, _In_ const char split) { if (!str) return 0; @@ -322,7 +345,8 @@ char* str_utils_split_right_get_left_include(const char* str, const char split) return p; } -wchar_t* str_utils_split_right_get_left_include(const wchar_t* str, const wchar_t split) { +_Check_return_ _Ret_maybenull_ wchar_t* str_utils_split_right_get_left_include( + _In_z_ const wchar_t* str, _In_ const wchar_t split) { if (!str) return 0; @@ -337,7 +361,8 @@ wchar_t* str_utils_split_right_get_left_include(const wchar_t* str, const wchar_ return p; } -char* str_utils_get_extension(const char* str) { +_Check_return_ _Ret_maybenull_ char* str_utils_get_extension( + _In_z_ const char* str) { if (!str) return 0; @@ -345,7 +370,8 @@ char* str_utils_get_extension(const char* str) { return str_utils_split_right_get_right_include(t ? t + 1 : str, '.'); } -wchar_t* str_utils_get_extension(const wchar_t* str) { +_Check_return_ _Ret_maybenull_ wchar_t* str_utils_get_extension( + _In_z_ const wchar_t* str) { if (!str) return 0; @@ -353,7 +379,8 @@ wchar_t* str_utils_get_extension(const wchar_t* str) { return str_utils_split_right_get_right_include(t ? t + 1 : str, L'.'); } -char* str_utils_get_without_extension(const char* str) { +_Check_return_ _Ret_maybenull_ char* str_utils_get_without_extension( + _In_z_ const char* str) { if (!str) return 0; @@ -361,7 +388,8 @@ char* str_utils_get_without_extension(const char* str) { return str_utils_split_right_get_left(t ? t + 1 : str, '.'); } -wchar_t* str_utils_get_without_extension(const wchar_t* str) { +_Check_return_ _Ret_maybenull_ wchar_t* str_utils_get_without_extension( + _In_z_ const wchar_t* str) { if (!str) return 0; @@ -369,7 +397,8 @@ wchar_t* str_utils_get_without_extension(const wchar_t* str) { return str_utils_split_right_get_left(t ? t + 1 : str, L'.'); } -char* str_utils_add(const char* str0, const char* str1) { +_Check_return_ _Ret_maybenull_ char* str_utils_add( + _In_z_ const char* str0, _In_z_ const char* str1) { if (str0 && str1) { size_t str0_len = utf8_length(str0); size_t str1_len = utf8_length(str1); @@ -386,7 +415,8 @@ char* str_utils_add(const char* str0, const char* str1) { return 0; } -wchar_t* str_utils_add(const wchar_t* str0, const wchar_t* str1) { +_Check_return_ _Ret_maybenull_ wchar_t* str_utils_add( + _In_z_ const wchar_t* str0, _In_z_ const wchar_t* str1) { if (str0 && str1) { size_t str0_len = utf16_length(str0); size_t str1_len = utf16_length(str1); @@ -403,7 +433,8 @@ wchar_t* str_utils_add(const wchar_t* str0, const wchar_t* str1) { return 0; } -char* str_utils_copy(const char* str) { +_Check_return_ _Ret_maybenull_ char* str_utils_copy( + _In_z_ const char* str) { if (!str) return 0; @@ -413,7 +444,8 @@ char* str_utils_copy(const char* str) { return p; } -wchar_t* str_utils_copy(const wchar_t* str) { +_Check_return_ _Ret_maybenull_ wchar_t* str_utils_copy( + _In_z_ const wchar_t* str) { if (!str) return 0; @@ -423,7 +455,8 @@ wchar_t* str_utils_copy(const wchar_t* str) { return p; } -inline int32_t str_utils_compare_length(const char* str0, size_t str0_len, const char* str1, size_t str1_len) { +_Check_return_ int32_t str_utils_compare_length( + _In_z_ const char* str0, _In_ size_t str0_len, _In_z_ const char* str1, _In_ size_t str1_len) { if (!str0_len) return -*str1; else if (!str1_len) @@ -460,7 +493,8 @@ inline int32_t str_utils_compare_length(const char* str0, size_t str0_len, const return c0 - c1; } -inline int32_t str_utils_compare_length(const wchar_t* str0, size_t str0_len, const wchar_t* str1, size_t str1_len) { +_Check_return_ int32_t str_utils_compare_length( + _In_z_ const wchar_t* str0, _In_ size_t str0_len, _In_z_ const wchar_t* str1, _In_ size_t str1_len) { if (!str0_len) return -*str1; else if (!str1_len) @@ -497,8 +531,9 @@ inline int32_t str_utils_compare_length(const wchar_t* str0, size_t str0_len, co return c0 - c1; } -size_t str_utils_get_substring_offset(const char* str0, size_t str0_len, - size_t str0_off, const char* str1, size_t str1_len) { +_Check_return_ size_t str_utils_get_substring_offset( + _In_z_ const char* str0, _In_ size_t str0_len, _In_ size_t str0_off, + _In_z_ const char* str1, _In_ size_t str1_len) { if (!str1_len && str0_off <= str0_len) return str0_off; @@ -520,8 +555,9 @@ size_t str_utils_get_substring_offset(const char* str0, size_t str0_len, return -1; } -size_t str_utils_get_substring_offset(const wchar_t* str0, size_t str0_len, - size_t str0_off, const wchar_t* str1, size_t str1_len) { +_Check_return_ size_t str_utils_get_substring_offset( + _In_z_ const wchar_t* str0, _In_ size_t str0_len, _In_ size_t str0_off, + _In_z_ const wchar_t* str1, _In_ size_t str1_len) { if (!str1_len && str0_off <= str0_len) return str0_off; @@ -543,17 +579,18 @@ size_t str_utils_get_substring_offset(const wchar_t* str0, size_t str0_len, return -1; } -bool str_utils_text_file_parse(const void* data, size_t size, - char*& buf, char**& lines, size_t& count) { +_Check_return_ bool str_utils_text_file_parse( + _In_ const void* data, _In_ size_t size, _Out_ char*& buf, _Out_ char**& lines, _Out_ size_t& count) { + buf = 0; + lines = 0; + count = 0; + if (!data || !size) return false; const char* d = (const char*)data; bool del = false; size_t c; - buf = 0; - lines = 0; - count = 0; if ((uint8_t)d[0] == 0x00) return false; else if (d[0] == 0xFF) { diff --git a/src/KKdLib/str_utils.hpp b/src/KKdLib/str_utils.hpp index 16ce8b04..d34fc622 100644 --- a/src/KKdLib/str_utils.hpp +++ b/src/KKdLib/str_utils.hpp @@ -9,51 +9,87 @@ #include #include "default.hpp" -inline int32_t str_utils_compare(const char* str0, const char* str1) { +inline _Check_return_ int32_t str_utils_compare(_In_z_ const char* str0, _In_z_ const char* str1) { return strcmp(str0, str1); } -inline int32_t str_utils_compare(const wchar_t* str0, const wchar_t* str1) { +inline _Check_return_ int32_t str_utils_compare(_In_z_ const wchar_t* str0, _In_z_ const wchar_t* str1) { return wcscmp(str0, str1); } -extern bool str_utils_check_ends_with(const char* str, const char* mask); -extern bool str_utils_check_ends_with(const wchar_t* str, const wchar_t* mask); -extern const char* str_utils_get_next_int32_t(const char* str, int32_t& value, const char split); -extern const wchar_t* str_utils_get_next_int32_t(const wchar_t* str, int32_t& value, const wchar_t split); -extern const char* str_utils_get_next_float_t(const char* str, float_t& value, const char split); -extern const wchar_t* str_utils_get_next_float_t(const wchar_t* str, float_t& value, const wchar_t split); -extern const char* str_utils_get_next_string(const char* str, std::string& value, const char split); -extern const wchar_t* str_utils_get_next_string(const wchar_t* str, std::wstring& value, const wchar_t split); -extern char* str_utils_split_get_right(const char* str, const char split); -extern wchar_t* str_utils_split_get_right(const wchar_t* str, const wchar_t split); -extern char* str_utils_split_get_left(const char* str, const char split); -extern wchar_t* str_utils_split_get_left(const wchar_t* str, const wchar_t split); -extern char* str_utils_split_get_right_include(const char* str, const char split); -extern wchar_t* str_utils_split_get_right_include(const wchar_t* str, const wchar_t split); -extern char* str_utils_split_get_left_include(const char* str, const char split); -extern wchar_t* str_utils_split_get_left_include(const wchar_t* str, const wchar_t split); -extern char* str_utils_split_right_get_right(const char* str, const char split); -extern wchar_t* str_utils_split_right_get_right(const wchar_t* str, const wchar_t split); -extern char* str_utils_split_right_get_left(const char* str, const char split); -extern wchar_t* str_utils_split_right_get_left(const wchar_t* str, const wchar_t split); -extern char* str_utils_split_right_get_right_include(const char* str, const char split); -extern wchar_t* str_utils_split_right_get_right_include(const wchar_t* str, const wchar_t split); -extern char* str_utils_split_right_get_left_include(const char* str, const char split); -extern wchar_t* str_utils_split_right_get_left_include(const wchar_t* str, const wchar_t split); -extern char* str_utils_get_extension(const char* str); -extern wchar_t* str_utils_get_extension(const wchar_t* str); -extern char* str_utils_get_without_extension(const char* str); -extern wchar_t* str_utils_get_without_extension(const wchar_t* str); -extern char* str_utils_add(const char* str0, const char* str1); -extern wchar_t* str_utils_add(const wchar_t* str0, const wchar_t* str1); -extern char* str_utils_copy(const char* str); -extern wchar_t* str_utils_copy(const wchar_t* str); -extern int32_t str_utils_compare_length(const char* str0, size_t str0_len, const char* str1, size_t str1_len); -extern int32_t str_utils_compare_length(const wchar_t* str0, size_t str0_len, const wchar_t* str1, size_t str1_len); -extern size_t str_utils_get_substring_offset(const char* str0, size_t str0_len, - size_t str0_off, const char* str1, size_t str1_len); -extern size_t str_utils_get_substring_offset(const wchar_t* str0, size_t str0_len, - size_t str0_off, const wchar_t* str1, size_t str1_len); -extern bool str_utils_text_file_parse(const void* data, size_t size, - char*& buf, char**& lines, size_t& count); +extern _Check_return_ bool str_utils_check_ends_with( + _In_z_ const char* str, _In_z_ const char* mask); +extern _Check_return_ bool str_utils_check_ends_with( + _In_z_ const wchar_t* str, _In_z_ const wchar_t* mask); +extern _Check_return_ _Ret_maybenull_ const char* str_utils_get_next_int32_t( + _In_opt_z_ const char* str, _Out_ int32_t& value, _In_ const char split); +extern _Check_return_ _Ret_maybenull_ const wchar_t* str_utils_get_next_int32_t( + _In_opt_z_ const wchar_t* str, _Out_ int32_t& value, _In_ const wchar_t split); +extern _Check_return_ _Ret_maybenull_ const char* str_utils_get_next_float_t( + _In_opt_z_ const char* str, _Out_ float_t& value, _In_ const char split); +extern _Check_return_ _Ret_maybenull_ const wchar_t* str_utils_get_next_float_t( + _In_opt_z_ const wchar_t* str, _Out_ float_t& value, _In_ const wchar_t split); +extern _Check_return_ _Ret_maybenull_ const char* str_utils_get_next_string( + _In_opt_z_ const char* str, _Out_ std::string& value, _In_ const char split); +extern _Check_return_ _Ret_maybenull_ const wchar_t* str_utils_get_next_string( + _In_opt_z_ const wchar_t* str, _Out_ std::wstring& value, _In_ const wchar_t split); +extern _Check_return_ _Ret_maybenull_ char* str_utils_split_get_right( + _In_z_ const char* str, _In_ const char split); +extern _Check_return_ _Ret_maybenull_ wchar_t* str_utils_split_get_right( + _In_z_ const wchar_t* str, _In_ const wchar_t split); +extern _Check_return_ _Ret_maybenull_ char* str_utils_split_get_left( + _In_z_ const char* str, _In_ const char split); +extern _Check_return_ _Ret_maybenull_ wchar_t* str_utils_split_get_left( + _In_z_ const wchar_t* str, _In_ const wchar_t split); +extern _Check_return_ _Ret_maybenull_ char* str_utils_split_get_right_include( + _In_z_ const char* str, _In_ const char split); +extern _Check_return_ _Ret_maybenull_ wchar_t* str_utils_split_get_right_include( + _In_z_ const wchar_t* str, _In_ const wchar_t split); +extern _Check_return_ _Ret_maybenull_ char* str_utils_split_get_left_include( + _In_z_ const char* str, _In_ const char split); +extern _Check_return_ _Ret_maybenull_ wchar_t* str_utils_split_get_left_include( + _In_z_ const wchar_t* str, _In_ const wchar_t split); +extern _Check_return_ _Ret_maybenull_ char* str_utils_split_right_get_right( + _In_z_ const char* str, _In_ const char split); +extern _Check_return_ _Ret_maybenull_ wchar_t* str_utils_split_right_get_right( + _In_z_ const wchar_t* str, _In_ const wchar_t split); +extern _Check_return_ _Ret_maybenull_ char* str_utils_split_right_get_left( + _In_z_ const char* str, _In_ const char split); +extern _Check_return_ _Ret_maybenull_ wchar_t* str_utils_split_right_get_left( + _In_z_ const wchar_t* str, _In_ const wchar_t split); +extern _Check_return_ _Ret_maybenull_ char* str_utils_split_right_get_right_include( + _In_z_ const char* str, _In_ const char split); +extern _Check_return_ _Ret_maybenull_ wchar_t* str_utils_split_right_get_right_include( + _In_z_ const wchar_t* str, _In_ const wchar_t split); +extern _Check_return_ _Ret_maybenull_ char* str_utils_split_right_get_left_include( + _In_z_ const char* str, _In_ const char split); +extern _Check_return_ _Ret_maybenull_ wchar_t* str_utils_split_right_get_left_include( + _In_z_ const wchar_t* str, _In_ const wchar_t split); +extern _Check_return_ _Ret_maybenull_ char* str_utils_get_extension( + _In_z_ const char* str); +extern _Check_return_ _Ret_maybenull_ wchar_t* str_utils_get_extension( + _In_z_ const wchar_t* str); +extern _Check_return_ _Ret_maybenull_ char* str_utils_get_without_extension( + _In_z_ const char* str); +extern _Check_return_ _Ret_maybenull_ wchar_t* str_utils_get_without_extension( + _In_z_ const wchar_t* str); +extern _Check_return_ _Ret_maybenull_ char* str_utils_add( + _In_z_ const char* str0, _In_z_ const char* str1); +extern _Check_return_ _Ret_maybenull_ wchar_t* str_utils_add( + _In_z_ const wchar_t* str0, _In_z_ const wchar_t* str1); +extern _Check_return_ _Ret_maybenull_ char* str_utils_copy( + _In_z_ const char* str); +extern _Check_return_ _Ret_maybenull_ wchar_t* str_utils_copy( + _In_z_ const wchar_t* str); +extern _Check_return_ int32_t str_utils_compare_length( + _In_z_ const char* str0, _In_ size_t str0_len, _In_z_ const char* str1, _In_ size_t str1_len); +extern _Check_return_ int32_t str_utils_compare_length( + _In_z_ const wchar_t* str0, _In_ size_t str0_len, _In_z_ const wchar_t* str1, _In_ size_t str1_len); +extern _Check_return_ size_t str_utils_get_substring_offset( + _In_z_ const char* str0, _In_ size_t str0_len, _In_ size_t str0_off, + _In_z_ const char* str1, _In_ size_t str1_len); +extern _Check_return_ size_t str_utils_get_substring_offset( + _In_z_ const wchar_t* str0, _In_ size_t str0_len, _In_ size_t str0_off, + _In_z_ const wchar_t* str1, _In_ size_t str1_len); +extern _Check_return_ bool str_utils_text_file_parse( + _In_ const void* data, _In_ size_t size, _Out_ char*& buf, _Out_ char**& lines, _Out_ size_t& count); diff --git a/src/ReDIVA/data_edit/glitter_editor.cpp b/src/ReDIVA/data_edit/glitter_editor.cpp index 97412ebf..d0f3a759 100644 --- a/src/ReDIVA/data_edit/glitter_editor.cpp +++ b/src/ReDIVA/data_edit/glitter_editor.cpp @@ -1457,7 +1457,7 @@ static void glitter_editor_open_window(GlitterEditor* glt_edt) { ofn.lpstrTitle = L"File to Open"; if (GetOpenFileNameW(&ofn)) { char* file_temp = utf16_to_utf8(file); - glt_edt->file.assign(file_temp); + glt_edt->file.assign(file_temp ? file_temp : ""); free_def(file_temp); glt_edt->load_popup = true; } @@ -1491,7 +1491,8 @@ static void glitter_editor_save_as_window(GlitterEditor* glt_edt) { ofn.Flags = OFN_NONETWORKBUTTON; if (GetSaveFileNameW(&ofn)) { char* file_temp = utf16_to_utf8(file); - glt_edt->file.assign(file_temp); + if (file_temp) + glt_edt->file.assign(file_temp); free_def(file_temp); glitter_editor_save(glt_edt); } @@ -1568,7 +1569,7 @@ static void glitter_editor_load_file(GlitterEditor* glt_edt, const char* path, c if (elem != hashes.end()) e->name.assign(elem->second); else { - printf_debug("Couldn't find name for hash 0x%08X\n", e->data.name_hash); + printf_debug("Couldn't find name for hash 0x%08X\n", (uint32_t)e->data.name_hash); load_success = false; } } @@ -1595,7 +1596,7 @@ static void glitter_editor_load_file(GlitterEditor* glt_edt, const char* path, c if (elem != hashes.end()) e->name.assign(elem->second); else { - printf_debug("Couldn't find name for hash 0x%016X\n", e->data.name_hash); + printf_debug("Couldn't find name for hash 0x%016llX\n", e->data.name_hash); load_success = false; } } diff --git a/src/ReDIVA/data_test/glitter_test.cpp b/src/ReDIVA/data_test/glitter_test.cpp index bee6bc69..4116fda7 100644 --- a/src/ReDIVA/data_test/glitter_test.cpp +++ b/src/ReDIVA/data_test/glitter_test.cpp @@ -187,20 +187,20 @@ void TaskDataTestGlitterParticle::disp() { disp = Glitter::glt_particle_manager->GetDispCount(Glitter::PARTICLE_QUAD); ctrl = Glitter::glt_particle_manager->GetCtrlCount(Glitter::PARTICLE_QUAD); - print_work.printf_align_left(" Quad: ctrl%d, disp%d\n", disp, ctrl); + print_work.printf_align_left(" Quad: ctrl%d, disp%d\n", (uint32_t)disp, (uint32_t)ctrl); disp = Glitter::glt_particle_manager->GetDispCount(Glitter::PARTICLE_LOCUS); ctrl = Glitter::glt_particle_manager->GetCtrlCount(Glitter::PARTICLE_LOCUS); - print_work.printf_align_left("Locus: ctrl%d, disp%d\n", disp, ctrl); + print_work.printf_align_left("Locus: ctrl%d, disp%d\n", (uint32_t)disp, (uint32_t)ctrl); disp = Glitter::glt_particle_manager->GetDispCount(Glitter::PARTICLE_LINE); ctrl = Glitter::glt_particle_manager->GetCtrlCount(Glitter::PARTICLE_LINE); - print_work.printf_align_left(" Line: ctrl%d, disp%d\n", disp, ctrl); + print_work.printf_align_left(" Line: ctrl%d, disp%d\n", (uint32_t)disp, (uint32_t)ctrl); // Added disp = Glitter::glt_particle_manager->GetDispCount(Glitter::PARTICLE_MESH); ctrl = Glitter::glt_particle_manager->GetCtrlCount(Glitter::PARTICLE_MESH); - print_work.printf_align_left(" Mesh: ctrl%d, disp%d\n", disp, ctrl); + print_work.printf_align_left(" Mesh: ctrl%d, disp%d\n", (uint32_t)disp, (uint32_t)ctrl); } diff --git a/src/ReDIVA/imgui_helper.cpp b/src/ReDIVA/imgui_helper.cpp index 35e673de..2ab8d323 100644 --- a/src/ReDIVA/imgui_helper.cpp +++ b/src/ReDIVA/imgui_helper.cpp @@ -64,11 +64,11 @@ namespace ImGui { char* label_temp = str_utils_copy(label); char* temp; - if (temp = strstr(label_temp, "##")) + if (label_temp && (temp = strstr(label_temp, "##"))) *temp = 0; TableNextColumn(); GetContentRegionAvailSetNextItemWidth(); - Text(label_temp); + Text(label_temp ? label_temp : ""); if (label_temp) free(label_temp); @@ -314,12 +314,12 @@ namespace ImGui { char* label_temp = str_utils_copy(label); char* temp; - if (temp = strstr(label_temp, "##")) + if (label_temp && (temp = strstr(label_temp, "##"))) *temp = 0; TableNextColumn(); GetContentRegionAvailSetNextItemWidth(); DisableElementPush(enable); - Text(label_temp); + Text(label_temp ? label_temp : ""); DisableElementPop(enable); if (label_temp) free(label_temp); diff --git a/src/ReDIVA/print_work.cpp b/src/ReDIVA/print_work.cpp index 09393ba3..28ff51f6 100644 --- a/src/ReDIVA/print_work.cpp +++ b/src/ReDIVA/print_work.cpp @@ -330,9 +330,12 @@ vec2 PrintWork::GetTextSize(const char* str, size_t length) { vec2 PrintWork::GetTextSize(const char* str_begin, const char* str_end) { wchar_t* wstr = utf8_to_utf16(str_begin, str_end - str_begin); - vec2 size = GetTextSize(wstr, wstr + utf16_length(wstr)); - free_def(wstr); - return size; + if (wstr) { + vec2 size = GetTextSize(wstr, wstr + utf16_length(wstr)); + free_def(wstr); + return size; + } + return 0.0f; } vec2 PrintWork::GetTextSize(const std::wstring& str) { @@ -348,14 +351,18 @@ void PrintWork::NewLine() { void PrintWork::PrintText(app::text_flags flags, const char* str) { wchar_t* wstr = utf8_to_utf16(str); - PrintText(flags, wstr, wstr + utf16_length(wstr)); - free_def(wstr); + if (wstr) { + PrintText(flags, wstr, wstr + utf16_length(wstr)); + free_def(wstr); + } } void PrintWork::PrintText(app::text_flags flags, const char* str, size_t length) { wchar_t* wstr = utf8_to_utf16(str, length); - PrintText(flags, wstr, wstr + utf16_length(wstr)); - free_def(wstr); + if (wstr) { + PrintText(flags, wstr, wstr + utf16_length(wstr)); + free_def(wstr); + } } void PrintWork::PrintText(app::text_flags flags, const wchar_t* str_begin, const wchar_t* str_end) { diff --git a/src/ReDIVA/x_pv_game.cpp b/src/ReDIVA/x_pv_game.cpp index e15bcafb..db4cf3f5 100644 --- a/src/ReDIVA/x_pv_game.cpp +++ b/src/ReDIVA/x_pv_game.cpp @@ -13078,7 +13078,8 @@ static void x_pv_game_write_glitter(Glitter::EffectGroup* eff_group, const auth_ char path_buf[0x1000]; memcpy(path_buf, dir, dir_len); - memcpy(path_buf + dir_len, file, file_len + 1); + memcpy(path_buf + dir_len, file, file_len); + path_buf[dir_len + file_len] = 0; if (!path_check_file_exists(path_buf)) return false; @@ -13161,7 +13162,7 @@ static void x_pv_game_write_glitter(Glitter::EffectGroup* eff_group, const auth_ if (elem != x_data->glitter_list_murmurhash.end()) e->name.assign(elem->second); else { - printf_debug("Couldn't find name for hash 0x%08X\n", e->data.name_hash); + printf_debug("Couldn't find name for hash 0x%08X\n", (uint32_t)e->data.name_hash); continue; } }