diff options
author | Michael Pavone <pavone@retrodev.com> | 2017-03-21 21:40:47 -0700 |
---|---|---|
committer | Michael Pavone <pavone@retrodev.com> | 2017-03-21 21:40:47 -0700 |
commit | bad5d7a2390a72fc80d2e17b6b2b89e9d974295f (patch) | |
tree | 16160a9845fb8a75c8f4ff5b315713d391ba17f0 | |
parent | a435c3b1135d56802fa2c4f17ff498f37cde98d7 (diff) |
Make save directory configurable. Satisfies ticket:4
-rw-r--r-- | blastem.c | 15 | ||||
-rw-r--r-- | default.cfg | 3 | ||||
-rw-r--r-- | util.c | 27 | ||||
-rw-r--r-- | util.h | 3 |
4 files changed, 33 insertions, 15 deletions
@@ -140,14 +140,21 @@ void update_title(char *rom_name) void setup_saves(char *fname, rom_info *info, system_header *context) { static uint8_t persist_save_registered; + char *savedir_template = tern_find_path(config, "ui\0save_path\0").ptrval; + if (!savedir_template) { + savedir_template = "$USERDATA/blastem/$ROMNAME"; + } char * barename = basename_no_extension(fname); - char const * parts[3] = {get_save_dir(), PATH_SEP, barename}; - char *save_dir = alloc_concat_m(3, parts); + tern_node *vars = tern_insert_ptr(NULL, "ROMNAME", barename); + vars = tern_insert_ptr(vars, "HOME", get_home_dir()); + vars = tern_insert_ptr(vars, "EXEDIR", get_exe_dir()); + vars = tern_insert_ptr(vars, "USERDATA", (char *)get_userdata_dir()); + char *save_dir = replace_vars(savedir_template, vars, 1); + tern_free(vars); if (!ensure_dir_exists(save_dir)) { warning("Failed to create save directory %s\n", save_dir); } - parts[0] = save_dir; - parts[2] = info->save_type == SAVE_I2C ? "save.eeprom" : "save.sram"; + char const *parts[] = {save_dir, PATH_SEP, info->save_type == SAVE_I2C ? "save.eeprom" : "save.sram"}; free(save_filename); save_filename = alloc_concat_m(3, parts); //TODO: make quick save filename dependent on system type diff --git a/default.cfg b/default.cfg index b281ba8..eeca096 100644 --- a/default.cfg +++ b/default.cfg @@ -204,6 +204,9 @@ ui { screenshot_path $HOME #see strftime for the format specifiers valid in screenshot_template screenshot_template blastem_%c.ppm + #path template for saving SRAM, EEPROM and savestates + #accepts special variables $HOME, $EXEDIR, $USERDATA, $ROMNAME + save_path $USERDATA/blastem/$ROMNAME } system { @@ -681,7 +681,7 @@ char const *get_config_dir() return SDL_AndroidGetInternalStoragePath(); } -char const *get_save_dir() +char const *get_userdata_dir() { return SDL_AndroidGetInternalStoragePath(); } @@ -729,7 +729,7 @@ char *read_bundled_file(char *name, uint32_t *sizeret) #ifdef _WIN32 -char const *get_save_base_dir() +char const *get_userdata_dir() { static char path[MAX_PATH]; if (S_OK == SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, path)) @@ -738,22 +738,24 @@ char const *get_save_base_dir() } return NULL; } + +char const *get_config_dir() +{ + return get_userdata_dir(); +} #define CONFIG_PREFIX "" #define SAVE_PREFIX "" #else -#define get_save_base_dir get_home_dir #define CONFIG_PREFIX "/.config" -#define SAVE_PREFIX "/.local/share" - -#endif +#define USERDATA_SUFFIX "/.local/share" char const *get_config_dir() { static char* confdir; if (!confdir) { - char const *base = get_save_base_dir(); + char const *base = get_home_dir(); if (base) { confdir = alloc_concat(base, CONFIG_PREFIX PATH_SEP "blastem"); } @@ -761,16 +763,21 @@ char const *get_config_dir() return confdir; } -char const *get_save_dir() +char const *get_userdata_dir() { static char* savedir; if (!savedir) { - char const *base = get_save_base_dir(); + char const *base = get_home_dir(); if (base) { - savedir = alloc_concat(base, SAVE_PREFIX PATH_SEP "blastem"); + savedir = alloc_concat(base, USERDATA_SUFFIX); } } return savedir; } + +#endif + + + #endif @@ -3,6 +3,7 @@ #include <stdio.h> #include <time.h> +#include "tern.h" typedef struct { char *name; @@ -50,7 +51,7 @@ char * get_home_dir(); //Returns an appropriate path for storing config files char const *get_config_dir(); //Returns an appropriate path for saving non-config data like savestates -char const *get_save_dir(); +char const *get_userdata_dir(); //Reads a file bundled with the executable char *read_bundled_file(char *name, uint32_t *sizeret); //Retunrs an array of normal files and directories residing in a directory |