mirror of
https://github.com/libretro/RetroArch
synced 2025-04-09 21:45:45 +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)) ;
|
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 ;
|
return true ;
|
||||||
}
|
}
|
||||||
bool cheat_manager_copy_working_to_idx(unsigned idx)
|
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)) ;
|
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 ;
|
return true ;
|
||||||
}
|
}
|
||||||
static void cheat_manager_new(unsigned size)
|
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++)
|
for (i = 0; i < cheat_manager_state.size; i++)
|
||||||
{
|
{
|
||||||
cheat_manager_state.cheats[i].desc[0] = 0 ;
|
cheat_manager_state.cheats[i].desc = NULL ;
|
||||||
cheat_manager_state.cheats[i].code[0] = 0 ;
|
cheat_manager_state.cheats[i].code = NULL ;
|
||||||
cheat_manager_state.cheats[i].state = false;
|
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].idx = i ;
|
||||||
|
|
||||||
cheat_manager_state.cheats[i].desc[0] = 0 ;
|
cheat_manager_state.cheats[i].desc = NULL ;
|
||||||
cheat_manager_state.cheats[i].code[0] = 0 ;
|
cheat_manager_state.cheats[i].code = NULL ;
|
||||||
cheat_manager_state.cheats[i].state = false ;
|
cheat_manager_state.cheats[i].state = false ;
|
||||||
cheat_manager_state.cheats[i].big_endian = false ;
|
cheat_manager_state.cheats[i].big_endian = false ;
|
||||||
|
|
||||||
if (config_get_string(conf, desc_key, &tmp) && !string_is_empty(tmp))
|
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))
|
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))
|
if (config_get_bool(conf, enable_key, &tmp_bool))
|
||||||
cheat_manager_state.cheats[i].state = 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
|
else
|
||||||
{
|
{
|
||||||
orig_size = cheat_manager_state.size ;
|
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*)
|
cheat_manager_state.cheats = (struct item_cheat*)
|
||||||
realloc(cheat_manager_state.cheats, new_size * sizeof(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)
|
void cheat_manager_free(void)
|
||||||
{
|
{
|
||||||
|
unsigned i = 0 ;
|
||||||
|
|
||||||
if (cheat_manager_state.cheats)
|
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);
|
free(cheat_manager_state.cheats);
|
||||||
|
}
|
||||||
|
|
||||||
if ( cheat_manager_state.prev_memory_buf )
|
if ( cheat_manager_state.prev_memory_buf )
|
||||||
free(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",
|
snprintf(msg, sizeof(msg), "Cheat: #%u [%s]: %s",
|
||||||
handle_idx, handle->cheats[handle_idx].state ? "ON" : "OFF",
|
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)
|
(handle->cheats[handle_idx].desc) : (handle->cheats[handle_idx].code)
|
||||||
);
|
);
|
||||||
runloop_msg_queue_push(msg, 1, 180, true);
|
runloop_msg_queue_push(msg, 1, 180, true);
|
||||||
|
@ -76,15 +76,15 @@ enum cheat_rumble_type
|
|||||||
RUMBLE_TYPE_GT_VALUE
|
RUMBLE_TYPE_GT_VALUE
|
||||||
};
|
};
|
||||||
|
|
||||||
#define CHEAT_CODE_SIZE 100
|
#define CHEAT_CODE_SCRATCH_SIZE 100
|
||||||
#define CHEAT_DESC_SIZE 100
|
#define CHEAT_DESC_SCRATCH_SIZE 255
|
||||||
|
|
||||||
struct item_cheat
|
struct item_cheat
|
||||||
{
|
{
|
||||||
unsigned int idx;
|
unsigned int idx;
|
||||||
char desc[CHEAT_DESC_SIZE];
|
char *desc;
|
||||||
bool state;
|
bool state;
|
||||||
char code[CHEAT_CODE_SIZE];
|
char *code;
|
||||||
unsigned int handler ;
|
unsigned int handler ;
|
||||||
/* Number of bits = 2^memory_search_size
|
/* Number of bits = 2^memory_search_size
|
||||||
* 0=1, 1=2, 2=4, 3=8, 4=16, 5=32
|
* 0=1, 1=2, 2=4, 3=8, 4=16, 5=32
|
||||||
@ -154,6 +154,8 @@ struct cheat_manager
|
|||||||
bool memory_search_initialized ;
|
bool memory_search_initialized ;
|
||||||
unsigned int delete_state ;
|
unsigned int delete_state ;
|
||||||
unsigned browse_address;
|
unsigned browse_address;
|
||||||
|
char working_desc[CHEAT_DESC_SCRATCH_SIZE] ;
|
||||||
|
char working_code[CHEAT_CODE_SCRATCH_SIZE] ;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct cheat_manager cheat_manager_t;
|
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;
|
*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);
|
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 )) ;
|
memcpy(&tmp, &cheat_manager_state.cheats[cheat_manager_state.working_cheat.idx], sizeof(struct item_cheat )) ;
|
||||||
tmp.idx = cheat_manager_state.working_cheat.idx ;
|
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--)
|
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 )) ;
|
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 ;
|
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--)
|
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 )
|
if( new_size >0 )
|
||||||
{
|
{
|
||||||
unsigned i;
|
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++)
|
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 )) ;
|
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[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);
|
cheat_manager_realloc(new_size, CHEAT_HANDLER_TYPE_RETRO);
|
||||||
|
@ -3375,8 +3375,8 @@ static bool setting_append_list(
|
|||||||
|
|
||||||
CONFIG_STRING(
|
CONFIG_STRING(
|
||||||
list, list_info,
|
list, list_info,
|
||||||
cheat_manager_state.working_cheat.desc,
|
cheat_manager_state.working_desc,
|
||||||
sizeof(cheat_manager_state.working_cheat.desc),
|
sizeof(cheat_manager_state.working_desc),
|
||||||
MENU_ENUM_LABEL_CHEAT_DESC,
|
MENU_ENUM_LABEL_CHEAT_DESC,
|
||||||
MENU_ENUM_LABEL_VALUE_CHEAT_DESC,
|
MENU_ENUM_LABEL_VALUE_CHEAT_DESC,
|
||||||
"",
|
"",
|
||||||
@ -3394,8 +3394,8 @@ static bool setting_append_list(
|
|||||||
|
|
||||||
CONFIG_STRING(
|
CONFIG_STRING(
|
||||||
list, list_info,
|
list, list_info,
|
||||||
cheat_manager_state.working_cheat.code,
|
cheat_manager_state.working_code,
|
||||||
sizeof(cheat_manager_state.working_cheat.code),
|
sizeof(cheat_manager_state.working_code),
|
||||||
MENU_ENUM_LABEL_CHEAT_CODE,
|
MENU_ENUM_LABEL_CHEAT_CODE,
|
||||||
MENU_ENUM_LABEL_VALUE_CHEAT_CODE,
|
MENU_ENUM_LABEL_VALUE_CHEAT_CODE,
|
||||||
"",
|
"",
|
||||||
@ -3404,7 +3404,6 @@ static bool setting_append_list(
|
|||||||
parent_group,
|
parent_group,
|
||||||
general_write_handler,
|
general_write_handler,
|
||||||
general_read_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,
|
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,
|
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:
|
||||||
case ST_STRING_OPTIONS:
|
case ST_STRING_OPTIONS:
|
||||||
case ST_ACTION:
|
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;
|
break;
|
||||||
case ST_BOOL:
|
case ST_BOOL:
|
||||||
if (string_is_equal(value, "true"))
|
if (string_is_equal(value, "true"))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user