changeset 1417:e6efe6b2aee9

Add a file extension filter to the menu
author Michael Pavone <pavone@retrodev.com>
date Sat, 24 Jun 2017 23:37:47 -0700
parents 11ac0b511cff
children 62ec8be376be
files default.cfg menu.c
diffstat 2 files changed, 33 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/default.cfg	Sat Jun 24 13:55:54 2017 -0700
+++ b/default.cfg	Sat Jun 24 23:37:47 2017 -0700
@@ -217,6 +217,8 @@
 	#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 {
--- a/menu.c	Sat Jun 24 13:55:54 2017 -0700
+++ b/menu.c	Sat Jun 24 23:37:47 2017 -0700
@@ -220,10 +220,41 @@
 				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) {