diff util.c @ 875:54ffba3768d6

Make menu stuff work on Android (theoretically)
author Michael Pavone <pavone@retrodev.com>
date Sun, 08 Nov 2015 22:03:34 -0800
parents 69a6ec208111
children 540cc4a7d626
line wrap: on
line diff
--- a/util.c	Sun Nov 08 18:38:33 2015 -0800
+++ b/util.c	Sun Nov 08 22:03:34 2015 -0800
@@ -321,3 +321,94 @@
 }
 
 #endif
+
+#ifdef __ANDROID__
+
+#include <SDL.h>
+char *read_bundled_file(char *name, long *sizeret)
+{
+	SDL_RWops *rw = SDL_RWFromFile(config_path, "rb");
+	if (!rw) {
+		if (sizeret) {
+			*sizeret = -1;
+		}
+		return NULL;
+	}
+
+	long fsize = rw->size(rw);
+	if (sizeret) {
+		*sizeret = fsize;
+	}
+	char *ret;
+	if (fsize) {
+		ret = malloc(fsize);
+		if (SDL_RWread(rw, ret, 1, fsize) != fsize) {
+			free(ret);
+			ret = NULL;
+		}
+	} else {
+		ret = NULL;
+	}
+	SDL_RWclose(rw);
+	return ret;
+}
+
+char *get_config_dir()
+{
+	return SDL_AndroidGetInternalStoragePath();
+}
+
+#else
+
+char *read_bundled_file(char *name, long *sizeret)
+{
+	char *exe_dir = get_exe_dir();
+	if (!exe_dir) {
+		if (sizeret) {
+			*sizeret = -1;
+		}
+		return NULL;
+	}
+	char *pieces[] = {exe_dir, "/", name};
+	char *path = alloc_concat_m(3, pieces);
+	FILE *f = fopen(path, "rb");
+	free(path);
+	if (!f) {
+		if (sizeret) {
+			*sizeret = -1;
+		}
+		return NULL;
+	}
+
+	long fsize = file_size(f);
+	if (sizeret) {
+		*sizeret = fsize;
+	}
+	char *ret;
+	if (fsize) {
+		//reserve an extra byte in case caller wants
+		//to null terminate the data
+		ret = malloc(fsize+1);
+		if (fread(ret, 1, fsize, f) != fsize) {
+			free(ret);
+			ret = NULL;
+		}
+	} else {
+		ret = NULL;
+	}
+	return ret;
+}
+
+char *get_config_dir()
+{
+	static char* confdir;
+	if (!confdir) {
+		char *homedir = get_home_dir();
+		if (homedir) {
+			confdir = alloc_concat(homedir, "/.config/blastem");
+		}
+	}
+	return confdir;
+}
+
+#endif