summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Pavone <pavone@retrodev.com>2017-06-24 23:37:47 -0700
committerMichael Pavone <pavone@retrodev.com>2017-06-24 23:37:47 -0700
commitee31eb2645a5af8171c3e3c17d7f5f954c3d6ec3 (patch)
tree81fb2974f6fbd3bc763d9f6f7b7fa293250d59b0
parentc21c73853ca656be57011cdb0c2e7b9da1dac5df (diff)
Add a file extension filter to the menu
-rw-r--r--default.cfg2
-rw-r--r--menu.c31
2 files changed, 33 insertions, 0 deletions
diff --git a/default.cfg b/default.cfg
index 91a75fd..1e75737 100644
--- a/default.cfg
+++ b/default.cfg
@@ -217,6 +217,8 @@ ui {
#path template for saving SRAM, EEPROM and savestates
#accepts special variables $HOME, $EXEDIR, $USERDATA, $ROMNAME
save_path $USERDATA/blastem/$ROMNAME
+ #space delimited list of file extensions to filter against in menu
+ extensions bin gen md sms gg
}
system {
diff --git a/menu.c b/menu.c
index 97eba82..8ab9605 100644
--- a/menu.c
+++ b/menu.c
@@ -220,10 +220,41 @@ void * menu_write_w(uint32_t address, void * context, uint16_t value)
dst = copy_dir_entry_to_guest(dst, m68k, "..", 1);
}
#endif
+ char *ext_filter = strdup(tern_find_path_default(config, "ui\0extensions\0", (tern_val){.ptrval = "bin gen md sms gg"}, TVAL_PTR).ptrval);
+ uint32_t num_exts = 0, ext_storage = 5;
+ char **ext_list = malloc(sizeof(char *) * ext_storage);
+ char *cur_filter = ext_filter;
+ while (*cur_filter)
+ {
+ if (num_exts == ext_storage) {
+ ext_storage *= 2;
+ ext_list = realloc(ext_list, sizeof(char *) * ext_storage);
+ }
+ ext_list[num_exts++] = cur_filter;
+ cur_filter = split_keyval(cur_filter);
+ }
for (size_t i = 0; dst && i < num_entries; i++)
{
+ if (num_exts && !entries[i].is_dir) {
+ char *ext = path_extension(entries[i].name);
+ if (!ext) {
+ continue;
+ }
+ uint32_t extidx;
+ for (extidx = 0; extidx < num_exts; extidx++)
+ {
+ if (!strcmp(ext, ext_list[extidx])) {
+ break;
+ }
+ }
+ if (extidx == num_exts) {
+ continue;
+ }
+ }
dst = copy_dir_entry_to_guest(dst, m68k, entries[i].name, entries[i].is_dir);
}
+ free(ext_filter);
+ free(ext_list);
//terminate list
uint8_t *dest = get_native_pointer(dst, (void **)m68k->mem_pointers, &m68k->options->gen);
if (dest) {