# HG changeset patch # User Michael Pavone # Date 1490157647 25200 # Node ID 96ad1b9bbb3a8c11c93a69d5045fe979714c84a2 # Parent a719e2c98b54c1af5378f505df190b1745f4d661 Make save directory configurable. Satisfies ticket:4 diff -r a719e2c98b54 -r 96ad1b9bbb3a blastem.c --- a/blastem.c Tue Mar 21 19:56:50 2017 -0700 +++ b/blastem.c Tue Mar 21 21:40:47 2017 -0700 @@ -140,14 +140,21 @@ 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 -r a719e2c98b54 -r 96ad1b9bbb3a default.cfg --- a/default.cfg Tue Mar 21 19:56:50 2017 -0700 +++ b/default.cfg Tue Mar 21 21:40:47 2017 -0700 @@ -204,6 +204,9 @@ 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 { diff -r a719e2c98b54 -r 96ad1b9bbb3a util.c --- a/util.c Tue Mar 21 19:56:50 2017 -0700 +++ b/util.c Tue Mar 21 21:40:47 2017 -0700 @@ -681,7 +681,7 @@ return SDL_AndroidGetInternalStoragePath(); } -char const *get_save_dir() +char const *get_userdata_dir() { return SDL_AndroidGetInternalStoragePath(); } @@ -729,7 +729,7 @@ #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 @@ } 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 @@ 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 diff -r a719e2c98b54 -r 96ad1b9bbb3a util.h --- a/util.h Tue Mar 21 19:56:50 2017 -0700 +++ b/util.h Tue Mar 21 21:40:47 2017 -0700 @@ -3,6 +3,7 @@ #include #include +#include "tern.h" typedef struct { char *name; @@ -50,7 +51,7 @@ //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