Mercurial > repos > blastem
diff util.c @ 1696:956c1cce05e2 mame_interp
Merge from default
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 24 Jan 2019 19:15:59 -0800 |
parents | ba3fb7a3be6b |
children | eda8df5bc74c |
line wrap: on
line diff
--- a/util.c Tue Dec 25 11:12:26 2018 -0800 +++ b/util.c Thu Jan 24 19:15:59 2019 -0800 @@ -537,34 +537,70 @@ dir_entry *get_dir_list(char *path, size_t *numret) { - HANDLE dir; - WIN32_FIND_DATA file; - char *pattern = alloc_concat(path, "/*.*"); - dir = FindFirstFile(pattern, &file); - free(pattern); - if (dir == INVALID_HANDLE_VALUE) { + dir_entry *ret; + if (path[0] == PATH_SEP[0] && !path[1]) { + int drives = GetLogicalDrives(); + size_t count = 0; + for (int i = 0; i < 26; i++) + { + if (drives & (1 << i)) { + count++; + } + } + ret = calloc(count, sizeof(dir_entry)); + dir_entry *cur = ret; + for (int i = 0; i < 26; i++) + { + if (drives & (1 << i)) { + cur->name = malloc(4); + cur->name[0] = 'A' + i; + cur->name[1] = ':'; + cur->name[2] = PATH_SEP[0]; + cur->name[3] = 0; + cur->is_dir = 1; + cur++; + } + } if (numret) { - *numret = 0; + *numret = count; } - return NULL; - } - - size_t storage = 64; - dir_entry *ret = malloc(sizeof(dir_entry) * storage); - size_t pos = 0; - - do { - if (pos == storage) { - storage = storage * 2; - ret = realloc(ret, sizeof(dir_entry) * storage); + } else { + HANDLE dir; + WIN32_FIND_DATA file; + char *pattern = alloc_concat(path, "/*.*"); + dir = FindFirstFile(pattern, &file); + free(pattern); + if (dir == INVALID_HANDLE_VALUE) { + if (numret) { + *numret = 0; + } + return NULL; } - ret[pos].name = strdup(file.cFileName); - ret[pos++].is_dir = (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; - } while (FindNextFile(dir, &file)); - - FindClose(dir); - if (numret) { - *numret = pos; + + size_t storage = 64; + ret = malloc(sizeof(dir_entry) * storage); + size_t pos = 0; + + if (path[1] == ':' && (!path[2] || (path[2] == PATH_SEP[0] && !path[3]))) { + //we are in the root of a drive, add a virtual .. entry + //for navigating to the virtual root directory + ret[pos].name = strdup(".."); + ret[pos++].is_dir = 1; + } + + do { + if (pos == storage) { + storage = storage * 2; + ret = realloc(ret, sizeof(dir_entry) * storage); + } + ret[pos].name = strdup(file.cFileName); + ret[pos++].is_dir = (file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; + } while (FindNextFile(dir, &file)); + + FindClose(dir); + if (numret) { + *numret = pos; + } } return ret; } @@ -839,14 +875,18 @@ char *read_bundled_file(char *name, uint32_t *sizeret) { - char *exe_dir = get_exe_dir(); - if (!exe_dir) { +#ifdef DATA_PATH + char *data_dir = DATA_PATH; +#else + char *data_dir = get_exe_dir(); + if (!data_dir) { if (sizeret) { *sizeret = -1; } return NULL; } - char const *pieces[] = {exe_dir, PATH_SEP, name}; +#endif + char const *pieces[] = {data_dir, PATH_SEP, name}; char *path = alloc_concat_m(3, pieces); FILE *f = fopen(path, "rb"); free(path); @@ -891,7 +931,14 @@ char const *get_config_dir() { - return get_userdata_dir(); + static char* confdir; + if (!confdir) { + char const *base = get_userdata_dir(); + if (base) { + confdir = alloc_concat(base, PATH_SEP "blastem"); + } + } + return confdir; } #define CONFIG_PREFIX "" #define SAVE_PREFIX ""