summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--blastem.c15
-rw-r--r--default.cfg3
-rw-r--r--util.c27
-rw-r--r--util.h3
4 files changed, 33 insertions, 15 deletions
diff --git a/blastem.c b/blastem.c
index 8e90381..1b12ca4 100644
--- a/blastem.c
+++ b/blastem.c
@@ -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 {
diff --git a/util.c b/util.c
index c6aa91e..06342b3 100644
--- a/util.c
+++ b/util.c
@@ -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
diff --git a/util.h b/util.h
index fc3762e..39413e1 100644
--- a/util.h
+++ b/util.h
@@ -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