From 3b1d8ff70980c7fd4fb408a9af834cfdd2796dd9 Mon Sep 17 00:00:00 2001 From: Nathaniel Walizer Date: Sat, 11 Jan 2025 16:26:01 -0800 Subject: [PATCH] Add subdir for SRAM saves --- src/file.c | 38 +++++++++++++++++++++++++++++++++----- src/file.h | 6 ++++-- src/save.c | 5 +++-- 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/src/file.c b/src/file.c index 2ce8eb8..84ef4f3 100644 --- a/src/file.c +++ b/src/file.c @@ -14,19 +14,45 @@ const char* basename(const char* filename) { return &slash[1]; } -int replace_extension(char* filename, int max_len, - const char* orig_name, const char* ext) { +int make_filename(char* filename, int max_len, + const char* orig_name, + const char* subdir, const char* ext) { int status = 0; int remain = max_len; const char* orig_base = basename(orig_name); const char* orig_dot = strrchr(orig_base, '.'); + int orig_path_len = orig_base - orig_name; + int orig_base_len = (NULL == orig_dot) ? - strlen(orig_name) : - (orig_dot - orig_name); + strlen(orig_base) : + (orig_dot - orig_base); + + // Part 1/4: Leading path + if (0 == status && orig_path_len <= remain) { + strncpy(filename, orig_name, orig_path_len); + remain -= orig_path_len; + filename += orig_path_len; + } else { + status = -1; + } + + // Part 2/4: Subdirectory + if (0 == status && NULL != subdir) { + int subdir_len = strlen(subdir); + if ((subdir_len + 1) <= remain) { + strncpy(filename, subdir, subdir_len); + filename += subdir_len; + *filename++ = '/'; + remain -= (subdir_len + 1); + } else { + status = -1; + } + } - if (orig_base_len <= remain) { + // Part 3/4: Basename + if (0 == status && orig_base_len <= remain) { strncpy(filename, orig_name, orig_base_len); remain -= orig_base_len; filename += orig_base_len; @@ -34,12 +60,14 @@ int replace_extension(char* filename, int max_len, status = -1; } + // Part 4/4: Extension if (0 == status && NULL != ext) { int ext_len = strlen(ext); if ((ext_len + 1) <= remain) { *filename++ = '.'; strncpy(filename, ext, ext_len); remain -= (ext_len + 1); + filename += ext_len; } else { status = -1; } diff --git a/src/file.h b/src/file.h index f7125fa..1870e80 100644 --- a/src/file.h +++ b/src/file.h @@ -5,10 +5,12 @@ // Return pointer to filename omitting path const char* basename(const char* filename); -int replace_extension(char* filename, int max_len, - const char* orig_name, const char* ext); +int make_filename(char* filename, int max_len, + const char* orig_name, + const char* subdir, const char* ext); int write_file(const char* filename, const void* data, int len); int read_file(const char* filename, void* data, int len); + #endif // NESE_FILE_H_ diff --git a/src/save.c b/src/save.c index 9670d08..a9760f5 100644 --- a/src/save.c +++ b/src/save.c @@ -5,8 +5,9 @@ static int make_sram_filename(char* sram_filename, int max_len, const char* cart_filename) { - return replace_extension( sram_filename, max_len, - basename(cart_filename), "sram"); + return make_filename( sram_filename, max_len, + basename(cart_filename), + "sram", "sram"); } int load_sram(nes_cart* cart, const char* cart_filename) {