From ba7ebf9b7252b97707a184c0271ab68d556a224d Mon Sep 17 00:00:00 2001 From: Anthony Pesch Date: Sat, 17 Jun 2017 13:54:12 -0400 Subject: [PATCH] support gdis with track filenames containing single or double quotes --- src/guest/gdrom/gdi.c | 27 ++++++++++++++++++++++----- src/host/sdl_host.c | 3 ++- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/guest/gdrom/gdi.c b/src/guest/gdrom/gdi.c index 22fa0c83..4b6fde8e 100644 --- a/src/guest/gdrom/gdi.c +++ b/src/guest/gdrom/gdi.c @@ -106,10 +106,27 @@ static int gdi_parse(struct disc *disc, const char *filename) { int num, lba, ctrl, sector_size, file_offset; char filename[PATH_MAX]; - n = fscanf(fp, "%d %d %d %d %s %d", &num, &lba, &ctrl, §or_size, - filename, &file_offset); + /* parse track information, including filenames which may include single or + double quotes */ + int parse_err = 0; - if (n != 6) { + n = fscanf(fp, "%d %d %d %d", &num, &lba, &ctrl, §or_size); + parse_err |= (n != 4); + + n = fscanf(fp, " \"%[^\"]\"", filename); + if (n != 1) { + n = fscanf(fp, " '%[^']'", filename); + if (n != 1) { + n = fscanf(fp, " %s", filename); + parse_err |= (n != 1); + } + } + + n = fscanf(fp, " %d", &file_offset); + parse_err |= (n != 1); + + if (parse_err) { + LOG_WARNING("gdi_parse failed to parse track information"); fclose(fp); return 0; } @@ -129,8 +146,8 @@ static int gdi_parse(struct disc *disc, const char *filename) { /* sanity check */ CHECK_EQ(num, track->num); - LOG_INFO("gdi_parse_track track=%d fad=%d secsz=%d", track->num, track->fad, - track->sector_size); + LOG_INFO("gdi_parse track=%d filename='%s' fad=%d secsz=%d", track->num, + track->filename, track->fad, track->sector_size); } /* gdroms contains two sessions, one for the single density area (tracks 0-1) diff --git a/src/host/sdl_host.c b/src/host/sdl_host.c index c8ff5995..5cd24c7c 100644 --- a/src/host/sdl_host.c +++ b/src/host/sdl_host.c @@ -21,7 +21,8 @@ DEFINE_OPTION_INT(help, 0, "Show help"); #define VIDEO_DEFAULT_HEIGHT 480 #define INPUT_MAX_CONTROLLERS 4 -#define AUDIO_FRAMES_TO_MS(frames) (int)(((float)frames * 1000.0f) / (float)AUDIO_FREQ) +#define AUDIO_FRAMES_TO_MS(frames) \ + (int)(((float)frames * 1000.0f) / (float)AUDIO_FREQ) #define MS_TO_AUDIO_FRAMES(ms) (int)(((float)(ms) / 1000.0f) * AUDIO_FREQ) /*