(menu_setting) No longer use sscanf for float/uint/int callback functions -

significantly faster when doing it with strtoull/strtod
This commit is contained in:
U-DESKTOP-SPFP6AQ\twistedtechre committed 2026-04-04 03:36:53 +02:00
1 parent 8f27f13d92
commit d6b974c007
1 file changed
+65 -77
+65 -77
View File
@@ -441,20 +441,23 @@ static int setting_set_with_string_representation(rarch_setting_t* setting,
case ST_SIZE:
{
uint32_t flags = setting->flags;
sscanf(value, "%" PRI_SIZET, setting->value.target.sizet);
char *end;
unsigned long long parsed = strtoull(value, &end, 10);
if (end != value && *end == '\0')
*setting->value.target.sizet = (size_t)parsed;
if (flags & SD_FLAG_HAS_RANGE)
{
float min = setting->min;
float max = setting->max;
if (flags & SD_FLAG_ENFORCE_MINRANGE && *setting->value.target.sizet < min)
*setting->value.target.sizet = min;
if (flags & SD_FLAG_ENFORCE_MAXRANGE && *setting->value.target.sizet > max)
float min = setting->min;
float max = setting->max;
if (flags & SD_FLAG_ENFORCE_MINRANGE && *setting->value.target.sizet < (size_t)min)
*setting->value.target.sizet = (size_t)min;
if (flags & SD_FLAG_ENFORCE_MAXRANGE && *setting->value.target.sizet > (size_t)max)
{
settings_t *settings = config_get_ptr();
if (settings && settings->bools.menu_navigation_wraparound_enable)
*setting->value.target.sizet = min;
*setting->value.target.sizet = (size_t)min;
else
*setting->value.target.sizet = max;
*setting->value.target.sizet = (size_t)max;
}
}
}
@@ -506,46 +509,32 @@ static int setting_set_with_string_representation(rarch_setting_t* setting,
return 0;
}
static void menu_input_st_uint_cb(void *userdata, const char *str)
{
if (str && *str)
{
const char *ptr = NULL;
unsigned value = 0;
int chars_read = 0;
int ret = 0;
/* Ensure that input string contains a valid
* unsigned value
* Note: sscanf() will accept negative number
* strings here and overflow, so have to check
* for minus characters first... */
for (ptr = str; *ptr != '\0'; ptr++)
const char *ptr = str;
/* Reject negative numbers (sscanf %u would silently overflow) */
while (*ptr == ' ')
ptr++;
if (*ptr >= '0' && *ptr <= '9')
{
if (*ptr == '-')
char *end = NULL;
unsigned long value = strtoul(str, &end, 10);
/* Ensure entire string was consumed and value fits in unsigned */
if (end && *end == '\0' && value <= UINT_MAX)
{
menu_input_dialog_end();
return;
}
}
ret = sscanf(str, "%u %n", &value, &chars_read);
if ((ret == 1) && !str[chars_read])
{
struct menu_state *menu_st = menu_state_get_ptr();
const char *label = menu_st->input_dialog_kb_label_setting;
if (!string_is_empty(label))
{
rarch_setting_t *setting = NULL;
if ((setting = menu_setting_find(label)))
setting_set_with_string_representation(setting, str);
struct menu_state *menu_st = menu_state_get_ptr();
const char *label = menu_st->input_dialog_kb_label_setting;
if (label && *label)
{
rarch_setting_t *setting = NULL;
if ((setting = menu_setting_find(label)))
setting_set_with_string_representation(setting, str);
}
}
}
}
menu_input_dialog_end();
}
@@ -553,26 +542,30 @@ static void menu_input_st_int_cb(void *userdata, const char *str)
{
if (str && *str)
{
int value = 0;
int chars_read = 0;
/* Ensure that input string contains a valid
* unsigned value */
int ret = sscanf(str, "%d %n", &value, &chars_read);
const char *ptr = str;
if ((ret == 1) && !str[chars_read])
if (*ptr >= '0' && *ptr <= '9')
{
struct menu_state *menu_st = menu_state_get_ptr();
const char *label = menu_st->input_dialog_kb_label_setting;
while (*ptr >= '0' && *ptr <= '9')
ptr++;
if (!string_is_empty(label))
/* Skip trailing whitespace */
while (*ptr == ' ' || *ptr == '\t')
ptr++;
if (*ptr == '\0')
{
rarch_setting_t *setting = NULL;
if ((setting = menu_setting_find(label)))
setting_set_with_string_representation(setting, str);
struct menu_state *menu_st = menu_state_get_ptr();
const char *label = menu_st->input_dialog_kb_label_setting;
if (label && *label)
{
rarch_setting_t *setting = NULL;
if ((setting = menu_setting_find(label)))
setting_set_with_string_representation(setting, str);
}
}
}
}
menu_input_dialog_end();
}
@@ -580,18 +573,13 @@ static void menu_input_st_float_cb(void *userdata, const char *str)
{
if (str && *str)
{
float value = 0.0f;
int chars_read = 0;
/* Ensure that input string contains a valid
* floating point value */
int ret = sscanf(str, "%f %n", &value, &chars_read);
if ((ret == 1) && !str[chars_read])
char *end = NULL;
(void)strtod(str, &end);
if (end != str && *end == '\0')
{
struct menu_state *menu_st = menu_state_get_ptr();
const char *label = menu_st->input_dialog_kb_label_setting;
if (!string_is_empty(label))
if (label && *label)
{
rarch_setting_t *setting = NULL;
if ((setting = menu_setting_find(label)))
@@ -599,7 +587,6 @@ static void menu_input_st_float_cb(void *userdata, const char *str)
}
}
}
menu_input_dialog_end();
}
@@ -610,7 +597,7 @@ static void menu_input_st_string_cb(void *userdata, const char *str)
struct menu_state *menu_st = menu_state_get_ptr();
const char *label = menu_st->input_dialog_kb_label_setting;
if (!string_is_empty(label))
if (label && *label)
{
rarch_setting_t *setting = NULL;
if ((setting = menu_setting_find(label)))
@@ -2595,7 +2582,8 @@ static int setting_action_ok_bind_all_save_autoconfig(
map = settings->uints.input_joypad_index[index_offset];
name = input_config_get_device_name(map);
if ( !string_is_empty(name)
if ( name
&& *name
&& config_save_autoconf_profile(name, map))
{
int i;
@@ -2859,7 +2847,7 @@ static int setting_action_right_retropad_bind(
#if defined(HAVE_NETWORKING)
static void setting_action_ok_color_rgb_cb(void *userdata, const char *line)
{
if (!string_is_empty(line))
if (line && *line)
{
struct menu_state *menu_st = menu_state_get_ptr();
const char *label = menu_st->input_dialog_kb_label_setting;
@@ -6911,7 +6899,7 @@ static size_t setting_get_string_representation_uint_libretro_device(
break;
}
}
if (!string_is_empty(name))
if (name && *name)
return strlcpy(s, name, len);
return 0;
}
@@ -6956,7 +6944,7 @@ static size_t setting_get_string_representation_uint_analog_dpad_mode(
break;
}
if (!string_is_empty(name))
if (name && *name)
return strlcpy(s, name, len);
return 0;
}
@@ -8303,11 +8291,11 @@ static size_t get_string_representation_input_device_index(
_len = snprintf(s, len,
"#%u: %s",
map + 1,
!string_is_empty(device_name)
(device_name && *device_name)
? device_name
: msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE));
if (!string_is_empty(device_name))
if (device_name && *device_name)
{
unsigned idx = input_config_get_device_name_index(map);
@@ -8317,7 +8305,7 @@ static size_t get_string_representation_input_device_index(
}
}
if (string_is_empty(s))
if (s && *s)
_len = strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISABLED), len);
return _len;
}
@@ -8339,8 +8327,7 @@ static size_t get_string_representation_input_device_reservation_type(
return strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISABLED), len);
}
static size_t setting_get_string_representation_input_device_reserved_device_name(
rarch_setting_t *setting, char *s, size_t len)
static size_t setting_get_string_representation_input_device_reserved_device_name(rarch_setting_t *setting, char *s, size_t len)
{
unsigned int dev_vendor_id;
unsigned int dev_product_id;
@@ -8372,14 +8359,14 @@ static size_t get_string_representation_input_mouse_index(
_len = snprintf(s, len,
"#%u: %s",
map + 1,
!string_is_empty(device_name)
(device_name && *device_name)
? device_name
: (map > 0)
? msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE)
: msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DONT_CARE));
}
if (string_is_empty(s))
if (s && *s)
_len = strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISABLED), len);
return _len;
}
@@ -9234,8 +9221,9 @@ static void general_write_handler(rarch_setting_t *setting)
* force a cache refresh on the next
* core info initialisation */
if (*setting->value.target.boolean)
if (!core_info_cache_force_refresh(!string_is_empty(path_libretro_info)
? path_libretro_info : dir_libretro))
if (!core_info_cache_force_refresh(
(path_libretro_info && *path_libretro_info)
? path_libretro_info : dir_libretro))
{
const char *_msg = msg_hash_to_str(MSG_CORE_INFO_CACHE_UNSUPPORTED);
/* core_info_cache_force_refresh() will fail
@@ -10013,7 +10001,7 @@ static bool setting_append_list_input_player_options(
const char *input_desc_btn;
input_desc_btn = sys_info->input_desc_btn[user][i];
if (!string_is_empty(input_desc_btn))
if (input_desc_btn && *input_desc_btn)
{
char input_description[NAME_MAX_LENGTH];
/* > Up to RARCH_FIRST_CUSTOM_BIND, inputs