Mercurial > repos > blastem
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