(task_database_cue.c) Simplifications:

- unsafe strcpy/strcat/sprintf were used, so pass 'len' parameters
to detect_{system} functions so that we can use the safer strlcpy/strlcat
calls instead
- thanks to strlcat/strlcpy return values, we can do less string concatenations
and get the same results
- some other miscellanous cleanups
This commit is contained in:
LibretroAdmin 2022-08-24 16:08:06 +02:00
parent fdc563e6f7
commit f2d8b67f23
2 changed files with 254 additions and 186 deletions

View File

@ -82,13 +82,13 @@ int gdi_find_track(const char *gdi_path, bool first,
bool gdi_next_file(intfstream_t *fd, const char *gdi_path,
char *path, uint64_t max_len);
int detect_system(intfstream_t *fd, const char** system_name, const char *filename);
int detect_ps1_game(intfstream_t *fd, char *serial, const char *filename);
int detect_psp_game(intfstream_t *fd, char *serial, const char *filename);
int detect_gc_game(intfstream_t *fd, char *serial, const char *filename);
int detect_scd_game(intfstream_t *fd, char *serial, const char *filename);
int detect_sat_game(intfstream_t *fd, char *serial, const char *filename);
int detect_dc_game(intfstream_t *fd, char *serial, const char *filename);
int detect_wii_game(intfstream_t *fd, char *serial, const char *filename);
int detect_ps1_game(intfstream_t *fd, char *serial, size_t serial_len, const char *filename);
int detect_psp_game(intfstream_t *fd, char *serial, size_t serial_len, const char *filename);
int detect_gc_game(intfstream_t *fd, char *serial, size_t serial_len, const char *filename);
int detect_scd_game(intfstream_t *fd, char *serial, size_t serial_len, const char *filename);
int detect_sat_game(intfstream_t *fd, char *serial, size_t serial_len, const char *filename);
int detect_dc_game(intfstream_t *fd, char *serial, size_t serial_len, const char *filename);
int detect_wii_game(intfstream_t *fd, char *serial, size_t serial_len, const char *filename);
static const char *database_info_get_current_name(
database_state_handle_t *handle)
@ -148,44 +148,44 @@ static int task_database_iterate_start(retro_task_t *task,
return 0;
}
static int intfstream_get_serial(intfstream_t *fd, char *serial, const char *filename)
static int intfstream_get_serial(intfstream_t *fd, char *serial, size_t serial_len, const char *filename)
{
const char *system_name = NULL;
if (detect_system(fd, &system_name, filename) >= 1)
{
if (string_is_equal(system_name, "Sony - PlayStation Portable"))
{
if (detect_psp_game(fd, serial, filename) != 0)
if (detect_psp_game(fd, serial, serial_len, filename) != 0)
return 1;
}
else if (string_is_equal(system_name, "Sony - PlayStation"))
{
if (detect_ps1_game(fd, serial, filename) != 0)
if (detect_ps1_game(fd, serial, serial_len, filename) != 0)
return 1;
}
else if (string_is_equal(system_name, "Nintendo - GameCube"))
{
if (detect_gc_game(fd, serial, filename) != 0)
if (detect_gc_game(fd, serial, serial_len, filename) != 0)
return 1;
}
else if (string_is_equal(system_name, "Sega - Mega-CD - Sega CD"))
{
if (detect_scd_game(fd, serial, filename) != 0)
if (detect_scd_game(fd, serial, serial_len, filename) != 0)
return 1;
}
else if (string_is_equal(system_name, "Sega - Saturn"))
{
if (detect_sat_game(fd, serial, filename) != 0)
if (detect_sat_game(fd, serial, serial_len, filename) != 0)
return 1;
}
else if (string_is_equal(system_name, "Sega - Dreamcast"))
{
if (detect_dc_game(fd, serial, filename) != 0)
if (detect_dc_game(fd, serial, serial_len, filename) != 0)
return 1;
}
else if (string_is_equal(system_name, "Nintendo - Wii"))
{
if (detect_wii_game(fd, serial, filename) != 0)
if (detect_wii_game(fd, serial, serial_len, filename) != 0)
return 1;
}
}
@ -193,7 +193,7 @@ static int intfstream_get_serial(intfstream_t *fd, char *serial, const char *fil
}
static bool intfstream_file_get_serial(const char *name,
uint64_t offset, uint64_t size, char *serial)
uint64_t offset, uint64_t size, char *serial, size_t serial_len)
{
int rv;
uint8_t *data = NULL;
@ -239,7 +239,7 @@ static bool intfstream_file_get_serial(const char *name,
}
}
rv = intfstream_get_serial(fd, serial, name);
rv = intfstream_get_serial(fd, serial, serial_len, name);
intfstream_close(fd);
free(fd);
free(data);
@ -251,7 +251,7 @@ error:
return 0;
}
static int task_database_cue_get_serial(const char *name, char* serial)
static int task_database_cue_get_serial(const char *name, char* serial, size_t serial_len)
{
char track_path[PATH_MAX_LENGTH];
uint64_t offset = 0;
@ -269,10 +269,10 @@ sizeof(track_path)) < 0)
return 0;
}
return intfstream_file_get_serial(track_path, offset, size, serial);
return intfstream_file_get_serial(track_path, offset, size, serial, serial_len);
}
static int task_database_gdi_get_serial(const char *name, char* serial)
static int task_database_gdi_get_serial(const char *name, char* serial, size_t serial_len)
{
char track_path[PATH_MAX_LENGTH];
@ -288,10 +288,10 @@ static int task_database_gdi_get_serial(const char *name, char* serial)
return 0;
}
return intfstream_file_get_serial(track_path, 0, SIZE_MAX, serial);
return intfstream_file_get_serial(track_path, 0, SIZE_MAX, serial, serial_len);
}
static int task_database_chd_get_serial(const char *name, char* serial)
static int task_database_chd_get_serial(const char *name, char* serial, size_t serial_len)
{
int result;
intfstream_t *fd = intfstream_open_chd_track(
@ -302,7 +302,7 @@ static int task_database_chd_get_serial(const char *name, char* serial)
if (!fd)
return 0;
result = intfstream_get_serial(fd, serial, name);
result = intfstream_get_serial(fd, serial, serial_len, name);
intfstream_close(fd);
free(fd);
return result;
@ -547,7 +547,7 @@ static int task_database_iterate_playlist(
case FILE_TYPE_CUE:
task_database_cue_prune(db, name);
db_state->serial[0] = '\0';
if (task_database_cue_get_serial(name, db_state->serial))
if (task_database_cue_get_serial(name, db_state->serial, sizeof(db_state->serial)))
db->type = DATABASE_TYPE_SERIAL_LOOKUP;
else
{
@ -560,7 +560,7 @@ static int task_database_iterate_playlist(
db_state->serial[0] = '\0';
/* There are no serial databases, so don't bother with
serials at the moment */
if (0 && task_database_gdi_get_serial(name, db_state->serial))
if (0 && task_database_gdi_get_serial(name, db_state->serial, sizeof(db_state->serial)))
db->type = DATABASE_TYPE_SERIAL_LOOKUP;
else
{
@ -571,17 +571,17 @@ static int task_database_iterate_playlist(
/* Consider Wii WBFS files similar to ISO files. */
case FILE_TYPE_WBFS:
db_state->serial[0] = '\0';
intfstream_file_get_serial(name, 0, SIZE_MAX, db_state->serial);
intfstream_file_get_serial(name, 0, SIZE_MAX, db_state->serial, sizeof(db_state->serial));
db->type = DATABASE_TYPE_SERIAL_LOOKUP;
break;
case FILE_TYPE_ISO:
db_state->serial[0] = '\0';
intfstream_file_get_serial(name, 0, SIZE_MAX, db_state->serial);
intfstream_file_get_serial(name, 0, SIZE_MAX, db_state->serial, sizeof(db_state->serial));
db->type = DATABASE_TYPE_SERIAL_LOOKUP;
break;
case FILE_TYPE_CHD:
db_state->serial[0] = '\0';
if (task_database_chd_get_serial(name, db_state->serial))
if (task_database_chd_get_serial(name, db_state->serial, sizeof(db_state->serial)))
db->type = DATABASE_TYPE_SERIAL_LOOKUP;
else
{

View File

@ -77,10 +77,8 @@ static struct magic_entry MAGIC_NUMBERS[] = {
/**
* Given a filename and position, find the associated disc number.
*/
static int cue_find_disc_number(const char* str1, int index)
static int cue_find_disc_number(const char* str1, char disc)
{
char disc = str1[index + 6];
switch (disc)
{
case 'a':
@ -134,10 +132,12 @@ static void cue_append_multi_disc_suffix(char * str1, const char *filename)
result = string_find_index_substring_string(filename, "(disk ");
if (result >= 0)
{
char *dest = str1;
int disc_number = cue_find_disc_number(filename, result);
int disc_number = cue_find_disc_number(filename, filename[result + 6]);
if (disc_number > 0)
{
char *dest = str1;
sprintf(dest + strlen(dest), "-%i", disc_number - 1);
}
}
}
@ -201,13 +201,12 @@ static int64_t task_database_cue_get_token(intfstream_t *fd, char *token, uint64
}
}
int detect_ps1_game(intfstream_t *fd, char *game_id, const char *filename)
int detect_ps1_game(intfstream_t *fd, char *s, size_t len, const char *filename)
{
#define DISC_DATA_SIZE_PS1 60000
int pos;
char raw_game_id[50];
char disc_data[DISC_DATA_SIZE_PS1];
char hyphen = '-';
/* Load data into buffer and use pointers */
if (intfstream_seek(fd, 0, SEEK_SET) < 0)
@ -239,7 +238,7 @@ int detect_ps1_game(intfstream_t *fd, char *game_id, const char *filename)
|| (string_is_equal_fast(raw_game_id, "SCES_", STRLEN_CONST("SCES_")))
)
{
raw_game_id[4] = hyphen;
raw_game_id[4] = '-';
if (string_is_equal_fast(&raw_game_id[8], ".", STRLEN_CONST(".")))
{
raw_game_id[8] = raw_game_id[9];
@ -255,27 +254,36 @@ int detect_ps1_game(intfstream_t *fd, char *game_id, const char *filename)
}
raw_game_id[10] = '\0';
string_remove_all_whitespace(game_id, raw_game_id);
cue_append_multi_disc_suffix(game_id, filename);
string_remove_all_whitespace(s, raw_game_id);
cue_append_multi_disc_suffix(s, filename);
return true;
}
else if (string_is_equal_fast(&disc_data[pos], "LSP-", STRLEN_CONST("LSP-")))
{
string_remove_all_whitespace(game_id, raw_game_id);
game_id[10] = '\0';
cue_append_multi_disc_suffix(game_id, filename);
string_remove_all_whitespace(s, raw_game_id);
s[10] = '\0';
cue_append_multi_disc_suffix(s, filename);
return true;
}
}
}
strcpy(game_id, "XXXXXXXXXX");
game_id[10] = '\0';
cue_append_multi_disc_suffix(game_id, filename);
s[0 ] = 'X';
s[1 ] = 'X';
s[2 ] = 'X';
s[3 ] = 'X';
s[4 ] = 'X';
s[5 ] = 'X';
s[6 ] = 'X';
s[7 ] = 'X';
s[8 ] = 'X';
s[9 ] = 'X';
s[10] = '\0';
cue_append_multi_disc_suffix(s, filename);
return false;
}
int detect_psp_game(intfstream_t *fd, char *game_id, const char *filename)
int detect_psp_game(intfstream_t *fd, char *s, size_t len, const char *filename)
{
#define DISC_DATA_SIZE_PSP 40000
int pos;
@ -292,44 +300,44 @@ int detect_psp_game(intfstream_t *fd, char *game_id, const char *filename)
for (pos = 0; pos < DISC_DATA_SIZE_PSP; pos++)
{
strncpy(game_id, &disc_data[pos], 10);
game_id[10] = '\0';
if ( string_is_equal_fast(game_id, "U", STRLEN_CONST("U"))
|| string_is_equal_fast(game_id, "N", STRLEN_CONST("N")))
strncpy(s, &disc_data[pos], 10);
s[10] = '\0';
if ( string_is_equal_fast(s, "U", STRLEN_CONST("U"))
|| string_is_equal_fast(s, "N", STRLEN_CONST("N")))
{
if (
( string_is_equal_fast(game_id, "ULES-", STRLEN_CONST("ULES-")))
|| (string_is_equal_fast(game_id, "ULUS-", STRLEN_CONST("ULUS-")))
|| (string_is_equal_fast(game_id, "ULJS-", STRLEN_CONST("ULJS-")))
( string_is_equal_fast(s, "ULES-", STRLEN_CONST("ULES-")))
|| (string_is_equal_fast(s, "ULUS-", STRLEN_CONST("ULUS-")))
|| (string_is_equal_fast(s, "ULJS-", STRLEN_CONST("ULJS-")))
|| (string_is_equal_fast(game_id, "ULEM-", STRLEN_CONST("ULEM-")))
|| (string_is_equal_fast(game_id, "ULUM-", STRLEN_CONST("ULUM-")))
|| (string_is_equal_fast(game_id, "ULJM-", STRLEN_CONST("ULJM-")))
|| (string_is_equal_fast(s, "ULEM-", STRLEN_CONST("ULEM-")))
|| (string_is_equal_fast(s, "ULUM-", STRLEN_CONST("ULUM-")))
|| (string_is_equal_fast(s, "ULJM-", STRLEN_CONST("ULJM-")))
|| (string_is_equal_fast(game_id, "UCES-", STRLEN_CONST("UCES-")))
|| (string_is_equal_fast(game_id, "UCUS-", STRLEN_CONST("UCUS-")))
|| (string_is_equal_fast(game_id, "UCJS-", STRLEN_CONST("UCJS-")))
|| (string_is_equal_fast(game_id, "UCAS-", STRLEN_CONST("UCAS-")))
|| (string_is_equal_fast(game_id, "UCKS-", STRLEN_CONST("UCKS-")))
|| (string_is_equal_fast(s, "UCES-", STRLEN_CONST("UCES-")))
|| (string_is_equal_fast(s, "UCUS-", STRLEN_CONST("UCUS-")))
|| (string_is_equal_fast(s, "UCJS-", STRLEN_CONST("UCJS-")))
|| (string_is_equal_fast(s, "UCAS-", STRLEN_CONST("UCAS-")))
|| (string_is_equal_fast(s, "UCKS-", STRLEN_CONST("UCKS-")))
|| (string_is_equal_fast(game_id, "ULKS-", STRLEN_CONST("ULKS-")))
|| (string_is_equal_fast(game_id, "ULAS-", STRLEN_CONST("ULAS-")))
|| (string_is_equal_fast(game_id, "NPEH-", STRLEN_CONST("NPEH-")))
|| (string_is_equal_fast(game_id, "NPUH-", STRLEN_CONST("NPUH-")))
|| (string_is_equal_fast(game_id, "NPJH-", STRLEN_CONST("NPJH-")))
|| (string_is_equal_fast(game_id, "NPHH-", STRLEN_CONST("NPHH-")))
|| (string_is_equal_fast(s, "ULKS-", STRLEN_CONST("ULKS-")))
|| (string_is_equal_fast(s, "ULAS-", STRLEN_CONST("ULAS-")))
|| (string_is_equal_fast(s, "NPEH-", STRLEN_CONST("NPEH-")))
|| (string_is_equal_fast(s, "NPUH-", STRLEN_CONST("NPUH-")))
|| (string_is_equal_fast(s, "NPJH-", STRLEN_CONST("NPJH-")))
|| (string_is_equal_fast(s, "NPHH-", STRLEN_CONST("NPHH-")))
|| (string_is_equal_fast(game_id, "NPEG-", STRLEN_CONST("NPEG-")))
|| (string_is_equal_fast(game_id, "NPUG-", STRLEN_CONST("NPUG-")))
|| (string_is_equal_fast(game_id, "NPJG-", STRLEN_CONST("NPJG-")))
|| (string_is_equal_fast(game_id, "NPHG-", STRLEN_CONST("NPHG-")))
|| (string_is_equal_fast(s, "NPEG-", STRLEN_CONST("NPEG-")))
|| (string_is_equal_fast(s, "NPUG-", STRLEN_CONST("NPUG-")))
|| (string_is_equal_fast(s, "NPJG-", STRLEN_CONST("NPJG-")))
|| (string_is_equal_fast(s, "NPHG-", STRLEN_CONST("NPHG-")))
|| (string_is_equal_fast(game_id, "NPEZ-", STRLEN_CONST("NPEZ-")))
|| (string_is_equal_fast(game_id, "NPUZ-", STRLEN_CONST("NPUZ-")))
|| (string_is_equal_fast(game_id, "NPJZ-", STRLEN_CONST("NPJZ-")))
|| (string_is_equal_fast(s, "NPEZ-", STRLEN_CONST("NPEZ-")))
|| (string_is_equal_fast(s, "NPUZ-", STRLEN_CONST("NPUZ-")))
|| (string_is_equal_fast(s, "NPJZ-", STRLEN_CONST("NPJZ-")))
)
{
cue_append_multi_disc_suffix(game_id, filename);
cue_append_multi_disc_suffix(s, filename);
return true;
}
}
@ -338,10 +346,10 @@ int detect_psp_game(intfstream_t *fd, char *game_id, const char *filename)
return false;
}
int detect_gc_game(intfstream_t *fd, char *game_id, const char *filename)
int detect_gc_game(intfstream_t *fd, char *s, size_t len, const char *filename)
{
size_t _len;
char region_id;
char prefix[] = "DL-DOL-";
char pre_game_id[20];
char raw_game_id[20];
@ -371,60 +379,101 @@ int detect_gc_game(intfstream_t *fd, char *game_id, const char *filename)
will not match redump.**/
/** insert prefix **/
strcpy(pre_game_id, prefix);
pre_game_id[0 ] = 'D';
pre_game_id[1 ] = 'L';
pre_game_id[2 ] = '-';
pre_game_id[3 ] = 'D';
pre_game_id[4 ] = 'O';
pre_game_id[5 ] = 'L';
pre_game_id[6 ] = '-';
pre_game_id[7 ] = '\0';
/** add raw serial **/
strcat(pre_game_id, raw_game_id);
strlcat(pre_game_id, raw_game_id, sizeof(pre_game_id));
/** check region **/
region_id = pre_game_id[10];
/** check multi-disc and insert suffix **/
cue_append_multi_disc_suffix(pre_game_id, filename);
strcpy(game_id, pre_game_id);
_len = strlcpy(s, pre_game_id, len);
switch (region_id)
{
case 'E':
strcat(game_id, "-USA");
s[_len ] = '-';
s[_len+1] = 'U';
s[_len+2] = 'S';
s[_len+3] = 'A';
s[_len+4] = '\0';
return true;
case 'J':
strcat(game_id, "-JPN");
s[_len ] = '-';
s[_len+1] = 'J';
s[_len+2] = 'P';
s[_len+3] = 'N';
s[_len+4] = '\0';
return true;
case 'P': /** NYI: P can also be P-UKV, P-AUS **/
strcat(game_id, "-EUR");
return true;
case 'X': /** NYI: X can also be X-UKV, X-EUU **/
strcat(game_id, "-EUR");
s[_len ] = '-';
s[_len+1] = 'E';
s[_len+2] = 'U';
s[_len+3] = 'R';
s[_len+4] = '\0';
return true;
case 'Y':
strcat(game_id, "-FAH");
s[_len ] = '-';
s[_len+1] = 'F';
s[_len+2] = 'A';
s[_len+3] = 'H';
s[_len+4] = '\0';
return true;
case 'D':
strcat(game_id, "-NOE");
s[_len ] = '-';
s[_len+1] = 'N';
s[_len+2] = 'O';
s[_len+3] = 'E';
s[_len+4] = '\0';
return true;
case 'S':
strcat(game_id, "-ESP");
s[_len ] = '-';
s[_len+1] = 'E';
s[_len+2] = 'S';
s[_len+3] = 'P';
s[_len+4] = '\0';
return true;
case 'F':
strcat(game_id, "-FRA");
s[_len ] = '-';
s[_len+1] = 'F';
s[_len+2] = 'R';
s[_len+3] = 'A';
s[_len+4] = '\0';
return true;
case 'I':
strcat(game_id, "-ITA");
s[_len ] = '-';
s[_len+1] = 'I';
s[_len+2] = 'T';
s[_len+3] = 'A';
s[_len+4] = '\0';
return true;
case 'H':
strcat(game_id, "-HOL");
s[_len ] = '-';
s[_len+1] = 'H';
s[_len+2] = 'O';
s[_len+3] = 'L';
s[_len+4] = '\0';
return true;
default:
return false;
break;
}
return false;
}
int detect_scd_game(intfstream_t *fd, char *game_id, const char *filename)
int detect_scd_game(intfstream_t *fd, char *s, size_t len, const char *filename)
{
char hyphen = '-';
size_t _len;
char pre_game_id[15];
char raw_game_id[15];
char check_prefix_t_hyp[10];
@ -436,7 +485,6 @@ int detect_scd_game(intfstream_t *fd, char *game_id, const char *filename)
int lengthref;
int index;
char lgame_id[10];
char rgame_id[] = "-50";
/* Load raw serial or quit */
if (intfstream_seek(fd, 0x0193, SEEK_SET) < 0)
@ -492,32 +540,35 @@ int detect_scd_game(intfstream_t *fd, char *game_id, const char *filename)
{
if (!strcmp(region_id, "U") || !strcmp(region_id, "J"))
{
if ((index = string_index_last_occurance(pre_game_id, hyphen)) == -1)
if ((index = string_index_last_occurance(pre_game_id, '-')) == -1)
return false;
strncpy(game_id, pre_game_id, index);
game_id[index] = '\0';
cue_append_multi_disc_suffix(game_id, filename);
strncpy(s, pre_game_id, index);
s[index] = '\0';
cue_append_multi_disc_suffix(s, filename);
return true;
}
else
{
if ((index = string_index_last_occurance(pre_game_id, hyphen)) == -1)
if ((index = string_index_last_occurance(pre_game_id, '-')) == -1)
return false;
strncpy(lgame_id, pre_game_id, index);
lgame_id[index] = '\0';
strcat(game_id, lgame_id);
strcat(game_id, rgame_id);
cue_append_multi_disc_suffix(game_id, filename);
_len = strlcat(s, lgame_id, len);
s[_len ] = '-';
s[_len+1] = '5';
s[_len+2] = '0';
s[_len+3] = '\0';
cue_append_multi_disc_suffix(s, filename);
return true;
}
}
else if (!strcmp(check_prefix_g_hyp, "G-"))
{
if ((index = string_index_last_occurance(pre_game_id, hyphen)) == -1)
if ((index = string_index_last_occurance(pre_game_id, '-')) == -1)
return false;
strncpy(game_id, pre_game_id, index);
game_id[index] = '\0';
cue_append_multi_disc_suffix(game_id, filename);
strncpy(s, pre_game_id, index);
s[index] = '\0';
cue_append_multi_disc_suffix(s, filename);
return true;
}
else if (!strcmp(check_prefix_mk_hyp, "MK-"))
@ -525,31 +576,35 @@ int detect_scd_game(intfstream_t *fd, char *game_id, const char *filename)
if (!strcmp(check_suffix_50, "50"))
{
strncpy(lgame_id, &pre_game_id[3], 4);
lgame_id[4] = '\0';
strcat(game_id, lgame_id);
strcat(game_id, rgame_id);
cue_append_multi_disc_suffix(game_id, filename);
lgame_id[4] = '\0';
_len = strlcat(s, lgame_id, len);
s[_len ] = '-';
s[_len+1] = '5';
s[_len+2] = '0';
s[_len+3] = '\0';
cue_append_multi_disc_suffix(s, filename);
return true;
}
else
{
strncpy(game_id, &pre_game_id[3], 4);
game_id[4] = '\0';
cue_append_multi_disc_suffix(game_id, filename);
strncpy(s, &pre_game_id[3], 4);
s[4] = '\0';
cue_append_multi_disc_suffix(s, filename);
return true;
}
}
else
{
string_trim_whitespace(raw_game_id);
strcpy(game_id, raw_game_id);
strlcpy(s, raw_game_id, len);
return true;
}
return false;
}
int detect_sat_game(intfstream_t *fd, char *game_id, const char *filename)
int detect_sat_game(intfstream_t *fd, char *s, size_t len, const char *filename)
{
size_t _len;
char raw_game_id[15];
char raw_region_id[15];
char region_id;
@ -560,7 +615,6 @@ int detect_sat_game(intfstream_t *fd, char *game_id, const char *filename)
int length;
char lgame_id[10];
char rgame_id[10];
char game_id50[] = "-50";
/* Load raw serial or quit */
if (intfstream_seek(fd, 0x0030, SEEK_SET) < 0)
@ -610,14 +664,14 @@ int detect_sat_game(intfstream_t *fd, char *game_id, const char *filename)
case 'U':
if (strcmp(check_prefix_mk_hyp, "MK-") == 0)
{
strncpy(game_id, &raw_game_id[3], length - 3);
game_id[length - 3] = '\0';
cue_append_multi_disc_suffix(game_id, filename);
strncpy(s, &raw_game_id[3], length - 3);
s[length - 3] = '\0';
cue_append_multi_disc_suffix(s, filename);
}
else
{
strcpy(game_id, raw_game_id);
cue_append_multi_disc_suffix(game_id, filename);
strlcpy(s, raw_game_id, len);
cue_append_multi_disc_suffix(s, filename);
}
return true;
case 'E':
@ -633,26 +687,28 @@ int detect_sat_game(intfstream_t *fd, char *game_id, const char *filename)
strncpy(rgame_id, &raw_game_id[2], length - 1);
rgame_id[length - 1] = '\0';
}
strcat(game_id, lgame_id);
strcat(game_id, rgame_id);
strcat(game_id, game_id50);
cue_append_multi_disc_suffix(game_id, filename);
strlcat(s, lgame_id, len);
_len = strlcat(s, rgame_id, len);
s[_len ] = '-';
s[_len+1] = '5';
s[_len+2] = '0';
s[_len+3] = '\0';
cue_append_multi_disc_suffix(s, filename);
return true;
case 'J':
strcpy(game_id, raw_game_id);
cue_append_multi_disc_suffix(game_id, filename);
strlcpy(s, raw_game_id, len);
cue_append_multi_disc_suffix(s, filename);
return true;
default:
strcpy(game_id, raw_game_id);
strlcpy(s, raw_game_id, len);
return true;
}
return false;
}
int detect_dc_game(intfstream_t *fd, char *game_id, const char *filename)
int detect_dc_game(intfstream_t *fd, char *s, size_t len, const char *filename)
{
char hyphen = '-';
char hyphen_str[] = "-";
size_t _len;
int total_hyphens;
int total_hyphens_recalc;
char pre_game_id[50];
@ -688,9 +744,9 @@ int detect_dc_game(intfstream_t *fd, char *game_id, const char *filename)
string_trim_whitespace(raw_game_id);
string_replace_multi_space_with_single_space(raw_game_id);
string_replace_whitespace_with_single_character(raw_game_id, hyphen);
string_replace_whitespace_with_single_character(raw_game_id, '-');
length = strlen(raw_game_id);
total_hyphens = string_count_occurrences_single_character(raw_game_id, hyphen);
total_hyphens = string_count_occurrences_single_character(raw_game_id, '-');
/** disect this raw serial into parts **/
strncpy(check_prefix_t_hyp, raw_game_id, 2);
@ -707,7 +763,7 @@ int detect_dc_game(intfstream_t *fd, char *game_id, const char *filename)
{
if (total_hyphens >= 2)
{
index = string_index_last_occurance(raw_game_id, hyphen);
index = string_index_last_occurance(raw_game_id, '-');
if (index < 0)
return false;
size_t_var = (size_t)index;
@ -715,19 +771,20 @@ int detect_dc_game(intfstream_t *fd, char *game_id, const char *filename)
lgame_id[index] = '\0';
strncpy(rgame_id, &raw_game_id[index + 1], length - 1);
rgame_id[length - 1] = '\0';
strcat(game_id, lgame_id);
strcat(game_id, hyphen_str);
strcat(game_id, rgame_id);
cue_append_multi_disc_suffix(game_id, filename);
_len = strlcat(s, lgame_id, len);
s[_len ] = '-';
s[_len+1] = '\0';
strlcat(s, rgame_id, len);
cue_append_multi_disc_suffix(s, filename);
return true;
}
else
{
if (length <= 7)
{
strncpy(game_id, raw_game_id, 7);
game_id[7] = '\0';
cue_append_multi_disc_suffix(game_id, filename);
strncpy(s, raw_game_id, 7);
s[7] = '\0';
cue_append_multi_disc_suffix(s, filename);
return true;
}
else
@ -736,10 +793,11 @@ int detect_dc_game(intfstream_t *fd, char *game_id, const char *filename)
lgame_id[7] = '\0';
strncpy(rgame_id, &raw_game_id[length - 2], length - 1);
rgame_id[length - 1] = '\0';
strcat(game_id, lgame_id);
strcat(game_id, hyphen_str);
strcat(game_id, rgame_id);
cue_append_multi_disc_suffix(game_id, filename);
_len = strlcat(s, lgame_id, len);
s[_len ] = '-';
s[_len+1] = '\0';
strlcat(s, rgame_id, len);
cue_append_multi_disc_suffix(s, filename);
return true;
}
}
@ -750,12 +808,15 @@ int detect_dc_game(intfstream_t *fd, char *game_id, const char *filename)
lgame_id[1] = '\0';
strncpy(rgame_id, &raw_game_id[1], length - 1);
rgame_id[length - 1] = '\0';
sprintf(pre_game_id, "%s%s%s", lgame_id, hyphen_str, rgame_id);
total_hyphens_recalc = string_count_occurrences_single_character(pre_game_id, hyphen);
_len = strlcpy(pre_game_id, lgame_id, sizeof(pre_game_id));
pre_game_id[_len ] = '-';
pre_game_id[_len+1] = '\0';
strlcat(pre_game_id, rgame_id, sizeof(pre_game_id));
total_hyphens_recalc = string_count_occurrences_single_character(pre_game_id, '-');
if (total_hyphens_recalc >= 2)
{
index = string_index_last_occurance(pre_game_id, hyphen);
index = string_index_last_occurance(pre_game_id, '-');
if (index < 0)
return false;
size_t_var = (size_t)index;
@ -764,10 +825,11 @@ int detect_dc_game(intfstream_t *fd, char *game_id, const char *filename)
length_recalc = strlen(pre_game_id);
strncpy(rgame_id, &pre_game_id[length_recalc - 2], length_recalc - 1);
rgame_id[length_recalc - 1] = '\0';
strcat(game_id, lgame_id);
strcat(game_id, hyphen_str);
strcat(game_id, rgame_id);
cue_append_multi_disc_suffix(game_id, filename);
_len = strlcat(s, lgame_id, len);
s[_len ] = '-';
s[_len+1] = '\0';
strlcat(s, rgame_id, len);
cue_append_multi_disc_suffix(s, filename);
return true;
}
else
@ -775,9 +837,9 @@ int detect_dc_game(intfstream_t *fd, char *game_id, const char *filename)
length_recalc = strlen(pre_game_id) - 1;
if (length_recalc <= 8)
{
strncpy(game_id, pre_game_id, 8);
game_id[8] = '\0';
cue_append_multi_disc_suffix(game_id, filename);
strncpy(s, pre_game_id, 8);
s[8] = '\0';
cue_append_multi_disc_suffix(s, filename);
return true;
}
else
@ -786,10 +848,11 @@ int detect_dc_game(intfstream_t *fd, char *game_id, const char *filename)
lgame_id[7] = '\0';
strncpy(rgame_id, &pre_game_id[length_recalc - 2], length_recalc - 1);
rgame_id[length_recalc - 1] = '\0';
strcat(game_id, lgame_id);
strcat(game_id, hyphen_str);
strcat(game_id, rgame_id);
cue_append_multi_disc_suffix(game_id, filename);
_len = strlcat(s, lgame_id, len);
s[_len ] = '-';
s[_len+1] = '\0';
strlcat(s, rgame_id ,len);
cue_append_multi_disc_suffix(s, filename);
return true;
}
}
@ -798,23 +861,24 @@ int detect_dc_game(intfstream_t *fd, char *game_id, const char *filename)
{
if (total_hyphens >= 2)
{
index = string_index_last_occurance(raw_game_id, hyphen);
index = string_index_last_occurance(raw_game_id, '-');
if (index < 0)
return false;
strncpy(lgame_id, raw_game_id, index - 1);
lgame_id[index - 1] = '\0';
lgame_id[index - 1] = '\0';
strncpy(rgame_id, &raw_game_id[length - 4], length - 3);
rgame_id[length - 3] = '\0';
strcat(game_id, lgame_id);
strcat(game_id, hyphen_str);
strcat(game_id, rgame_id);
cue_append_multi_disc_suffix(game_id, filename);
_len = strlcat(s, lgame_id, len);
s[_len ] = '-';
s[_len+1] = '\0';
strlcat(s, rgame_id, len);
cue_append_multi_disc_suffix(s, filename);
return true;
}
else
{
strcpy(game_id, raw_game_id);
cue_append_multi_disc_suffix(game_id, filename);
strlcpy(s, raw_game_id, len);
cue_append_multi_disc_suffix(s, filename);
return true;
}
}
@ -823,9 +887,9 @@ int detect_dc_game(intfstream_t *fd, char *game_id, const char *filename)
if (length <= 8)
{
strncpy(game_id, raw_game_id, 8);
game_id[8] = '\0';
cue_append_multi_disc_suffix(game_id, filename);
strncpy(s, raw_game_id, 8);
s[8] = '\0';
cue_append_multi_disc_suffix(s, filename);
return true;
}
else
@ -834,23 +898,24 @@ int detect_dc_game(intfstream_t *fd, char *game_id, const char *filename)
lgame_id[8] = '\0';
strncpy(rgame_id, &raw_game_id[length - 2], length - 1);
rgame_id[length - 1] = '\0';
strcat(game_id, lgame_id);
strcat(game_id, hyphen_str);
strcat(game_id, rgame_id);
cue_append_multi_disc_suffix(game_id, filename);
_len = strlcat(s, lgame_id, len);
s[_len ] = '-';
s[_len+1] = '\0';
strlcat(s, rgame_id, len);
cue_append_multi_disc_suffix(s, filename);
return true;
}
}
else
{
strcpy(game_id, raw_game_id);
strlcpy(s, raw_game_id, len);
return true;
}
return false;
}
int detect_wii_game(intfstream_t *fd, char *game_id, const char *filename)
int detect_wii_game(intfstream_t *fd, char *s, size_t len, const char *filename)
{
char raw_game_id[15];
@ -879,15 +944,17 @@ int detect_wii_game(intfstream_t *fd, char *game_id, const char *filename)
return false;
}
cue_append_multi_disc_suffix(game_id, filename);
strcpy(game_id, raw_game_id);
cue_append_multi_disc_suffix(s, filename);
strlcpy(s, raw_game_id, len);
return true;
}
#if 0
/**
* Check for an ASCII serial in the first few bits of the ISO (Wii).
* TODO/FIXME - unused for now
*/
int detect_serial_ascii_game(intfstream_t *fd, char *game_id)
static int detect_serial_ascii_game(intfstream_t *fd, char *s, size_t len)
{
unsigned pos;
int number_of_ascii = 0;
@ -896,23 +963,23 @@ int detect_serial_ascii_game(intfstream_t *fd, char *game_id)
for (pos = 0; pos < 10000; pos++)
{
intfstream_seek(fd, pos, SEEK_SET);
if (intfstream_read(fd, game_id, 15) > 0)
if (intfstream_read(fd, s, 15) > 0)
{
unsigned i;
game_id[15] = '\0';
s[15] = '\0';
number_of_ascii = 0;
/* When scanning WBFS files, "WBFS" is discovered as the first serial. Ignore it. */
if (string_is_equal(game_id, "WBFS"))
if (string_is_equal(s, "WBFS"))
continue;
/* Loop through until we run out of ASCII characters. */
for (i = 0; i < 15; i++)
{
/* Is the given character ASCII? A-Z, 0-9, - */
if ( (game_id[i] == 45) ||
(game_id[i] >= 48 && game_id[i] <= 57) ||
(game_id[i] >= 65 && game_id[i] <= 90))
if ( (s[i] == 45) ||
(s[i] >= 48 && s[i] <= 57) ||
(s[i] >= 65 && s[i] <= 90))
number_of_ascii++;
else
break;
@ -923,7 +990,7 @@ int detect_serial_ascii_game(intfstream_t *fd, char *game_id)
if (number_of_ascii > 3 && number_of_ascii < 9)
{
/* Cut the string off, and return it as a valid serial. */
game_id[number_of_ascii] = '\0';
s[number_of_ascii] = '\0';
rv = true;
break;
}
@ -932,6 +999,7 @@ int detect_serial_ascii_game(intfstream_t *fd, char *game_id)
return rv;
}
#endif
int detect_system(intfstream_t *fd, const char **system_name, const char * filename)
{