Skip to content

Commit d147482

Browse files
committed
(menu_displaylist) Optimize filebrowser_parse
1 parent c0f99a1 commit d147482

1 file changed

Lines changed: 129 additions & 147 deletions

File tree

menu/menu_displaylist.c

Lines changed: 129 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
529511
end:
530512
if (!path_is_compressed && allow_parent_directory)
531513
menu_entries_prepend(info_list,

0 commit comments

Comments
 (0)