mirror of
https://github.com/libretro/RetroArch.git
synced 2026-11-08 08:10:30 -10:00
(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:
1 parent
8f27f13d92
commit
d6b974c007
1 file changed
+65
-77
+65
-77
@@ -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
|
||||
|
||||
Reference in new issue
Block a user