mirror of
https://github.com/libretro/RetroArch
synced 2025-03-30 07:20:36 +00:00
Merge pull request #7041 from RetroSven/master
bugfix for very long code values - allow for any length
This commit is contained in:
commit
b0e8775b55
@ -233,6 +233,16 @@ bool cheat_manager_copy_idx_to_working(unsigned idx)
|
||||
}
|
||||
|
||||
memcpy(&(cheat_manager_state.working_cheat), &(cheat_manager_state.cheats[idx]), sizeof(struct item_cheat)) ;
|
||||
if ( cheat_manager_state.cheats[idx].desc != NULL )
|
||||
strlcpy(cheat_manager_state.working_desc, cheat_manager_state.cheats[idx].desc, CHEAT_DESC_SCRATCH_SIZE) ;
|
||||
else
|
||||
cheat_manager_state.working_desc[0] = '\0' ;
|
||||
|
||||
if ( cheat_manager_state.cheats[idx].code != NULL )
|
||||
strlcpy(cheat_manager_state.working_code, cheat_manager_state.cheats[idx].code, CHEAT_CODE_SCRATCH_SIZE) ;
|
||||
else
|
||||
cheat_manager_state.working_code[0] = '\0' ;
|
||||
|
||||
return true ;
|
||||
}
|
||||
bool cheat_manager_copy_working_to_idx(unsigned idx)
|
||||
@ -243,6 +253,10 @@ bool cheat_manager_copy_working_to_idx(unsigned idx)
|
||||
}
|
||||
|
||||
memcpy(&(cheat_manager_state.cheats[idx]), &(cheat_manager_state.working_cheat), sizeof(struct item_cheat)) ;
|
||||
if ( cheat_manager_state.cheats[idx].desc != NULL )
|
||||
free(cheat_manager_state.cheats[idx].desc) ;
|
||||
|
||||
cheat_manager_state.cheats[idx].desc = strdup(cheat_manager_state.working_desc) ;
|
||||
return true ;
|
||||
}
|
||||
static void cheat_manager_new(unsigned size)
|
||||
@ -268,8 +282,8 @@ static void cheat_manager_new(unsigned size)
|
||||
|
||||
for (i = 0; i < cheat_manager_state.size; i++)
|
||||
{
|
||||
cheat_manager_state.cheats[i].desc[0] = 0 ;
|
||||
cheat_manager_state.cheats[i].code[0] = 0 ;
|
||||
cheat_manager_state.cheats[i].desc = NULL ;
|
||||
cheat_manager_state.cheats[i].code = NULL ;
|
||||
cheat_manager_state.cheats[i].state = false;
|
||||
}
|
||||
|
||||
@ -362,16 +376,16 @@ bool cheat_manager_load(const char *path, bool append)
|
||||
|
||||
cheat_manager_state.cheats[i].idx = i ;
|
||||
|
||||
cheat_manager_state.cheats[i].desc[0] = 0 ;
|
||||
cheat_manager_state.cheats[i].code[0] = 0 ;
|
||||
cheat_manager_state.cheats[i].desc = NULL ;
|
||||
cheat_manager_state.cheats[i].code = NULL ;
|
||||
cheat_manager_state.cheats[i].state = false ;
|
||||
cheat_manager_state.cheats[i].big_endian = false ;
|
||||
|
||||
if (config_get_string(conf, desc_key, &tmp) && !string_is_empty(tmp))
|
||||
strcpy(cheat_manager_state.cheats[i].desc,tmp) ;
|
||||
cheat_manager_state.cheats[i].desc = strdup(tmp) ;
|
||||
|
||||
if (config_get_string(conf, code_key, &tmp) && !string_is_empty(tmp))
|
||||
strcpy(cheat_manager_state.cheats[i].code,tmp) ;
|
||||
cheat_manager_state.cheats[i].code = strdup(tmp) ;
|
||||
|
||||
if (config_get_bool(conf, enable_key, &tmp_bool))
|
||||
cheat_manager_state.cheats[i].state = tmp_bool;
|
||||
@ -420,6 +434,16 @@ bool cheat_manager_realloc(unsigned new_size, unsigned default_handler)
|
||||
else
|
||||
{
|
||||
orig_size = cheat_manager_state.size ;
|
||||
|
||||
/* if size is decreasing, free the items that will be lost */
|
||||
for (i = new_size; i < orig_size; i++)
|
||||
{
|
||||
if ( cheat_manager_state.cheats[i].code != NULL )
|
||||
free(cheat_manager_state.cheats[i].code) ;
|
||||
if ( cheat_manager_state.cheats[i].desc != NULL )
|
||||
free(cheat_manager_state.cheats[i].desc) ;
|
||||
}
|
||||
|
||||
cheat_manager_state.cheats = (struct item_cheat*)
|
||||
realloc(cheat_manager_state.cheats, new_size * sizeof(struct item_cheat));
|
||||
}
|
||||
@ -449,8 +473,20 @@ bool cheat_manager_realloc(unsigned new_size, unsigned default_handler)
|
||||
|
||||
void cheat_manager_free(void)
|
||||
{
|
||||
unsigned i = 0 ;
|
||||
|
||||
if (cheat_manager_state.cheats)
|
||||
{
|
||||
for (i = 0; i < cheat_manager_state.size; i++)
|
||||
{
|
||||
if ( cheat_manager_state.cheats[i].desc != NULL )
|
||||
free(cheat_manager_state.cheats[i].desc) ;
|
||||
if ( cheat_manager_state.cheats[i].code != NULL )
|
||||
free(cheat_manager_state.cheats[i].code) ;
|
||||
}
|
||||
|
||||
free(cheat_manager_state.cheats);
|
||||
}
|
||||
|
||||
if ( cheat_manager_state.prev_memory_buf )
|
||||
free(cheat_manager_state.prev_memory_buf) ;
|
||||
@ -480,7 +516,7 @@ void cheat_manager_update(cheat_manager_t *handle, unsigned handle_idx)
|
||||
|
||||
snprintf(msg, sizeof(msg), "Cheat: #%u [%s]: %s",
|
||||
handle_idx, handle->cheats[handle_idx].state ? "ON" : "OFF",
|
||||
(handle->cheats[handle_idx].desc[0]) ?
|
||||
(handle->cheats[handle_idx].desc!=NULL) ?
|
||||
(handle->cheats[handle_idx].desc) : (handle->cheats[handle_idx].code)
|
||||
);
|
||||
runloop_msg_queue_push(msg, 1, 180, true);
|
||||
|
@ -76,15 +76,15 @@ enum cheat_rumble_type
|
||||
RUMBLE_TYPE_GT_VALUE
|
||||
};
|
||||
|
||||
#define CHEAT_CODE_SIZE 100
|
||||
#define CHEAT_DESC_SIZE 100
|
||||
#define CHEAT_CODE_SCRATCH_SIZE 100
|
||||
#define CHEAT_DESC_SCRATCH_SIZE 255
|
||||
|
||||
struct item_cheat
|
||||
{
|
||||
unsigned int idx;
|
||||
char desc[CHEAT_DESC_SIZE];
|
||||
char *desc;
|
||||
bool state;
|
||||
char code[CHEAT_CODE_SIZE];
|
||||
char *code;
|
||||
unsigned int handler ;
|
||||
/* Number of bits = 2^memory_search_size
|
||||
* 0=1, 1=2, 2=4, 3=8, 4=16, 5=32
|
||||
@ -154,6 +154,8 @@ struct cheat_manager
|
||||
bool memory_search_initialized ;
|
||||
unsigned int delete_state ;
|
||||
unsigned browse_address;
|
||||
char working_desc[CHEAT_DESC_SCRATCH_SIZE] ;
|
||||
char working_code[CHEAT_CODE_SCRATCH_SIZE] ;
|
||||
};
|
||||
|
||||
typedef struct cheat_manager cheat_manager_t;
|
||||
|
@ -1887,7 +1887,8 @@ static void menu_action_setting_disp_set_label_setting_string(file_list_t* list,
|
||||
|
||||
*w = 19;
|
||||
|
||||
strlcpy(s, setting->value.target.string, len);
|
||||
if ( setting->value.target.string != NULL )
|
||||
strlcpy(s, setting->value.target.string, len);
|
||||
|
||||
strlcpy(s2, path, len2);
|
||||
}
|
||||
|
@ -2818,6 +2818,10 @@ static int action_ok_cheat_copy_before(const char *path,
|
||||
|
||||
memcpy(&tmp, &cheat_manager_state.cheats[cheat_manager_state.working_cheat.idx], sizeof(struct item_cheat )) ;
|
||||
tmp.idx = cheat_manager_state.working_cheat.idx ;
|
||||
if ( tmp.code != NULL )
|
||||
tmp.code = strdup(tmp.code) ;
|
||||
if ( tmp.desc != NULL )
|
||||
tmp.desc = strdup(tmp.desc) ;
|
||||
|
||||
for (i = cheat_manager_state.size-2 ; i >=(int)tmp.idx ; i--)
|
||||
{
|
||||
@ -2853,6 +2857,10 @@ static int action_ok_cheat_copy_after(const char *path,
|
||||
|
||||
memcpy(&tmp, &cheat_manager_state.cheats[cheat_manager_state.working_cheat.idx], sizeof(struct item_cheat )) ;
|
||||
tmp.idx = cheat_manager_state.working_cheat.idx+1 ;
|
||||
if ( tmp.code != NULL )
|
||||
tmp.code = strdup(tmp.code) ;
|
||||
if ( tmp.desc != NULL )
|
||||
tmp.desc = strdup(tmp.desc) ;
|
||||
|
||||
for (i = cheat_manager_state.size-2 ; i >= (int)(cheat_manager_state.working_cheat.idx+1); i--)
|
||||
{
|
||||
@ -2884,11 +2892,23 @@ static int action_ok_cheat_delete(const char *path,
|
||||
if( new_size >0 )
|
||||
{
|
||||
unsigned i;
|
||||
if ( cheat_manager_state.cheats[cheat_manager_state.working_cheat.idx].code != NULL )
|
||||
{
|
||||
free(cheat_manager_state.cheats[cheat_manager_state.working_cheat.idx].code) ;
|
||||
cheat_manager_state.cheats[cheat_manager_state.working_cheat.idx].code = NULL ;
|
||||
}
|
||||
if ( cheat_manager_state.cheats[cheat_manager_state.working_cheat.idx].desc != NULL )
|
||||
{
|
||||
free(cheat_manager_state.cheats[cheat_manager_state.working_cheat.idx].desc) ;
|
||||
cheat_manager_state.cheats[cheat_manager_state.working_cheat.idx].desc = NULL ;
|
||||
}
|
||||
for (i = cheat_manager_state.working_cheat.idx ; i <cheat_manager_state.size-1 ; i++)
|
||||
{
|
||||
memcpy(&cheat_manager_state.cheats[i], &cheat_manager_state.cheats[i+1], sizeof(struct item_cheat )) ;
|
||||
cheat_manager_state.cheats[i].idx-- ;
|
||||
}
|
||||
cheat_manager_state.cheats[cheat_manager_state.size-1].code = NULL ;
|
||||
cheat_manager_state.cheats[cheat_manager_state.size-1].desc = NULL ;
|
||||
}
|
||||
|
||||
cheat_manager_realloc(new_size, CHEAT_HANDLER_TYPE_RETRO);
|
||||
|
@ -3375,8 +3375,8 @@ static bool setting_append_list(
|
||||
|
||||
CONFIG_STRING(
|
||||
list, list_info,
|
||||
cheat_manager_state.working_cheat.desc,
|
||||
sizeof(cheat_manager_state.working_cheat.desc),
|
||||
cheat_manager_state.working_desc,
|
||||
sizeof(cheat_manager_state.working_desc),
|
||||
MENU_ENUM_LABEL_CHEAT_DESC,
|
||||
MENU_ENUM_LABEL_VALUE_CHEAT_DESC,
|
||||
"",
|
||||
@ -3394,8 +3394,8 @@ static bool setting_append_list(
|
||||
|
||||
CONFIG_STRING(
|
||||
list, list_info,
|
||||
cheat_manager_state.working_cheat.code,
|
||||
sizeof(cheat_manager_state.working_cheat.code),
|
||||
cheat_manager_state.working_code,
|
||||
sizeof(cheat_manager_state.working_code),
|
||||
MENU_ENUM_LABEL_CHEAT_CODE,
|
||||
MENU_ENUM_LABEL_VALUE_CHEAT_CODE,
|
||||
"",
|
||||
@ -3404,7 +3404,6 @@ static bool setting_append_list(
|
||||
parent_group,
|
||||
general_write_handler,
|
||||
general_read_handler);
|
||||
settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT);
|
||||
|
||||
config_uint_cbs(cheat_manager_state.working_cheat.memory_search_size, CHEAT_MEMORY_SEARCH_SIZE,
|
||||
setting_uint_action_left_with_refresh,setting_uint_action_right_with_refresh,
|
||||
|
@ -557,7 +557,8 @@ int setting_set_with_string_representation(rarch_setting_t* setting,
|
||||
case ST_STRING:
|
||||
case ST_STRING_OPTIONS:
|
||||
case ST_ACTION:
|
||||
strlcpy(setting->value.target.string, value, setting->size);
|
||||
if ( setting->value.target.string != NULL)
|
||||
strlcpy(setting->value.target.string, value, setting->size);
|
||||
break;
|
||||
case ST_BOOL:
|
||||
if (string_is_equal(value, "true"))
|
||||
|
Loading…
x
Reference in New Issue
Block a user