Skip to content

Commit 0c8e703

Browse files
committed
(menu_settings) Optimizations:
* Remove string_is_empty * Replace sscanf * Optimize menu_setting_find_ functions
1 parent 69b8e46 commit 0c8e703

2 files changed

Lines changed: 57 additions & 49 deletions

File tree

libretro-common/include/string/stdstring.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ RETRO_BEGIN_DECLS
5959

6060
static INLINE bool string_is_empty(const char *data)
6161
{
62-
return !data || (*data == '\0');
62+
return !data || !*data;
6363
}
6464

6565
static INLINE bool string_is_equal(const char *a, const char *b)

menu/menu_setting.c

Lines changed: 56 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ static void menu_input_st_uint_cb(void *userdata, const char *str)
514514
if (str && *str)
515515
{
516516
const char *ptr = str;
517-
/* Reject negative numbers (sscanf %u would silently overflow) */
517+
/* Reject negative numbers */
518518
while (*ptr == ' ')
519519
ptr++;
520520
if (*ptr >= '0' && *ptr <= '9')
@@ -1063,8 +1063,8 @@ void setting_generic_handle_change(rarch_setting_t *setting)
10631063
command_event(setting->cmd_trigger_idx, NULL);
10641064
}
10651065

1066-
1067-
static size_t setting_get_string_representation_int_gpu_index(rarch_setting_t *setting,
1066+
static size_t setting_get_string_representation_int_gpu_index(
1067+
rarch_setting_t *setting,
10681068
char *s, size_t len)
10691069
{
10701070
size_t _len = 0;
@@ -1073,8 +1073,10 @@ static size_t setting_get_string_representation_int_gpu_index(rarch_setting_t *s
10731073
struct string_list *list = video_driver_get_gpu_api_devices(video_context_driver_get_api());
10741074
_len = snprintf(s, len, "%d", *setting->value.target.integer);
10751075
if ( list
1076+
&& (*setting->value.target.integer >= 0)
10761077
&& (*setting->value.target.integer < (int)list->size)
1077-
&& !string_is_empty(list->elems[*setting->value.target.integer].data))
1078+
&& list->elems[*setting->value.target.integer].data
1079+
&& *list->elems[*setting->value.target.integer].data)
10781080
{
10791081
_len += strlcpy(s + _len, " - ", len - _len);
10801082
_len += strlcpy(s + _len, list->elems[*setting->value.target.integer].data, len - _len);
@@ -3131,7 +3133,7 @@ static size_t setting_get_string_representation_video_font_path(
31313133
{
31323134
if (!setting)
31333135
return 0;
3134-
if (string_is_empty(setting->value.target.string))
3136+
if (!setting->value.target.string || !*setting->value.target.string)
31353137
return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DONT_CARE), len);
31363138
return fill_pathname(s, path_basename(setting->value.target.string),
31373139
"", len);
@@ -3243,7 +3245,8 @@ static size_t setting_get_string_representation_password(
32433245
{
32443246
if (setting)
32453247
{
3246-
if (!string_is_empty(setting->value.target.string))
3248+
if ( setting->value.target.string
3249+
&& setting->value.target.string[0] != '\0')
32473250
return strlcpy(s, "********", len);
32483251
if (config_get_ptr()->arrays.cheevos_token[0])
32493252
return strlcpy(s, "********", len);
@@ -5120,7 +5123,7 @@ static size_t setting_get_string_representation_string_audio_device(rarch_settin
51205123
{
51215124
if (!setting)
51225125
return 0;
5123-
if (string_is_empty(setting->value.target.string))
5126+
if (!setting->value.target.string || !*setting->value.target.string)
51245127
return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DONT_CARE), len);
51255128
return strlcpy(s, setting->value.target.string, len);
51265129
}
@@ -5829,9 +5832,11 @@ static bool setting_action_input_device_index_prevent(
58295832
/* Prevent accidental port 1 device index removal */
58305833
if (setting->index_offset == 0)
58315834
{
5835+
const char *name_cur = input_config_get_device_name(setting->index_offset);
5836+
const char *name_new = input_config_get_device_name(p_new);
58325837
if ( p == setting->index_offset
5833-
&& !string_is_empty(input_config_get_device_name(setting->index_offset))
5834-
&& string_is_empty(input_config_get_device_name(p_new)))
5838+
&& name_cur && *name_cur
5839+
&& (!name_new || !*name_new))
58355840
return true;
58365841
}
58375842
return false;
@@ -7204,12 +7209,11 @@ static size_t setting_get_string_representation_android_physical_keyboard(
72047209
{
72057210
if (setting)
72067211
{
7207-
int keyboard_vendor_id;
7208-
int keyboard_product_id;
7209-
if (sscanf(setting->value.target.string, "%04x:%04x ",
7210-
&keyboard_vendor_id, &keyboard_product_id) != 2)
7211-
return strlcpy(s, setting->value.target.string, len);
7212-
return strlcpy(s, &setting->value.target.string[10], len);
7212+
const char *str = setting->value.target.string;
7213+
if ( str[4] == ':'
7214+
&& str[9] == ' ')
7215+
return strlcpy(s, &str[10], len);
7216+
return strlcpy(s, str, len);
72137217
}
72147218
return 0;
72157219
}
@@ -7644,21 +7648,19 @@ int menu_action_handle_setting(rarch_setting_t *setting,
76447648
info.list = menu_stack;
76457649

76467650
/* Menu background image */
7647-
if (string_is_equal(info.label, MENU_ENUM_LABEL_MENU_WALLPAPER_STR))
7651+
if ( string_is_equal(info.label,
7652+
MENU_ENUM_LABEL_MENU_WALLPAPER_STR)
7653+
&& settings->paths.path_menu_wallpaper[0] != '\0')
76487654
{
7649-
/* Start from current wallpaper instead if available */
7650-
if (!string_is_empty(settings->paths.path_menu_wallpaper))
7651-
{
7652-
free(info.path);
7653-
info.path = strdup(settings->paths.path_menu_wallpaper);
7654-
}
7655+
free(info.path);
7656+
info.path = strdup(settings->paths.path_menu_wallpaper);
76557657
}
76567658

76577659
/* Browse basedir instead and set selection to file if available */
7658-
if (!string_is_empty(info.path) && !path_is_directory(info.path))
7660+
if (info.path && info.path[0] != '\0' && !path_is_directory(info.path))
76597661
{
76607662
const char *selection_path = path_basename(info.path);
7661-
if (!string_is_empty(selection_path))
7663+
if (selection_path && selection_path[0] != '\0')
76627664
menu_driver_set_pending_selection(selection_path);
76637665
path_basedir(info.path);
76647666
}
@@ -7740,30 +7742,25 @@ int menu_action_handle_setting(rarch_setting_t *setting,
77407742
**/
77417743
rarch_setting_t *menu_setting_find(const char *label)
77427744
{
7743-
rarch_setting_t *setting = NULL;
7744-
rarch_setting_t **list = &setting;
7745+
rarch_setting_t *setting;
77457746
struct menu_state *menu_st;
77467747

77477748
if (!label)
77487749
return NULL;
77497750

7750-
menu_st = menu_state_get_ptr();
7751-
setting = menu_st->entries.list_settings;
7751+
menu_st = menu_state_get_ptr();
7752+
setting = menu_st->entries.list_settings;
77527753

77537754
if (!setting)
77547755
return NULL;
77557756

7756-
for (; setting->type != ST_NONE; (*list = *list + 1))
7757+
for (; setting->type != ST_NONE; setting++)
77577758
{
7758-
const char *name = setting->name;
7759-
const char *short_description = setting->short_description;
7760-
7761-
if (
7762-
string_is_equal(label, name)
7763-
&& (setting->type <= ST_GROUP))
7759+
if ( setting->type <= ST_GROUP
7760+
&& string_is_equal(label, setting->name))
77647761
{
7765-
if (string_is_empty(short_description))
7766-
break;
7762+
if (!setting->short_description || !*setting->short_description)
7763+
return NULL;
77677764

77687765
if (setting->read_handler)
77697766
setting->read_handler(setting);
@@ -7791,11 +7788,12 @@ rarch_setting_t *menu_setting_find_enum(enum msg_hash_enums enum_idx)
77917788
return NULL;
77927789
for (; setting->type != ST_NONE; (*list = *list + 1))
77937790
{
7794-
if ( setting->enum_idx == enum_idx &&
7795-
setting->type <= ST_GROUP)
7791+
if (
7792+
setting->type <= ST_GROUP
7793+
&& setting->enum_idx == enum_idx)
77967794
{
77977795
const char *short_description = setting->short_description;
7798-
if (string_is_empty(short_description))
7796+
if (!short_description || !*short_description)
77997797
return NULL;
78007798

78017799
if (setting->read_handler)
@@ -7864,7 +7862,8 @@ static int setting_action_start_input_device_reservation_type(rarch_setting_t *s
78647862
return 0;
78657863
}
78667864

7867-
static int setting_action_start_input_device_reserved_device_name(rarch_setting_t *setting)
7865+
static int setting_action_start_input_device_reserved_device_name(
7866+
rarch_setting_t *setting)
78687867
{
78697868
settings_t *settings = config_get_ptr();
78707869

@@ -8209,7 +8208,7 @@ static size_t setting_get_string_representation_smb_password(
82098208
if (!setting)
82108209
return 0;
82118210

8212-
if (string_is_empty(setting->value.target.string))
8211+
if (!setting->value.target.string || !*setting->value.target.string)
82138212
strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE), len);
82148213
else
82158214
{
@@ -8329,15 +8328,24 @@ static size_t get_string_representation_input_device_reservation_type(
83298328

83308329
static size_t setting_get_string_representation_input_device_reserved_device_name(rarch_setting_t *setting, char *s, size_t len)
83318330
{
8332-
unsigned int dev_vendor_id;
8333-
unsigned int dev_product_id;
8331+
const char *str;
83348332
if (!setting)
83358333
return 0;
8336-
if (string_is_empty(setting->value.target.string))
8334+
if (!setting->value.target.string || !*setting->value.target.string)
83378335
return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NONE), len);
8338-
else if (sscanf(setting->value.target.string, "%04x:%04x ", &dev_vendor_id, &dev_product_id) != 2)
8339-
return strlcpy(s, setting->value.target.string, len);
8340-
return strlcpy(s, &setting->value.target.string[10], len);
8336+
str = setting->value.target.string;
8337+
if ( ((str[0] >= '0' && str[0] <= '9') || (str[0] >= 'a' && str[0] <= 'f') || (str[0] >= 'A' && str[0] <= 'F'))
8338+
&& ((str[1] >= '0' && str[1] <= '9') || (str[1] >= 'a' && str[1] <= 'f') || (str[1] >= 'A' && str[1] <= 'F'))
8339+
&& ((str[2] >= '0' && str[2] <= '9') || (str[2] >= 'a' && str[2] <= 'f') || (str[2] >= 'A' && str[2] <= 'F'))
8340+
&& ((str[3] >= '0' && str[3] <= '9') || (str[3] >= 'a' && str[3] <= 'f') || (str[3] >= 'A' && str[3] <= 'F'))
8341+
&& str[4] == ':'
8342+
&& ((str[5] >= '0' && str[5] <= '9') || (str[5] >= 'a' && str[5] <= 'f') || (str[5] >= 'A' && str[5] <= 'F'))
8343+
&& ((str[6] >= '0' && str[6] <= '9') || (str[6] >= 'a' && str[6] <= 'f') || (str[6] >= 'A' && str[6] <= 'F'))
8344+
&& ((str[7] >= '0' && str[7] <= '9') || (str[7] >= 'a' && str[7] <= 'f') || (str[7] >= 'A' && str[7] <= 'F'))
8345+
&& ((str[8] >= '0' && str[8] <= '9') || (str[8] >= 'a' && str[8] <= 'f') || (str[8] >= 'A' && str[8] <= 'F'))
8346+
&& str[9] == ' ')
8347+
return strlcpy(s, &str[10], len);
8348+
return strlcpy(s, str, len);
83418349
}
83428350

83438351
static size_t get_string_representation_input_mouse_index(

0 commit comments

Comments
 (0)