Reduce gotos in command.c/core_backup.c

This commit is contained in:
libretroadmin 2025-08-07 18:42:38 +02:00
parent 3aa8db2c08
commit 57cf4011ec
2 changed files with 175 additions and 199 deletions

181
command.c
View File

@ -294,42 +294,42 @@ static void stdin_command_free(command_t *handle)
static void command_stdin_poll(command_t *handle)
{
ptrdiff_t msg_len;
char *last_newline = NULL;
command_stdin_t *stdincmd = (command_stdin_t*)handle->userptr;
ssize_t ret = read_stdin(
stdincmd->stdin_buf + stdincmd->stdin_buf_ptr,
CMD_BUF_SIZE - stdincmd->stdin_buf_ptr - 1);
if (ret == 0)
return;
stdincmd->stdin_buf_ptr += ret;
stdincmd->stdin_buf[stdincmd->stdin_buf_ptr] = '\0';
last_newline = strrchr(stdincmd->stdin_buf, '\n');
if (!last_newline)
if (ret != 0)
{
/* We're receiving bogus data in pipe
* (no terminating newline), flush out the buffer. */
if (stdincmd->stdin_buf_ptr + 1 >= CMD_BUF_SIZE)
char *last_newline = NULL;
stdincmd->stdin_buf_ptr += ret;
stdincmd->stdin_buf[stdincmd->stdin_buf_ptr] = '\0';
last_newline = strrchr(stdincmd->stdin_buf, '\n');
if (!last_newline)
{
stdincmd->stdin_buf_ptr = 0;
stdincmd->stdin_buf[0] = '\0';
/* We're receiving bogus data in pipe
* (no terminating newline), flush out the buffer. */
if (stdincmd->stdin_buf_ptr + 1 >= CMD_BUF_SIZE)
{
stdincmd->stdin_buf_ptr = 0;
stdincmd->stdin_buf[0] = '\0';
}
}
else
{
ptrdiff_t msg_len;
*last_newline++ = '\0';
msg_len = last_newline - stdincmd->stdin_buf;
return;
command_parse_msg(handle, stdincmd->stdin_buf);
memmove(stdincmd->stdin_buf, last_newline,
stdincmd->stdin_buf_ptr - msg_len);
stdincmd->stdin_buf_ptr -= msg_len;
}
}
*last_newline++ = '\0';
msg_len = last_newline - stdincmd->stdin_buf;
command_parse_msg(handle, stdincmd->stdin_buf);
memmove(stdincmd->stdin_buf, last_newline,
stdincmd->stdin_buf_ptr - msg_len);
stdincmd->stdin_buf_ptr -= msg_len;
}
command_t* command_stdin_new(void)
@ -386,9 +386,8 @@ static void command_emscripten_poll(command_t *handle)
{
command_emscripten_t *emscriptencmd = (command_emscripten_t*)handle->userptr;
ptrdiff_t msg_len = platform_emscripten_command_read((char **)(&emscriptencmd->command_buf), CMD_BUF_SIZE);
if (msg_len == 0)
return;
command_parse_msg(handle, emscriptencmd->command_buf);
if (msg_len != 0)
command_parse_msg(handle, emscriptencmd->command_buf);
}
command_t* command_emscripten_new(void)
@ -419,9 +418,9 @@ bool command_get_config_param(command_t *cmd, const char* arg)
{
size_t _len;
char reply[8192];
#ifdef HAVE_BSV_MOVIE
#ifdef HAVE_BSV_MOVIE
char value_dynamic[256];
#endif
#endif
const char *value = "unsupported";
settings_t *settings = config_get_ptr();
bool video_fullscreen = settings->bools.video_fullscreen;
@ -590,13 +589,8 @@ command_t* command_uds_new(void)
strcpy(&addr.sun_path[1], "retroarch/cmd");
if ( bind(fd, (struct sockaddr*)&addr, addrsz) < 0
|| listen(fd, MAX_USER_CONNECTIONS) < 0)
{
socket_close(fd);
return NULL;
}
if (!socket_nonblock(fd))
|| listen(fd, MAX_USER_CONNECTIONS) < 0
|| !socket_nonblock(fd))
{
socket_close(fd);
return NULL;
@ -624,8 +618,7 @@ command_t* command_uds_new(void)
#ifdef HAVE_NETWORK_CMD
static bool command_verify(const char *cmd)
{
unsigned i;
size_t i;
if (command_get_arg(cmd, NULL, NULL))
return true;
@ -842,38 +835,37 @@ bool command_load_savefiles(command_t *cmd, const char* arg)
#if defined(HAVE_CHEEVOS)
bool command_read_ram(command_t *cmd, const char *arg)
{
unsigned i;
char *reply = NULL;
const uint8_t *data = NULL;
char *reply_at = NULL;
unsigned int nbytes = 0;
unsigned int alloc_size = 0;
unsigned int addr = -1;
size_t _len = 0;
unsigned int nbytes = 0;
unsigned int addr = -1;
if (sscanf(arg, "%x %u", &addr, &nbytes) != 2)
return true;
/* We allocate more than needed, saving 20 bytes is not really relevant */
alloc_size = 40 + nbytes * 3;
reply = (char*)malloc(alloc_size);
reply[0] = '\0';
reply_at = reply + snprintf(
reply, alloc_size - 1, "READ_CORE_RAM" " %x", addr);
if (sscanf(arg, "%x %u", &addr, &nbytes) == 2)
{
size_t _len = 0;
char *reply_at = NULL;
const uint8_t *data = NULL;
/* We allocate more than needed, saving 20 bytes is not really relevant */
unsigned int alloc_size = 40 + nbytes * 3;
char *reply = (char*)malloc(alloc_size);
reply[0] = '\0';
reply_at = reply + snprintf(
reply, alloc_size - 1, "READ_CORE_RAM" " %x", addr);
if ((data = rcheevos_patch_address(addr)))
{
for (i = 0; i < nbytes; i++)
snprintf(reply_at + 3 * i, 4, " %.2X", data[i]);
reply_at[3 * nbytes] = '\n';
_len = reply_at + 3 * nbytes + 1 - reply;
if ((data = rcheevos_patch_address(addr)))
{
size_t i;
for (i = 0; i < nbytes; i++)
snprintf(reply_at + 3 * i, 4, " %.2X", data[i]);
reply_at[3 * nbytes] = '\n';
_len = reply_at + 3 * nbytes + 1 - reply;
}
else
{
strlcpy(reply_at, " -1\n", sizeof(reply) - strlen(reply));
_len = reply_at + STRLEN_CONST(" -1\n") - reply;
}
cmd->replier(cmd, reply, _len);
free(reply);
}
else
{
strlcpy(reply_at, " -1\n", sizeof(reply) - strlen(reply));
_len = reply_at + STRLEN_CONST(" -1\n") - reply;
}
cmd->replier(cmd, reply, _len);
free(reply);
return true;
}
@ -1080,7 +1072,8 @@ bool command_write_memory(command_t *cmd, const char *arg)
const rarch_system_info_t
*sys_info = &runloop_st->system;
char *reply_at = reply + snprintf(reply, sizeof(reply) - 1, "WRITE_CORE_MEMORY %x", address);
uint8_t *data = command_memory_get_pointer(sys_info, address, &max_bytes, 1, reply_at, sizeof(reply) - strlen(reply) - 1);
uint8_t *data = command_memory_get_pointer(sys_info, address, &max_bytes, 1,
reply_at, sizeof(reply) - strlen(reply) - 1);
if (data)
{
@ -1123,15 +1116,10 @@ void command_event_set_volume(
configuration_set_float(settings, settings->floats.audio_volume, new_volume);
_len = strlcpy(msg, msg_hash_to_str(MSG_AUDIO_VOLUME),
sizeof(msg));
msg[_len ] = ':';
msg[++_len] = ' ';
msg[++_len] = '\0';
_len += strlcpy(msg + _len, ": ", sizeof(msg) - _len);
_len += snprintf(msg + _len, sizeof(msg) - _len, "%.1f",
new_volume);
msg[_len ] = ' ';
msg[++_len] = 'd';
msg[++_len] = 'B';
msg[++_len] = '\0';
_len += strlcpy(msg + _len, " dB", sizeof(msg) - _len);
#if defined(HAVE_GFX_WIDGETS)
if (widgets_active)
@ -1166,15 +1154,10 @@ void command_event_set_mixer_volume(
configuration_set_float(settings, settings->floats.audio_mixer_volume, new_volume);
_len = strlcpy(msg, msg_hash_to_str(MSG_AUDIO_VOLUME),
sizeof(msg));
msg[_len ] = ':';
msg[++_len] = ' ';
msg[++_len] = '\0';
_len += strlcpy(msg + _len, ": ", sizeof(msg) - _len);
_len += snprintf(msg + _len, sizeof(msg) - _len, "%.1f",
new_volume);
msg[_len ] = ' ';
msg[++_len] = 'd';
msg[++_len] = 'B';
msg[++_len] = '\0';
_len += strlcpy(msg + _len, " dB", sizeof(msg) - _len);
runloop_msg_queue_push(msg, _len, 1, 180, true, NULL,
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
@ -1191,7 +1174,7 @@ void command_event_init_controllers(rarch_system_info_t *sys_info,
for (port = 0; port < num_core_ports; port++)
{
unsigned i;
size_t i;
retro_ctx_controller_info_t pad;
unsigned device = RETRO_DEVICE_NONE;
const struct retro_controller_description *desc = NULL;
@ -1314,8 +1297,8 @@ static size_t command_event_undo_load_state(char *s, size_t len)
bool command_event_resize_windowed_scale(settings_t *settings,
unsigned window_scale)
{
unsigned idx = 0;
bool video_fullscreen = settings->bools.video_fullscreen;
unsigned idx = 0;
bool video_fullscreen = settings->bools.video_fullscreen;
if (window_scale == 0)
return false;
@ -1702,20 +1685,20 @@ void command_event_set_savestate_auto_index(settings_t *settings)
{
unsigned max_idx = 0;
bool savestate_auto_index = settings->bools.savestate_auto_index;
if (!savestate_auto_index)
if (savestate_auto_index)
{
command_scan_states(
settings->bools.show_hidden_files,
settings->uints.savestate_max_keep,
settings->ints.state_slot, &max_idx, NULL);
configuration_set_int(settings, settings->ints.state_slot, max_idx);
RARCH_LOG("[State] %s: #%d.\n",
msg_hash_to_str(MSG_FOUND_LAST_STATE_SLOT),
max_idx);
}
else
/* Reset savestate index to 0 when loading content. */
configuration_set_int(settings, settings->ints.state_slot, 0);
return;
}
command_scan_states(
settings->bools.show_hidden_files,
settings->uints.savestate_max_keep,
settings->ints.state_slot, &max_idx, NULL);
configuration_set_int(settings, settings->ints.state_slot, max_idx);
RARCH_LOG("[State] %s: #%d.\n",
msg_hash_to_str(MSG_FOUND_LAST_STATE_SLOT),
max_idx);
}
/**
@ -2154,8 +2137,6 @@ bool command_event_main_state(unsigned cmd)
then and now (not yet implemented); if the state is not part of
the replay, do nothing and log a warning.
*/
if (savestates_enabled)
{
switch (cmd)

View File

@ -173,67 +173,62 @@ enum core_backup_type core_backup_get_backup_type(const char *backup_path)
{
char core_ext[16];
const char *backup_ext = NULL;
struct string_list *metadata_list = NULL;
if (string_is_empty(backup_path) || !path_is_valid(backup_path))
goto error;
return CORE_BACKUP_TYPE_INVALID;
/* Get backup file extension */
backup_ext = path_get_extension(backup_path);
if (string_is_empty(backup_ext))
goto error;
/* Get platform-specific dynamic library extension */
if (!frontend_driver_get_core_extension(core_ext, sizeof(core_ext)))
goto error;
/* Check if this is an archived backup */
if (string_is_equal_noncase(backup_ext,
FILE_PATH_CORE_BACKUP_EXTENSION_NO_DOT))
if (!string_is_empty(backup_ext))
{
const char *backup_filename = NULL;
const char *src_ext = NULL;
/* Get platform-specific dynamic library extension */
if (frontend_driver_get_core_extension(core_ext, sizeof(core_ext)))
{
/* Check if this is an archived backup */
if (string_is_equal_noncase(backup_ext,
FILE_PATH_CORE_BACKUP_EXTENSION_NO_DOT))
{
bool ret = false;
struct string_list *metadata_list = NULL;
const char *backup_filename = NULL;
const char *src_ext = NULL;
/* Split the backup filename into its various
* metadata components */
backup_filename = path_basename(backup_path);
/* Split the backup filename into its various
* metadata components */
backup_filename = path_basename(backup_path);
if (string_is_empty(backup_filename))
goto error;
if (string_is_empty(backup_filename))
return CORE_BACKUP_TYPE_INVALID;
metadata_list = string_split(backup_filename, ".");
metadata_list = string_split(backup_filename, ".");
if (!metadata_list || (metadata_list->size != 6))
goto error;
if (!metadata_list)
return CORE_BACKUP_TYPE_INVALID;
/* Get extension of source core file */
src_ext = metadata_list->elems[1].data;
if (metadata_list->size != 6)
{
string_list_free(metadata_list);
metadata_list = NULL;
return CORE_BACKUP_TYPE_INVALID;
}
if (string_is_empty(src_ext))
goto error;
/* Check whether extension is valid */
if (!string_is_equal_noncase(src_ext, core_ext))
goto error;
string_list_free(metadata_list);
metadata_list = NULL;
return CORE_BACKUP_TYPE_ARCHIVE;
/* Get extension of source core file */
src_ext = metadata_list->elems[1].data;
ret = string_is_empty(src_ext)
|| !string_is_equal_noncase(src_ext, core_ext);
string_list_free(metadata_list);
metadata_list = NULL;
/* Check whether extension is valid */
if (ret)
return CORE_BACKUP_TYPE_INVALID;
return CORE_BACKUP_TYPE_ARCHIVE;
}
/* Check if this is a plain dynamic library file */
if (string_is_equal_noncase(backup_ext, core_ext))
return CORE_BACKUP_TYPE_LIB;
}
}
/* Check if this is a plain dynamic library file */
if (string_is_equal_noncase(backup_ext, core_ext))
return CORE_BACKUP_TYPE_LIB;
error:
if (metadata_list)
{
string_list_free(metadata_list);
metadata_list = NULL;
}
return CORE_BACKUP_TYPE_INVALID;
}
@ -242,7 +237,6 @@ error:
bool core_backup_get_backup_crc(char *s, uint32_t *crc)
{
enum core_backup_type backup_type;
struct string_list *metadata_list = NULL;
if (string_is_empty(s) || !crc)
return false;
@ -254,32 +248,39 @@ bool core_backup_get_backup_crc(char *s, uint32_t *crc)
{
case CORE_BACKUP_TYPE_ARCHIVE:
{
uint32_t val;
struct string_list *metadata_list = NULL;
bool ret = false;
const char *crc_str = NULL;
/* Split the backup filename into its various
* metadata components */
const char *backup_filename = path_basename(s);
if (string_is_empty(backup_filename))
goto error;
return false;
metadata_list = string_split(backup_filename, ".");
if (!metadata_list || (metadata_list->size != 6))
goto error;
if (!metadata_list)
return false;
if (metadata_list->size != 6)
{
string_list_free(metadata_list);
metadata_list = NULL;
return false;
}
/* Get crc string */
crc_str = metadata_list->elems[3].data;
if (string_is_empty(crc_str))
goto error;
ret = string_is_empty(crc_str);
/* Convert to an integer */
if ((*crc = (uint32_t)string_hex_to_unsigned(crc_str)) == 0)
goto error;
val = (uint32_t)string_hex_to_unsigned(crc_str);
string_list_free(metadata_list);
metadata_list = NULL;
if (ret || ((*crc = val) == 0))
return false;
}
return true;
case CORE_BACKUP_TYPE_LIB:
@ -315,13 +316,6 @@ bool core_backup_get_backup_crc(char *s, uint32_t *crc)
break;
}
error:
if (metadata_list)
{
string_list_free(metadata_list);
metadata_list = NULL;
}
return false;
}
@ -421,11 +415,14 @@ static bool core_backup_add_entry(core_backup_list_t *backup_list,
backup_filename = strdup(path_basename(backup_path));
if (string_is_empty(backup_filename))
goto error;
return false;
/* Ensure base backup filename matches core */
if (!string_starts_with(backup_filename, core_filename))
goto error;
{
free(backup_filename);
return false;
}
/* Remove backup file extension */
path_remove_extension(backup_filename);
@ -440,7 +437,10 @@ static bool core_backup_add_entry(core_backup_list_t *backup_list,
&entry->date.year, &entry->date.month, &entry->date.day,
&entry->date.hour, &entry->date.minute, &entry->date.second,
&crc, &backup_mode) != 8)
goto error;
{
free(backup_filename);
return false;
}
entry->crc = (uint32_t)crc;
entry->backup_mode = (enum core_backup_mode)backup_mode;
@ -452,12 +452,6 @@ static bool core_backup_add_entry(core_backup_list_t *backup_list,
free(backup_filename);
return true;
error:
if (backup_filename)
free(backup_filename);
return false;
}
/* Creates a new core backup list containing entries
@ -480,22 +474,22 @@ core_backup_list_t *core_backup_list_init(
/* Get core filename and parent directory */
if (string_is_empty(core_path))
goto error;
return NULL;
core_filename = path_basename(core_path);
if (string_is_empty(core_filename))
goto error;
return NULL;
fill_pathname_parent_dir(core_dir, core_path, sizeof(core_dir));
if (string_is_empty(core_dir))
goto error;
return NULL;
/* Get backup directory */
if (!core_backup_get_backup_dir(core_dir, dir_core_assets, core_filename,
backup_dir, sizeof(backup_dir)))
goto error;
return NULL;
/* Get backup file list */
dir_list = dir_list_new(
@ -509,30 +503,39 @@ core_backup_list_t *core_backup_list_init(
/* Sanity check */
if (!dir_list)
goto error;
return NULL;
if (dir_list->size < 1)
goto error;
{
string_list_free(dir_list);
return NULL;
}
/* Ensure list is sorted in alphabetical order
* > This corresponds to 'timestamp' order */
dir_list_sort(dir_list, true);
/* Create core backup list */
if (!(backup_list = (core_backup_list_t*)malloc(sizeof(*backup_list))))
goto error;
backup_list->entries = NULL;
backup_list->capacity = 0;
backup_list->size = 0;
/* Create entries array
* (Note: Set this to the full size of the directory
* list - this may be larger than we need, but saves
* many inefficiencies later) */
if (!(entries = (core_backup_list_entry_t*)
calloc(dir_list->size, sizeof(*entries))))
goto error;
{
string_list_free(dir_list);
return NULL;
}
/* Create core backup list */
if (!(backup_list = (core_backup_list_t*)malloc(sizeof(*backup_list))))
{
string_list_free(dir_list);
return NULL;
}
backup_list->entries = NULL;
backup_list->capacity = 0;
backup_list->size = 0;
backup_list->entries = entries;
backup_list->capacity = dir_list->size;
@ -544,20 +547,12 @@ core_backup_list_t *core_backup_list_init(
core_backup_add_entry(backup_list, core_filename, backup_path);
}
if (backup_list->size == 0)
goto error;
string_list_free(dir_list);
return backup_list;
error:
if (dir_list)
string_list_free(dir_list);
if (backup_list)
core_backup_list_free(backup_list);
if (backup_list->size != 0)
return backup_list;
core_backup_list_free(backup_list);
return NULL;
}