changeset 1295:96ad1b9bbb3a

Make save directory configurable. Satisfies ticket:4
author Michael Pavone <pavone@retrodev.com>
date Tue, 21 Mar 2017 21:40:47 -0700
parents a719e2c98b54
children 4e2007c1d8ab
files blastem.c default.cfg util.c util.h
diffstat 4 files changed, 33 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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 {
--- 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
--- 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 <stdio.h>
 #include <time.h>
+#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