@@ -209,8 +209,8 @@ static int filebrowser_parse(
209209 enum menu_displaylist_ctl_state type = (enum menu_displaylist_ctl_state)type_data;
210210 enum filebrowser_enums filebrowser_type = filebrowser_get_type();
211211 bool allow_parent_directory = true;
212- bool path_is_compressed = !string_is_empty(path) ?
213- path_is_compressed_file(path) : false ;
212+ bool path_is_compressed = !string_is_empty(path)
213+ && path_is_compressed_file(path);
214214 menu_search_terms_t *search_terms = menu_entries_search_get_terms();
215215#ifdef IOS
216216 char full_path[PATH_MAX_LENGTH];
@@ -219,18 +219,21 @@ static int filebrowser_parse(
219219 const char *full_path = path;
220220#endif
221221
222+ #define RESOLVE_SUBSYSTEM(runloop_st, sys_info) \
223+ do { \
224+ (sys_info) = &(runloop_st)->system; \
225+ subsystem = (sys_info)->subsystem.data \
226+ ? (sys_info)->subsystem.data + content_get_subsystem() \
227+ : (runloop_st)->subsystem_data + content_get_subsystem(); \
228+ } while (0)
229+
222230 if (path_is_compressed)
223231 {
224232 if (filebrowser_type == FILEBROWSER_SELECT_FILE_SUBSYSTEM)
225233 {
226- runloop_state_t *runloop_st = runloop_state_get_ptr();
227- rarch_system_info_t *sys_info = &runloop_st->system;
228- /* Core fully loaded, use the subsystem data */
229- if (sys_info->subsystem.data)
230- subsystem = sys_info->subsystem.data + content_get_subsystem();
231- /* Core not loaded completely, use the data we peeked on load core */
232- else
233- subsystem = runloop_st->subsystem_data + content_get_subsystem();
234+ runloop_state_t *runloop_st = runloop_state_get_ptr();
235+ rarch_system_info_t *sys_info;
236+ RESOLVE_SUBSYSTEM(runloop_st, sys_info);
234237
235238 if (subsystem && runloop_st->subsystem_current_count > 0)
236239 ret = file_archive_get_file_list_noalloc(&str_list,
@@ -255,7 +258,7 @@ static int filebrowser_parse(
255258 filter_ext = false;
256259
257260 if ( string_is_equal(label, "database_manager_list")
258- #if IOS
261+ #ifdef IOS
259262 || string_is_equal(label, "video_filter")
260263 || string_is_equal(label, "audio_dsp_plugin")
261264#endif
@@ -264,14 +267,9 @@ static int filebrowser_parse(
264267
265268 if (filebrowser_type == FILEBROWSER_SELECT_FILE_SUBSYSTEM)
266269 {
267- runloop_state_t *runloop_st = runloop_state_get_ptr();
268- rarch_system_info_t *sys_info = &runloop_st->system;
269- /* Core fully loaded, use the subsystem data */
270- if (sys_info->subsystem.data)
271- subsystem = sys_info->subsystem.data + content_get_subsystem();
272- /* Core not loaded completely, use the data we peeked on load core */
273- else
274- subsystem = runloop_st->subsystem_data + content_get_subsystem();
270+ runloop_state_t *runloop_st = runloop_state_get_ptr();
271+ rarch_system_info_t *sys_info;
272+ RESOLVE_SUBSYSTEM(runloop_st, sys_info);
275273
276274 if ( subsystem
277275 && (runloop_st->subsystem_current_count > 0)
@@ -281,8 +279,8 @@ static int filebrowser_parse(
281279 filter_ext ? subsystem->roms[content_get_subsystem_rom_id()].valid_extensions : NULL,
282280 true, show_hidden_files, true, false);
283281 }
284- else if (( type_default == FILE_TYPE_MANUAL_SCAN_DAT)
285- || ( type_default == FILE_TYPE_SIDELOAD_CORE) )
282+ else if ( type_default == FILE_TYPE_MANUAL_SCAN_DAT
283+ || type_default == FILE_TYPE_SIDELOAD_CORE)
286284 ret = dir_list_initialize(&str_list, full_path,
287285 exts, true, show_hidden_files, false, false);
288286 else
@@ -317,8 +315,6 @@ static int filebrowser_parse(
317315 FILE_TYPE_USE_DIRECTORY, 0, 0);
318316 break;
319317 default:
320- /* if a core has / in its list of supported extensions, the core
321- supports loading of directories on the host file system */
322318 if (exts && memchr(exts, '/', strlen(exts) + 1))
323319 menu_entries_prepend(info_list,
324320 msg_hash_to_str(MENU_ENUM_LABEL_VALUE_USE_THIS_DIRECTORY),
@@ -343,151 +339,137 @@ static int filebrowser_parse(
343339
344340 list_size = str_list.size;
345341
346- if (list_size > 0 )
342+ for (i = 0; i < list_size; i++ )
347343 {
348- for (i = 0; i < list_size; i++)
349- {
350- enum msg_hash_enums enum_idx = MSG_UNKNOWN;
351- enum rarch_content_type path_type = RARCH_CONTENT_NONE;
352- enum msg_file_type file_type = FILE_TYPE_NONE;
353- const char *file_path = str_list.elems[i].data;
344+ enum msg_hash_enums enum_idx = MSG_UNKNOWN;
345+ enum rarch_content_type path_type = RARCH_CONTENT_NONE;
346+ enum msg_file_type file_type = FILE_TYPE_NONE;
347+ const char *file_path = str_list.elems[i].data;
348+ int attr = str_list.elems[i].attr.i; /* [8] cache attr — read twice below */
349+
350+ if (string_is_empty(file_path))
351+ continue;
352+
353+ bool dir_only_mode = ( filebrowser_type == FILEBROWSER_SELECT_DIR
354+ || filebrowser_type == FILEBROWSER_SCAN_DIR
355+ || filebrowser_type == FILEBROWSER_MANUAL_SCAN_DIR);
356+
357+ if (dir_only_mode && attr != RARCH_DIRECTORY)
358+ continue;
354359
360+ if (!path_is_compressed)
361+ {
362+ file_path = path_basename_nocompression(file_path);
355363 if (string_is_empty(file_path))
356364 continue;
365+ }
357366
358- if ( (str_list.elems[i].attr.i != RARCH_DIRECTORY)
359- && ((filebrowser_type == FILEBROWSER_SELECT_DIR)
360- || (filebrowser_type == FILEBROWSER_SCAN_DIR)
361- || (filebrowser_type == FILEBROWSER_MANUAL_SCAN_DIR)))
362- continue;
367+ if (search_terms)
368+ {
369+ size_t j;
370+ bool skip_entry = false;
363371
364- if (!path_is_compressed )
372+ for (j = 0; j < search_terms->size; j++ )
365373 {
366- file_path = path_basename_nocompression(file_path);
367- if (string_is_empty(file_path))
368- continue;
374+ const char *search_term = search_terms->terms[j];
375+ if (!string_is_empty(search_term) && !strcasestr(file_path, search_term))
376+ {
377+ skip_entry = true;
378+ break;
379+ }
369380 }
370381
371- /* Check whether entry matches search terms,
372- * if required */
373- if (search_terms)
374- {
375- size_t j;
376- bool skip_entry = false;
377-
378- for (j = 0; j < search_terms->size; j++)
379- {
380- const char *search_term = search_terms->terms[j];
382+ if (skip_entry)
383+ continue;
384+ }
381385
382- if ( !string_is_empty(search_term)
383- && !strcasestr(file_path, search_term))
384- {
385- skip_entry = true;
386- break;
387- }
388- }
386+ if (attr == RARCH_DIRECTORY)
387+ {
388+ count++;
389+ menu_entries_append(info_list, file_path, "",
390+ MENU_ENUM_LABEL_FILE_BROWSER_DIRECTORY,
391+ FILE_TYPE_DIRECTORY, 0, 0, NULL);
392+ continue;
393+ }
389394
390- if (skip_entry)
391- continue;
392- }
395+ /* Resolve base file type */
396+ switch (attr)
397+ {
398+ case RARCH_COMPRESSED_ARCHIVE:
399+ file_type = FILE_TYPE_CARCHIVE;
400+ break;
401+ case RARCH_COMPRESSED_FILE_IN_ARCHIVE:
402+ file_type = FILE_TYPE_IN_CARCHIVE;
403+ break;
404+ case RARCH_PLAIN_FILE:
405+ default:
406+ file_type = (filebrowser_type == FILEBROWSER_SELECT_VIDEO_FONT)
407+ ? FILE_TYPE_VIDEO_FONT
408+ : (enum msg_file_type)type_default;
393409
394- switch (str_list.elems[i].attr.i)
395- {
396- case RARCH_DIRECTORY:
397- file_type = FILE_TYPE_DIRECTORY;
398- count++;
399- menu_entries_append(info_list, file_path, "",
400- MENU_ENUM_LABEL_FILE_BROWSER_DIRECTORY,
401- file_type, 0, 0, NULL);
402- continue;
403- case RARCH_COMPRESSED_ARCHIVE:
410+ if ( type == DISPLAYLIST_CORES_DETECTED
411+ && path_is_compressed_file(file_path))
404412 file_type = FILE_TYPE_CARCHIVE;
405- break;
406- case RARCH_COMPRESSED_FILE_IN_ARCHIVE:
407- file_type = FILE_TYPE_IN_CARCHIVE;
408- break;
409- case RARCH_PLAIN_FILE:
410- default:
411- if (filebrowser_type == FILEBROWSER_SELECT_VIDEO_FONT)
412- file_type = FILE_TYPE_VIDEO_FONT;
413- else
414- file_type = (enum msg_file_type)type_default;
415- switch (type)
416- {
417- /* in case of deferred_core_list we have to interpret
418- * every archive as an archive to disallow instant loading
419- */
420- case DISPLAYLIST_CORES_DETECTED:
421- if (path_is_compressed_file(file_path))
422- file_type = FILE_TYPE_CARCHIVE;
423- break;
424- default:
425- break;
426- }
427- break;
428- }
413+ break;
414+ }
429415
430- path_type = path_is_media_type(file_path);
416+ path_type = path_is_media_type(file_path);
431417
432- if (filebrowser_type == FILEBROWSER_SELECT_COLLECTION)
433- file_type = FILE_TYPE_PLAYLIST_COLLECTION;
418+ if (filebrowser_type == FILEBROWSER_SELECT_COLLECTION)
419+ file_type = FILE_TYPE_PLAYLIST_COLLECTION;
434420
435- if ( builtin_mediaplayer_enable
436- || builtin_imageviewer_enable)
421+ if (builtin_mediaplayer_enable || builtin_imageviewer_enable)
422+ {
423+ switch (path_type)
437424 {
438- switch (path_type)
439- {
440- case RARCH_CONTENT_MUSIC:
425+ case RARCH_CONTENT_MUSIC:
441426#if defined(HAVE_FFMPEG) || defined(HAVE_MPV) || defined(HAVE_AUDIOMIXER)
442- if (builtin_mediaplayer_enable)
443- file_type = FILE_TYPE_MUSIC;
427+ if (builtin_mediaplayer_enable)
428+ file_type = FILE_TYPE_MUSIC;
444429#endif
445- break;
446- case RARCH_CONTENT_MOVIE:
430+ break;
431+ case RARCH_CONTENT_MOVIE:
447432#if defined(HAVE_FFMPEG) || defined(HAVE_MPV)
448- if (builtin_mediaplayer_enable)
449- file_type = FILE_TYPE_MOVIE;
433+ if (builtin_mediaplayer_enable)
434+ file_type = FILE_TYPE_MOVIE;
450435#endif
451- break;
452- case RARCH_CONTENT_IMAGE:
436+ break;
437+ case RARCH_CONTENT_IMAGE:
453438#ifdef HAVE_IMAGEVIEWER
454- if ( builtin_imageviewer_enable
455- && (type != DISPLAYLIST_IMAGES))
456- file_type = FILE_TYPE_IMAGEVIEWER;
457- else
458- file_type = FILE_TYPE_IMAGE;
439+ if (builtin_imageviewer_enable && type != DISPLAYLIST_IMAGES)
440+ file_type = FILE_TYPE_IMAGEVIEWER;
441+ else
442+ file_type = FILE_TYPE_IMAGE;
459443#endif
460- if (filebrowser_type == FILEBROWSER_SELECT_IMAGE)
461- file_type = FILE_TYPE_IMAGE;
462- break;
463- default:
464- break;
465- }
466- }
467-
468- switch (file_type)
469- {
470- case FILE_TYPE_MOVIE:
471- enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_MOVIE_OPEN;
472- break;
473- case FILE_TYPE_MUSIC:
474- enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_MUSIC_OPEN;
475- break;
476- case FILE_TYPE_IMAGE:
477- enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_IMAGE;
444+ if (filebrowser_type == FILEBROWSER_SELECT_IMAGE)
445+ file_type = FILE_TYPE_IMAGE;
478446 break;
479- case FILE_TYPE_IMAGEVIEWER:
480- enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_IMAGE_OPEN_WITH_VIEWER;
481- break;
482- case FILE_TYPE_PLAIN:
483447 default:
484448 break;
485449 }
450+ }
486451
487- count++;
488- menu_entries_append(info_list, file_path, "",
489- enum_idx, file_type, 0, 0, NULL);
452+ switch (file_type)
453+ {
454+ case FILE_TYPE_MOVIE:
455+ enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_MOVIE_OPEN;
456+ break;
457+ case FILE_TYPE_MUSIC:
458+ enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_MUSIC_OPEN;
459+ break;
460+ case FILE_TYPE_IMAGE:
461+ enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_IMAGE;
462+ break;
463+ case FILE_TYPE_IMAGEVIEWER:
464+ enum_idx = MENU_ENUM_LABEL_FILE_BROWSER_IMAGE_OPEN_WITH_VIEWER;
465+ break;
466+ default:
467+ break;
490468 }
469+
470+ count++;
471+ menu_entries_append(info_list, file_path, "",
472+ enum_idx, file_type, 0, 0, NULL);
491473 }
492474
493475 dir_list_deinitialize(&str_list);
@@ -501,10 +483,9 @@ static int filebrowser_parse(
501483
502484#if defined(IOS) || (defined(OSX) && defined(HAVE_APPLE_STORE))
503485 {
504- /* Check if we're allowed to escape our sandbox */
505- struct string_list *str_list = string_list_new();
506- dir_list_append(str_list, "/private/var", NULL, true, false, false, false);
507- if (str_list->size <= 0)
486+ struct string_list *sandbox_list = string_list_new();
487+ dir_list_append(sandbox_list, "/private/var", NULL, true, false, false, false);
488+ if (sandbox_list->size <= 0)
508489 {
509490 char dir[DIR_MAX_LENGTH];
510491 size_t _len = fill_pathname_application_dir(dir, sizeof(dir));
@@ -514,18 +495,19 @@ static int filebrowser_parse(
514495 allow_parent_directory = false;
515496 else
516497 {
517- size_t _len = fill_pathname_home_dir(dir, sizeof(dir));
518- if ( string_ends_with(full_path, "/")
519- && !string_ends_with(dir, "/"))
498+ _len = fill_pathname_home_dir(dir, sizeof(dir));
499+ if (string_ends_with(full_path, "/") && !string_ends_with(dir, "/"))
520500 strlcpy(dir + _len, "/", sizeof(dir) - _len);
521501 if (string_is_equal(dir, full_path))
522502 allow_parent_directory = false;
523503 }
524504 }
525- string_list_free(str_list );
505+ string_list_free(sandbox_list );
526506 }
527507#endif
528508
509+ #undef RESOLVE_SUBSYSTEM
510+
529511end:
530512 if (!path_is_compressed && allow_parent_directory)
531513 menu_entries_prepend(info_list,
0 commit comments