From 9fd4ff7a8da566165cb749479ba8bc86101ee4f7 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 16 Sep 2019 16:57:50 +0200 Subject: [PATCH] (Cheat manager) - Cleanups - Functional improvement: don't attempt to create the 'core directory' inside the cheats directory for game-specific cheats when we are only trying to load the cheat - if we are loading and the directory doesn't exist, that means the cheat file doesn't exist either --- managers/cheat_manager.c | 222 ++++++++++++++++++++++----------------- 1 file changed, 123 insertions(+), 99 deletions(-) diff --git a/managers/cheat_manager.c b/managers/cheat_manager.c index bbd5b41f2c..4121eab91f 100644 --- a/managers/cheat_manager.c +++ b/managers/cheat_manager.c @@ -647,15 +647,17 @@ bool cheat_manager_get_code_state(unsigned i) return cheat_manager_state.cheats[i].state; } -bool cheat_manager_get_game_specific_filename(char * cheat_filename, size_t max_length) +static bool cheat_manager_get_game_specific_filename( + char *s, size_t len, + bool saving) { - settings_t *settings = config_get_ptr(); - global_t *global = global_get_ptr(); - const char *core_name = NULL; - const char *game_name = NULL; struct retro_system_info system_info; + settings_t *settings = config_get_ptr(); + global_t *global = global_get_ptr(); + const char *core_name = NULL; + const char *game_name = NULL; - if (!settings || !global || !cheat_filename) + if (!settings || !global) return false; if (!core_get_system_info(&system_info)) @@ -669,35 +671,47 @@ bool cheat_manager_get_game_specific_filename(char * cheat_filename, size_t max_ string_is_empty(game_name)) return false; - cheat_filename[0] = '\0'; - strlcat(cheat_filename, settings->paths.path_cheat_database, max_length); - fill_pathname_slash(cheat_filename, max_length); - strlcat(cheat_filename, core_name, max_length); - fill_pathname_slash(cheat_filename, max_length); + s[0] = '\0'; - if (!path_is_valid(cheat_filename)) - path_mkdir(cheat_filename); + fill_pathname_join(s, + settings->paths.path_cheat_database, core_name, + len); - strlcat(cheat_filename, game_name, max_length); + if (saving) + { + /* Check if directory is valid, if not, create it */ + if (!path_is_valid(s)) + path_mkdir(s); + } + + fill_pathname_slash(s, len); + strlcat(s, game_name, len); return true; - } -void cheat_manager_load_game_specific_cheats() + +void cheat_manager_load_game_specific_cheats(void) { char cheat_file[PATH_MAX_LENGTH]; - if (cheat_manager_get_game_specific_filename(cheat_file, PATH_MAX_LENGTH)) + if (cheat_manager_get_game_specific_filename( + cheat_file, sizeof(cheat_file), false)) + { + RARCH_LOG("[Cheats]: Load game-specific cheatfile: %s\n", cheat_file); cheat_manager_load(cheat_file, true); - + } } -void cheat_manager_save_game_specific_cheats() + +void cheat_manager_save_game_specific_cheats(void) { char cheat_file[PATH_MAX_LENGTH]; - if (cheat_manager_get_game_specific_filename(cheat_file, PATH_MAX_LENGTH)) + if (cheat_manager_get_game_specific_filename( + cheat_file, sizeof(cheat_file), true)) + { + RARCH_LOG("[Cheats]: Save game-specific cheatfile: %s\n", cheat_file); cheat_manager_save(cheat_file, NULL, true); - + } } void cheat_manager_state_free(void) @@ -717,14 +731,14 @@ int cheat_manager_initialize_memory(rarch_setting_t *setting, bool wraparound) { unsigned i; retro_ctx_memory_info_t meminfo; - bool refresh = false; - bool is_search_initialization = (setting != NULL); - rarch_system_info_t *system = runloop_get_system_info(); - unsigned offset = 0; + bool refresh = false; + bool is_search_initialization = (setting != NULL); + rarch_system_info_t *system = runloop_get_system_info(); + unsigned offset = 0; cheat_manager_state.num_memory_buffers = 0; - cheat_manager_state.total_memory_size = 0; - cheat_manager_state.curr_memory_buf = NULL; + cheat_manager_state.total_memory_size = 0; + cheat_manager_state.curr_memory_buf = NULL; if (cheat_manager_state.memory_buf_list) { @@ -751,7 +765,8 @@ int cheat_manager_initialize_memory(rarch_setting_t *setting, bool wraparound) if (!cheat_manager_state.memory_buf_list) cheat_manager_state.memory_buf_list = (uint8_t**)calloc(1, sizeof(uint8_t *)); else - cheat_manager_state.memory_buf_list = (uint8_t**)realloc(cheat_manager_state.memory_buf_list, sizeof(uint8_t *) * cheat_manager_state.num_memory_buffers); + cheat_manager_state.memory_buf_list = (uint8_t**)realloc( + cheat_manager_state.memory_buf_list, sizeof(uint8_t *) * cheat_manager_state.num_memory_buffers); if (!cheat_manager_state.memory_size_list) cheat_manager_state.memory_size_list = (unsigned*)calloc(1, sizeof(unsigned)); @@ -889,36 +904,36 @@ static void cheat_manager_setup_search_meta(unsigned int bitsize, unsigned int * { switch (bitsize) { - case 0: - *bytes_per_item = 1; - *bits = 1; - *mask = 0x01; - break; - case 1: - *bytes_per_item = 1; - *bits = 2; - *mask = 0x03; - break; - case 2: - *bytes_per_item = 1; - *bits = 4; - *mask = 0x0F; - break; - case 3: - *bytes_per_item = 1; - *bits = 8; - *mask = 0xFF; - break; - case 4: - *bytes_per_item = 2; - *bits = 8; - *mask = 0xFFFF; - break; - case 5: - *bytes_per_item = 4; - *bits = 8; - *mask = 0xFFFFFFFF; - break; + case 0: + *bytes_per_item = 1; + *bits = 1; + *mask = 0x01; + break; + case 1: + *bytes_per_item = 1; + *bits = 2; + *mask = 0x03; + break; + case 2: + *bytes_per_item = 1; + *bits = 4; + *mask = 0x0F; + break; + case 3: + *bytes_per_item = 1; + *bits = 8; + *mask = 0xFF; + break; + case 4: + *bytes_per_item = 2; + *bits = 8; + *mask = 0xFFFF; + break; + case 5: + *bytes_per_item = 4; + *bits = 8; + *mask = 0xFFFFFFFF; + break; } } @@ -926,34 +941,42 @@ int cheat_manager_search_exact(rarch_setting_t *setting, bool wraparound) { return cheat_manager_search(CHEAT_SEARCH_TYPE_EXACT); } + int cheat_manager_search_lt(rarch_setting_t *setting, bool wraparound) { return cheat_manager_search(CHEAT_SEARCH_TYPE_LT); } + int cheat_manager_search_gt(rarch_setting_t *setting, bool wraparound) { return cheat_manager_search(CHEAT_SEARCH_TYPE_GT); } + int cheat_manager_search_lte(rarch_setting_t *setting, bool wraparound) { return cheat_manager_search(CHEAT_SEARCH_TYPE_LTE); } + int cheat_manager_search_gte(rarch_setting_t *setting, bool wraparound) { return cheat_manager_search(CHEAT_SEARCH_TYPE_GTE); } + int cheat_manager_search_eq(rarch_setting_t *setting, bool wraparound) { return cheat_manager_search(CHEAT_SEARCH_TYPE_EQ); } + int cheat_manager_search_neq(rarch_setting_t *setting, bool wraparound) { return cheat_manager_search(CHEAT_SEARCH_TYPE_NEQ); } + int cheat_manager_search_eqplus(rarch_setting_t *setting, bool wraparound) { return cheat_manager_search(CHEAT_SEARCH_TYPE_EQPLUS); } + int cheat_manager_search_eqminus(rarch_setting_t *setting, bool wraparound) { return cheat_manager_search(CHEAT_SEARCH_TYPE_EQMINUS); @@ -991,27 +1014,27 @@ int cheat_manager_search(enum cheat_search_type search_type) switch (bytes_per_item) { - case 2: - curr_val = cheat_manager_state.big_endian ? + case 2: + curr_val = cheat_manager_state.big_endian ? (*(curr + idx - offset) * 256) + *(curr + idx + 1 - offset) : *(curr + idx - offset) + (*(curr + idx + 1 - offset) * 256); - prev_val = cheat_manager_state.big_endian ? + prev_val = cheat_manager_state.big_endian ? (*(prev + idx) * 256) + *(prev + idx + 1) : *(prev + idx) + (*(prev + idx + 1) * 256); - break; - case 4: - curr_val = cheat_manager_state.big_endian ? + break; + case 4: + curr_val = cheat_manager_state.big_endian ? (*(curr + idx - offset) * 256 * 256 * 256) + (*(curr + idx + 1 - offset) * 256 * 256) + (*(curr + idx + 2 - offset) * 256) + *(curr + idx + 3 - offset) : *(curr + idx - offset) + (*(curr + idx + 1 - offset) * 256) + (*(curr + idx + 2 - offset) * 256 * 256) + (*(curr + idx + 3 - offset) * 256 * 256 * 256); - prev_val = cheat_manager_state.big_endian ? + prev_val = cheat_manager_state.big_endian ? (*(prev + idx) * 256 * 256 * 256) + (*(prev + idx + 1) * 256 * 256) + (*(prev + idx + 2) * 256) + *(prev + idx + 3) : *(prev + idx) + (*(prev + idx + 1) * 256) + (*(prev + idx + 2) * 256 * 256) + (*(prev + idx + 3) * 256 * 256 * 256); - break; - case 1: - default: - curr_val = *(curr - offset + idx); - prev_val = *(prev + idx); - break; + break; + case 1: + default: + curr_val = *(curr - offset + idx); + prev_val = *(prev + idx); + break; } for (byte_part = 0; byte_part < 8 / bits; byte_part++) @@ -1030,39 +1053,40 @@ int cheat_manager_search(enum cheat_search_type search_type) bool match = false; switch (search_type) { - case CHEAT_SEARCH_TYPE_EXACT: - match = (curr_subval == cheat_manager_state.search_exact_value); - break; - case CHEAT_SEARCH_TYPE_LT: - match = (curr_subval < prev_subval); - break; - case CHEAT_SEARCH_TYPE_GT: - match = (curr_subval > prev_subval); - break; - case CHEAT_SEARCH_TYPE_LTE: - match = (curr_subval <= prev_subval); - break; - case CHEAT_SEARCH_TYPE_GTE: - match = (curr_subval >= prev_subval); - break; - case CHEAT_SEARCH_TYPE_EQ: - match = (curr_subval == prev_subval); - break; - case CHEAT_SEARCH_TYPE_NEQ: - match = (curr_subval != prev_subval); - break; - case CHEAT_SEARCH_TYPE_EQPLUS: - match = (curr_subval == prev_subval + cheat_manager_state.search_eqplus_value); - break; - case CHEAT_SEARCH_TYPE_EQMINUS: - match = (curr_subval == prev_subval - cheat_manager_state.search_eqminus_value); - break; + case CHEAT_SEARCH_TYPE_EXACT: + match = (curr_subval == cheat_manager_state.search_exact_value); + break; + case CHEAT_SEARCH_TYPE_LT: + match = (curr_subval < prev_subval); + break; + case CHEAT_SEARCH_TYPE_GT: + match = (curr_subval > prev_subval); + break; + case CHEAT_SEARCH_TYPE_LTE: + match = (curr_subval <= prev_subval); + break; + case CHEAT_SEARCH_TYPE_GTE: + match = (curr_subval >= prev_subval); + break; + case CHEAT_SEARCH_TYPE_EQ: + match = (curr_subval == prev_subval); + break; + case CHEAT_SEARCH_TYPE_NEQ: + match = (curr_subval != prev_subval); + break; + case CHEAT_SEARCH_TYPE_EQPLUS: + match = (curr_subval == prev_subval + cheat_manager_state.search_eqplus_value); + break; + case CHEAT_SEARCH_TYPE_EQMINUS: + match = (curr_subval == prev_subval - cheat_manager_state.search_eqminus_value); + break; } + if (!match) { if (bits < 8) *(cheat_manager_state.matches + idx) = *(cheat_manager_state.matches + idx) & - ((~(mask << (byte_part * bits))) & 0xFF); + ((~(mask << (byte_part * bits))) & 0xFF); else memset(cheat_manager_state.matches + idx, 0, bytes_per_item); if (cheat_manager_state.num_matches > 0)