2013-12-19 17:10:14 +00:00
|
|
|
#include "common.h"
|
|
|
|
#include <ctype.h>
|
2015-01-09 14:50:07 +00:00
|
|
|
#include <sstream>
|
2018-04-02 06:46:46 +00:00
|
|
|
#ifdef WIN32
|
|
|
|
#include <BaseTsd.h>
|
|
|
|
typedef SSIZE_T ssize_t;
|
|
|
|
#endif
|
2013-12-19 17:10:14 +00:00
|
|
|
|
2014-06-13 15:41:48 +00:00
|
|
|
Disc* load_gdi(const char* file)
|
2013-12-19 17:10:14 +00:00
|
|
|
{
|
|
|
|
u32 iso_tc;
|
|
|
|
Disc* disc = new Disc();
|
|
|
|
|
|
|
|
//memset(&gdi_toc,0xFFFFFFFF,sizeof(gdi_toc));
|
|
|
|
//memset(&gdi_ses,0xFFFFFFFF,sizeof(gdi_ses));
|
2015-01-09 14:50:07 +00:00
|
|
|
core_file* t=core_fopen(file);
|
2013-12-19 17:10:14 +00:00
|
|
|
if (!t)
|
|
|
|
return 0;
|
2015-01-09 14:50:07 +00:00
|
|
|
|
|
|
|
size_t gdi_len = core_fsize(t);
|
|
|
|
|
|
|
|
char gdi_data[8193] = { 0 };
|
|
|
|
|
|
|
|
if (gdi_len >= sizeof(gdi_data))
|
|
|
|
{
|
|
|
|
core_fclose(t);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
core_fread(t, gdi_data, gdi_len);
|
|
|
|
core_fclose(t);
|
|
|
|
|
|
|
|
istringstream gdi(gdi_data);
|
|
|
|
|
|
|
|
gdi >> iso_tc;
|
2013-12-19 17:10:14 +00:00
|
|
|
printf("\nGDI : %d tracks\n",iso_tc);
|
|
|
|
|
2016-02-22 17:40:11 +00:00
|
|
|
// FIXME: Data loss if buffer is too small
|
2013-12-19 17:10:14 +00:00
|
|
|
char path[512];
|
2016-02-22 17:40:11 +00:00
|
|
|
strncpy(path, file, sizeof(path));
|
|
|
|
path[sizeof(path) - 1] = '\0';
|
|
|
|
|
2018-03-25 17:53:18 +00:00
|
|
|
ssize_t len = strlen(path);
|
2016-02-22 17:40:11 +00:00
|
|
|
|
2018-03-25 17:53:18 +00:00
|
|
|
while (len>=0)
|
2013-12-19 17:10:14 +00:00
|
|
|
{
|
|
|
|
if (path[len]=='\\' || path[len]=='/')
|
|
|
|
break;
|
|
|
|
len--;
|
|
|
|
}
|
|
|
|
len++;
|
|
|
|
char* pathptr=&path[len];
|
|
|
|
u32 TRACK=0,FADS=0,CTRL=0,SSIZE=0;
|
|
|
|
s32 OFFSET=0;
|
|
|
|
for (u32 i=0;i<iso_tc;i++)
|
|
|
|
{
|
2015-01-09 14:50:07 +00:00
|
|
|
string track_filename;
|
|
|
|
|
2013-12-19 17:10:14 +00:00
|
|
|
//TRACK FADS CTRL SSIZE file OFFSET
|
2015-01-09 14:50:07 +00:00
|
|
|
gdi >> TRACK;
|
|
|
|
gdi >> FADS;
|
|
|
|
gdi >> CTRL;
|
|
|
|
gdi >> SSIZE;
|
|
|
|
|
|
|
|
char last;
|
|
|
|
|
|
|
|
do {
|
|
|
|
gdi >> last;
|
|
|
|
} while (isspace(last));
|
|
|
|
|
|
|
|
if (last == '"')
|
2013-12-19 17:10:14 +00:00
|
|
|
{
|
2015-01-09 14:50:07 +00:00
|
|
|
for(;;) {
|
|
|
|
gdi >> last;
|
|
|
|
if (last == '"')
|
|
|
|
break;
|
|
|
|
track_filename += last;
|
|
|
|
}
|
2013-12-19 17:10:14 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2015-01-09 14:50:07 +00:00
|
|
|
gdi >> track_filename;
|
|
|
|
track_filename = last + track_filename;
|
2013-12-19 17:10:14 +00:00
|
|
|
}
|
|
|
|
|
2015-01-09 14:50:07 +00:00
|
|
|
gdi >> OFFSET;
|
2013-12-19 17:10:14 +00:00
|
|
|
|
2015-01-09 14:50:07 +00:00
|
|
|
printf("file[%d] \"%s\": FAD:%d, CTRL:%d, SSIZE:%d, OFFSET:%d\n", TRACK, track_filename.c_str(), FADS, CTRL, SSIZE, OFFSET);
|
2013-12-19 17:10:14 +00:00
|
|
|
|
|
|
|
Track t;
|
|
|
|
t.ADDR=0;
|
|
|
|
t.StartFAD=FADS+150;
|
|
|
|
t.EndFAD=0; //fill it in
|
|
|
|
t.file=0;
|
|
|
|
|
|
|
|
if (SSIZE!=0)
|
|
|
|
{
|
2015-01-09 14:50:07 +00:00
|
|
|
strcpy(pathptr, track_filename.c_str());
|
|
|
|
t.file = new RawTrackFile(core_fopen(path),OFFSET,t.StartFAD,SSIZE);
|
2013-12-19 17:10:14 +00:00
|
|
|
}
|
|
|
|
disc->tracks.push_back(t);
|
|
|
|
}
|
|
|
|
|
|
|
|
disc->FillGDSession();
|
|
|
|
|
|
|
|
return disc;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-06-13 15:41:48 +00:00
|
|
|
Disc* gdi_parse(const char* file)
|
2013-12-19 17:10:14 +00:00
|
|
|
{
|
|
|
|
size_t len=strlen(file);
|
|
|
|
if (len>4)
|
|
|
|
{
|
|
|
|
if (stricmp( &file[len-4],".gdi")==0)
|
|
|
|
{
|
|
|
|
return load_gdi(file);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void iso_term()
|
|
|
|
{
|
2018-03-25 17:53:18 +00:00
|
|
|
}
|