flycast/core/imgread/gdi.cpp

126 lines
2.0 KiB
C++
Raw Normal View History

2013-12-19 17:10:14 +00:00
#include "common.h"
#include <ctype.h>
#include <sstream>
#ifdef WIN32
#include <BaseTsd.h>
typedef SSIZE_T ssize_t;
#endif
2013-12-19 17:10:14 +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));
core_file* t=core_fopen(file);
2013-12-19 17:10:14 +00:00
if (!t)
return 0;
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);
// FIXME: Data loss if buffer is too small
2013-12-19 17:10:14 +00:00
char path[512];
strncpy(path, file, sizeof(path));
path[sizeof(path) - 1] = '\0';
ssize_t len = strlen(path);
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++)
{
string track_filename;
2013-12-19 17:10:14 +00:00
//TRACK FADS CTRL SSIZE file OFFSET
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
{
for(;;) {
gdi >> last;
if (last == '"')
break;
track_filename += last;
}
2013-12-19 17:10:14 +00:00
}
else
{
gdi >> track_filename;
track_filename = last + track_filename;
2013-12-19 17:10:14 +00:00
}
gdi >> OFFSET;
2013-12-19 17:10:14 +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)
{
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;
}
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()
{
}