From 62c5e3af2f0694165f9b848a7e023490b9d3d97c Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sat, 12 Aug 2023 14:00:33 +1000 Subject: [PATCH] dep/libchdr: Add read_header variants for user-provided file --- dep/libchdr/include/libchdr/chd.h | 2 ++ dep/libchdr/src/libchdr_chd.c | 48 +++++++++++++++++++------------ 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/dep/libchdr/include/libchdr/chd.h b/dep/libchdr/include/libchdr/chd.h index e152cf0d3..33104d7cc 100644 --- a/dep/libchdr/include/libchdr/chd.h +++ b/dep/libchdr/include/libchdr/chd.h @@ -398,6 +398,8 @@ CHD_EXPORT const char *chd_error_string(chd_error err); CHD_EXPORT const chd_header *chd_get_header(chd_file *chd); /* read CHD header data from file into the pointed struct */ +CHD_EXPORT chd_error chd_read_header_core_file(core_file *file, chd_header *header); +CHD_EXPORT chd_error chd_read_header_file(FILE *file, chd_header *header); CHD_EXPORT chd_error chd_read_header(const char *filename, chd_header *header); diff --git a/dep/libchdr/src/libchdr_chd.c b/dep/libchdr/src/libchdr_chd.c index 6d50884a3..79661f97a 100644 --- a/dep/libchdr/src/libchdr_chd.c +++ b/dep/libchdr/src/libchdr_chd.c @@ -2009,34 +2009,44 @@ CHD_EXPORT const chd_header *chd_get_header(chd_file *chd) chd_read_header - read CHD header data from file into the pointed struct -------------------------------------------------*/ -CHD_EXPORT chd_error chd_read_header(const char *filename, chd_header *header) +CHD_EXPORT chd_error chd_read_header_core_file(core_file* file, chd_header* header) { - chd_error err = CHDERR_NONE; chd_file chd; - - /* punt if NULL */ - if (filename == NULL || header == NULL) - EARLY_EXIT(err = CHDERR_INVALID_PARAMETER); - - /* open the file */ - chd.file = core_stdio_fopen(filename); - if (chd.file == NULL) - EARLY_EXIT(err = CHDERR_FILE_NOT_FOUND); + chd.file = file; /* attempt to read the header */ - err = header_read(&chd, header); + const chd_error err = header_read(&chd, header); if (err != CHDERR_NONE) - EARLY_EXIT(err); + return err; /* validate the header */ - err = header_validate(header); - if (err != CHDERR_NONE) - EARLY_EXIT(err); + return header_validate(header); +} -cleanup: - if (chd.file != NULL) - core_fclose(chd.file); +CHD_EXPORT chd_error chd_read_header_file(FILE *file, chd_header *header) +{ + core_file stream; + stream.argp = file; + stream.fsize = core_stdio_fsize; + stream.fread = core_stdio_fread; + stream.fclose = core_stdio_fclose_nonowner; + stream.fseek = core_stdio_fseek; + + return chd_read_header_core_file(&stream, header); +} + +CHD_EXPORT chd_error chd_read_header(const char *filename, chd_header *header) +{ + if (filename == NULL) + return CHDERR_INVALID_PARAMETER; + + core_file* file = core_stdio_fopen(filename); + if (file == NULL) + return CHDERR_FILE_NOT_FOUND; + chd_error err = chd_read_header_core_file(file, header); + + core_fclose(file); return err; }