Update library directories and improve string handling in source files

- Added 'absl::numeric' to the AdditionalLibraryDirectories in yaze.vcxproj for enhanced functionality.
- Refactored string handling in multiple source files to use std::strncpy for safer string copying and prevent buffer overflows.
- Cleaned up unnecessary whitespace and improved code readability across various files.
This commit is contained in:
scawful
2025-09-27 21:55:01 -04:00
parent a9f1a1637d
commit 332f050cf6
6 changed files with 73 additions and 58 deletions

View File

@@ -276,7 +276,7 @@ std::vector<std::string> FileDialogWrapper::GetSubdirectoriesInFolder(
if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if (strcmp(findFileData.cFileName, ".") != 0 && if (strcmp(findFileData.cFileName, ".") != 0 &&
strcmp(findFileData.cFileName, "..") != 0) { strcmp(findFileData.cFileName, "..") != 0) {
subdirectories.push_back(findFileData.cFileName); subdirectories.emplace_back(findFileData.cFileName);
} }
} }
} while (FindNextFile(hFind, &findFileData) != 0); } while (FindNextFile(hFind, &findFileData) != 0);
@@ -293,7 +293,7 @@ std::vector<std::string> FileDialogWrapper::GetFilesInFolder(
if (hFind != INVALID_HANDLE_VALUE) { if (hFind != INVALID_HANDLE_VALUE) {
do { do {
if (!(findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { if (!(findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) {
files.push_back(findFileData.cFileName); files.emplace_back(findFileData.cFileName);
} }
} while (FindNextFile(hFind, &findFileData) != 0); } while (FindNextFile(hFind, &findFileData) != 0);
FindClose(hFind); FindClose(hFind);

View File

@@ -1,6 +1,7 @@
#include "dungeon_object_selector.h" #include "dungeon_object_selector.h"
#include <iterator> #include <iterator>
#include <cstring>
#include "app/core/window.h" #include "app/core/window.h"
#include "app/gfx/arena.h" #include "app/gfx/arena.h"
@@ -1045,7 +1046,8 @@ void DungeonObjectSelector::DrawCompactPropertiesEditor() {
static int music_id = 0; static int music_id = 0;
// Copy current values // Copy current values
strncpy(room_name, properties.name.c_str(), sizeof(room_name) - 1); std::strncpy(room_name, properties.name.c_str(), sizeof(room_name) - 1);
room_name[sizeof(room_name) - 1] = '\0';
dungeon_id = properties.dungeon_id; dungeon_id = properties.dungeon_id;
floor_level = properties.floor_level; floor_level = properties.floor_level;
is_boss_room = properties.is_boss_room; is_boss_room = properties.is_boss_room;

View File

@@ -1,6 +1,7 @@
#include "editor_manager.h" #include "editor_manager.h"
#include <chrono> #include <chrono>
#include <cstring>
#include "absl/status/status.h" #include "absl/status/status.h"
#include "absl/strings/match.h" #include "absl/strings/match.h"
@@ -2253,7 +2254,8 @@ void EditorManager::DrawSessionSwitcher() {
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Rename")) { if (ImGui::Button("Rename")) {
session_to_rename_ = i; session_to_rename_ = i;
strncpy(session_rename_buffer_, session.GetDisplayName().c_str(), sizeof(session_rename_buffer_) - 1); std::strncpy(session_rename_buffer_, session.GetDisplayName().c_str(), sizeof(session_rename_buffer_) - 1);
session_rename_buffer_[sizeof(session_rename_buffer_) - 1] = '\0';
show_session_rename_dialog_ = true; show_session_rename_dialog_ = true;
} }
@@ -2429,7 +2431,8 @@ void EditorManager::DrawSessionManager() {
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Rename")) { if (ImGui::Button("Rename")) {
session_to_rename_ = i; session_to_rename_ = i;
strncpy(session_rename_buffer_, session.GetDisplayName().c_str(), sizeof(session_rename_buffer_) - 1); std::strncpy(session_rename_buffer_, session.GetDisplayName().c_str(), sizeof(session_rename_buffer_) - 1);
session_rename_buffer_[sizeof(session_rename_buffer_) - 1] = '\0';
show_session_rename_dialog_ = true; show_session_rename_dialog_ = true;
} }

View File

@@ -4,6 +4,7 @@
#include <fstream> #include <fstream>
#include <set> #include <set>
#include <sstream> #include <sstream>
#include <cstring>
#include "absl/strings/str_format.h" #include "absl/strings/str_format.h"
#include "absl/strings/str_split.h" #include "absl/strings/str_split.h"
@@ -1777,9 +1778,12 @@ void ThemeManager::ShowSimpleThemeEditor(bool* p_open) {
ImGui::SameLine(); ImGui::SameLine();
if (ImGui::Button("Reset to Current")) { if (ImGui::Button("Reset to Current")) {
edit_theme = current_theme_; edit_theme = current_theme_;
strncpy(theme_name, current_theme_.name.c_str(), sizeof(theme_name)); std::strncpy(theme_name, current_theme_.name.c_str(), sizeof(theme_name) - 1);
strncpy(theme_description, current_theme_.description.c_str(), sizeof(theme_description)); theme_name[sizeof(theme_name) - 1] = '\0';
strncpy(theme_author, current_theme_.author.c_str(), sizeof(theme_author)); std::strncpy(theme_description, current_theme_.description.c_str(), sizeof(theme_description) - 1);
theme_description[sizeof(theme_description) - 1] = '\0';
std::strncpy(theme_author, current_theme_.author.c_str(), sizeof(theme_author) - 1);
theme_author[sizeof(theme_author) - 1] = '\0';
// Reset backup state since we're back to current theme // Reset backup state since we're back to current theme
if (theme_backup_made) { if (theme_backup_made) {

View File

@@ -1,9 +1,9 @@
#include "yaze.h" #include "yaze.h"
#include <cstring>
#include <iostream> #include <iostream>
#include <memory> #include <memory>
#include <sstream> #include <sstream>
#include <cstring>
#include <stdexcept> #include <stdexcept>
#include "app/core/controller.h" #include "app/core/controller.h"
@@ -21,7 +21,7 @@ DEFINE_FLAG(std::string, rom_file, "",
// Static variables for library state // Static variables for library state
static bool g_library_initialized = false; static bool g_library_initialized = false;
int yaze_app_main(int argc, char **argv) { int yaze_app_main(int argc, char** argv) {
yaze::util::FlagParser parser(yaze::util::global_flag_registry()); yaze::util::FlagParser parser(yaze::util::global_flag_registry());
RETURN_IF_EXCEPTION(parser.Parse(argc, argv)); RETURN_IF_EXCEPTION(parser.Parse(argc, argv));
std::string rom_filename = ""; std::string rom_filename = "";
@@ -191,10 +191,7 @@ int yaze_save_rom(zelda3_rom* rom, const char* filename) {
auto* internal_rom = static_cast<yaze::Rom*>(rom->impl); auto* internal_rom = static_cast<yaze::Rom*>(rom->impl);
auto status = internal_rom->SaveToFile(yaze::Rom::SaveSettings{ auto status = internal_rom->SaveToFile(yaze::Rom::SaveSettings{
.backup = true, .backup = true, .save_new = false, .filename = filename});
.save_new = false,
.filename = filename
});
if (!status.ok()) { if (!status.ok()) {
return YAZE_ERROR_IO; return YAZE_ERROR_IO;
@@ -204,7 +201,7 @@ int yaze_save_rom(zelda3_rom* rom, const char* filename) {
return YAZE_OK; return YAZE_OK;
} }
yaze_bitmap yaze_load_bitmap(const char *filename) { yaze_bitmap yaze_load_bitmap(const char* filename) {
yaze_bitmap bitmap; yaze_bitmap bitmap;
bitmap.width = 0; bitmap.width = 0;
bitmap.height = 0; bitmap.height = 0;
@@ -213,7 +210,7 @@ yaze_bitmap yaze_load_bitmap(const char *filename) {
return bitmap; return bitmap;
} }
snes_color yaze_get_color_from_paletteset(const zelda3_rom *rom, snes_color yaze_get_color_from_paletteset(const zelda3_rom* rom,
int palette_set, int palette, int palette_set, int palette,
int color) { int color) {
snes_color color_struct; snes_color color_struct;
@@ -222,7 +219,7 @@ snes_color yaze_get_color_from_paletteset(const zelda3_rom *rom,
color_struct.blue = 0; color_struct.blue = 0;
if (rom->impl) { if (rom->impl) {
yaze::Rom *internal_rom = static_cast<yaze::Rom *>(rom->impl); yaze::Rom* internal_rom = static_cast<yaze::Rom*>(rom->impl);
auto get_color = auto get_color =
internal_rom->palette_group() internal_rom->palette_group()
.get_group(yaze::gfx::kPaletteGroupAddressesKeys[palette_set]) .get_group(yaze::gfx::kPaletteGroupAddressesKeys[palette_set])
@@ -235,21 +232,21 @@ snes_color yaze_get_color_from_paletteset(const zelda3_rom *rom,
return color_struct; return color_struct;
} }
zelda3_overworld *yaze_load_overworld(const zelda3_rom *rom) { zelda3_overworld* yaze_load_overworld(const zelda3_rom* rom) {
if (rom->impl == nullptr) { if (rom->impl == nullptr) {
return nullptr; return nullptr;
} }
yaze::Rom *internal_rom = static_cast<yaze::Rom *>(rom->impl); yaze::Rom* internal_rom = static_cast<yaze::Rom*>(rom->impl);
auto internal_overworld = new yaze::zelda3::Overworld(internal_rom); auto internal_overworld = new yaze::zelda3::Overworld(internal_rom);
if (!internal_overworld->Load(internal_rom).ok()) { if (!internal_overworld->Load(internal_rom).ok()) {
return nullptr; return nullptr;
} }
zelda3_overworld *overworld = new zelda3_overworld(); zelda3_overworld* overworld = new zelda3_overworld();
overworld->impl = internal_overworld; overworld->impl = internal_overworld;
int map_id = 0; int map_id = 0;
for (const auto &ow_map : internal_overworld->overworld_maps()) { for (const auto& ow_map : internal_overworld->overworld_maps()) {
overworld->maps[map_id] = new zelda3_overworld_map(); overworld->maps[map_id] = new zelda3_overworld_map();
overworld->maps[map_id]->id = map_id; overworld->maps[map_id]->id = map_id;
map_id++; map_id++;
@@ -257,16 +254,17 @@ zelda3_overworld *yaze_load_overworld(const zelda3_rom *rom) {
return overworld; return overworld;
} }
zelda3_dungeon_room *yaze_load_all_rooms(const zelda3_rom *rom) { zelda3_dungeon_room* yaze_load_all_rooms(const zelda3_rom* rom) {
if (rom->impl == nullptr) { if (rom->impl == nullptr) {
return nullptr; return nullptr;
} }
yaze::Rom *internal_rom = static_cast<yaze::Rom *>(rom->impl); yaze::Rom* internal_rom = static_cast<yaze::Rom*>(rom->impl);
zelda3_dungeon_room *rooms = new zelda3_dungeon_room[256]; zelda3_dungeon_room* rooms = new zelda3_dungeon_room[256];
return rooms; return rooms;
} }
yaze_status yaze_load_messages(const zelda3_rom* rom, zelda3_message** messages, int* message_count) { yaze_status yaze_load_messages(const zelda3_rom* rom, zelda3_message** messages,
int* message_count) {
if (rom == nullptr || messages == nullptr || message_count == nullptr) { if (rom == nullptr || messages == nullptr || message_count == nullptr) {
return YAZE_ERROR_INVALID_ARG; return YAZE_ERROR_INVALID_ARG;
} }
@@ -294,7 +292,9 @@ yaze_status yaze_load_messages(const zelda3_rom* rom, zelda3_message** messages,
std::memcpy((*messages)[i].raw_data, msg.Data.data(), msg.Data.size()); std::memcpy((*messages)[i].raw_data, msg.Data.data(), msg.Data.size());
(*messages)[i].parsed_text = new char[msg.ContentsParsed.length() + 1]; (*messages)[i].parsed_text = new char[msg.ContentsParsed.length() + 1];
std::strcpy((*messages)[i].parsed_text, msg.ContentsParsed.c_str()); std::strncpy((*messages)[i].parsed_text, msg.ContentsParsed.c_str(),
msg.ContentsParsed.length());
(*messages)[i].parsed_text[msg.ContentsParsed.length()] = '\0';
(*messages)[i].is_compressed = false; // TODO: Detect compression (*messages)[i].is_compressed = false; // TODO: Detect compression
(*messages)[i].encoding_type = 0; // TODO: Detect encoding (*messages)[i].encoding_type = 0; // TODO: Detect encoding
@@ -322,7 +322,8 @@ void yaze_free_bitmap(yaze_bitmap* bitmap) {
yaze_bitmap yaze_create_bitmap(int width, int height, uint8_t bpp) { yaze_bitmap yaze_create_bitmap(int width, int height, uint8_t bpp) {
yaze_bitmap bitmap = {}; yaze_bitmap bitmap = {};
if (width <= 0 || height <= 0 || (bpp != 1 && bpp != 2 && bpp != 4 && bpp != 8)) { if (width <= 0 || height <= 0 ||
(bpp != 1 && bpp != 2 && bpp != 4 && bpp != 8)) {
return bitmap; // Return empty bitmap on invalid args return bitmap; // Return empty bitmap on invalid args
} }
@@ -336,16 +337,20 @@ yaze_bitmap yaze_create_bitmap(int width, int height, uint8_t bpp) {
snes_color yaze_rgb_to_snes_color(uint8_t r, uint8_t g, uint8_t b) { snes_color yaze_rgb_to_snes_color(uint8_t r, uint8_t g, uint8_t b) {
snes_color color = {}; snes_color color = {};
color.red = r; // Store full 8-bit values (existing code expects this) color.red = r; // Store full 8-bit values (existing code expects this)
color.green = g; color.green = g;
color.blue = b; color.blue = b;
return color; return color;
} }
void yaze_snes_color_to_rgb(snes_color color, uint8_t* r, uint8_t* g, uint8_t* b) { void yaze_snes_color_to_rgb(snes_color color, uint8_t* r, uint8_t* g,
if (r != nullptr) *r = static_cast<uint8_t>(color.red); uint8_t* b) {
if (g != nullptr) *g = static_cast<uint8_t>(color.green); if (r != nullptr)
if (b != nullptr) *b = static_cast<uint8_t>(color.blue); *r = static_cast<uint8_t>(color.red);
if (g != nullptr)
*g = static_cast<uint8_t>(color.green);
if (b != nullptr)
*b = static_cast<uint8_t>(color.blue);
} }
// Version detection functions // Version detection functions
@@ -375,7 +380,8 @@ const char* zelda3_version_to_string(zelda3_version version) {
} }
} }
const zelda3_version_pointers* zelda3_get_version_pointers(zelda3_version version) { const zelda3_version_pointers* zelda3_get_version_pointers(
zelda3_version version) {
switch (version) { switch (version) {
case ZELDA3_VERSION_US: case ZELDA3_VERSION_US:
return &zelda3_us_pointers; return &zelda3_us_pointers;

View File

@@ -146,7 +146,7 @@
<AdditionalDependencies Condition="'$(VcpkgEnabled)' == 'true'">SDL2.lib;SDL2main.lib;zlibd.lib;libpng16d.lib;ws2_32.lib;winmm.lib;imm32.lib;version.lib;oleaut32.lib;ole32.lib;setupapi.lib;advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies Condition="'$(VcpkgEnabled)' == 'true'">SDL2.lib;SDL2main.lib;zlibd.lib;libpng16d.lib;ws2_32.lib;winmm.lib;imm32.lib;version.lib;oleaut32.lib;ole32.lib;setupapi.lib;advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies Condition="'$(VcpkgEnabled)' != 'true'">SDL2.lib;SDL2main.lib;ws2_32.lib;winmm.lib;imm32.lib;version.lib;oleaut32.lib;ole32.lib;setupapi.lib;advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies Condition="'$(VcpkgEnabled)' != 'true'">SDL2.lib;SDL2main.lib;ws2_32.lib;winmm.lib;imm32.lib;version.lib;oleaut32.lib;ole32.lib;setupapi.lib;advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories Condition="'$(VcpkgEnabled)' == 'true'">$(VcpkgRoot)installed\x64-windows\debug\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories Condition="'$(VcpkgEnabled)' == 'true'">$(VcpkgRoot)installed\x64-windows\debug\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalLibraryDirectories Condition="'$(VcpkgEnabled)' != 'true'">src\lib\SDL\VisualC\SDL\$(PlatformName)\$(Configuration);src\lib\abseil-cpp\absl\base;src\lib\abseil-cpp\absl\strings;src\lib\abseil-cpp\absl\container;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories Condition="'$(VcpkgEnabled)' != 'true'">src\lib\SDL\VisualC\SDL\$(PlatformName)\$(Configuration);src\lib\abseil-cpp\absl\base;src\lib\abseil-cpp\absl\strings;src\lib\abseil-cpp\absl\container;src\lib\abseil-cpp\absl\numeric;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link> </Link>
<PreBuildEvent> <PreBuildEvent>
<Command>copy "$(ProjectDir)src\yaze_config.h.in" "$(ProjectDir)yaze_config.h" <Command>copy "$(ProjectDir)src\yaze_config.h.in" "$(ProjectDir)yaze_config.h"
@@ -182,7 +182,7 @@ if exist "$(ProjectDir)zelda3.sfc" copy /Y "$(ProjectDir)zelda3.sfc" "$(OutDir)"
<AdditionalDependencies Condition="'$(VcpkgEnabled)' == 'true'">SDL2.lib;SDL2main.lib;zlib.lib;libpng16.lib;ws2_32.lib;winmm.lib;imm32.lib;version.lib;oleaut32.lib;ole32.lib;setupapi.lib;advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies Condition="'$(VcpkgEnabled)' == 'true'">SDL2.lib;SDL2main.lib;zlib.lib;libpng16.lib;ws2_32.lib;winmm.lib;imm32.lib;version.lib;oleaut32.lib;ole32.lib;setupapi.lib;advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies Condition="'$(VcpkgEnabled)' != 'true'">SDL2.lib;SDL2main.lib;ws2_32.lib;winmm.lib;imm32.lib;version.lib;oleaut32.lib;ole32.lib;setupapi.lib;advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies Condition="'$(VcpkgEnabled)' != 'true'">SDL2.lib;SDL2main.lib;ws2_32.lib;winmm.lib;imm32.lib;version.lib;oleaut32.lib;ole32.lib;setupapi.lib;advapi32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories Condition="'$(VcpkgEnabled)' == 'true'">$(VcpkgRoot)installed\x64-windows\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories Condition="'$(VcpkgEnabled)' == 'true'">$(VcpkgRoot)installed\x64-windows\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalLibraryDirectories Condition="'$(VcpkgEnabled)' != 'true'">src\lib\SDL\VisualC\SDL\$(PlatformName)\$(Configuration);src\lib\abseil-cpp\absl\base;src\lib\abseil-cpp\absl\strings;src\lib\abseil-cpp\absl\container;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories Condition="'$(VcpkgEnabled)' != 'true'">src\lib\SDL\VisualC\SDL\$(PlatformName)\$(Configuration);src\lib\abseil-cpp\absl\base;src\lib\abseil-cpp\absl\strings;src\lib\abseil-cpp\absl\container;src\lib\abseil-cpp\absl\numeric;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link> </Link>
<PreBuildEvent> <PreBuildEvent>
<Command>copy "$(ProjectDir)src\yaze_config.h.in" "$(ProjectDir)yaze_config.h" <Command>copy "$(ProjectDir)src\yaze_config.h.in" "$(ProjectDir)yaze_config.h"