From 57cf4011ec15f93dbc05e15ffa31d5e84614d875 Mon Sep 17 00:00:00 2001 From: libretroadmin Date: Thu, 7 Aug 2025 18:42:38 +0200 Subject: [PATCH] Reduce gotos in command.c/core_backup.c --- command.c | 181 +++++++++++++++++++++------------------------- core_backup.c | 193 ++++++++++++++++++++++++-------------------------- 2 files changed, 175 insertions(+), 199 deletions(-) diff --git a/command.c b/command.c index b942024b63..0ba94dc42c 100644 --- a/command.c +++ b/command.c @@ -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) diff --git a/core_backup.c b/core_backup.c index d7e2218ba7..7cc7a9727f 100644 --- a/core_backup.c +++ b/core_backup.c @@ -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; }