Skip to content

Commit cb07733

Browse files
authored
Merge pull request #133 from TheLastRar/read-header-core
CHD: Provide file and core_file versions of read_header
2 parents b397465 + 22ed569 commit cb07733

File tree

2 files changed

+61
-15
lines changed

2 files changed

+61
-15
lines changed

include/libchdr/chd.h

+2
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,8 @@ CHD_EXPORT const char *chd_error_string(chd_error err);
399399
CHD_EXPORT const chd_header *chd_get_header(chd_file *chd);
400400

401401
/* read CHD header data from file into the pointed struct */
402+
CHD_EXPORT chd_error chd_read_header_core_file(core_file *file, chd_header *header);
403+
CHD_EXPORT chd_error chd_read_header_file(FILE *file, chd_header *header);
402404
CHD_EXPORT chd_error chd_read_header(const char *filename, chd_header *header);
403405

404406

src/libchdr_chd.c

+59-15
Original file line numberDiff line numberDiff line change
@@ -2332,34 +2332,78 @@ CHD_EXPORT const chd_header *chd_get_header(chd_file *chd)
23322332
chd_read_header - read CHD header data
23332333
from file into the pointed struct
23342334
-------------------------------------------------*/
2335-
CHD_EXPORT chd_error chd_read_header(const char *filename, chd_header *header)
2335+
2336+
CHD_EXPORT chd_error chd_read_header_core_file(core_file *file, chd_header *header)
23362337
{
23372338
chd_error err = CHDERR_NONE;
23382339
chd_file chd;
23392340

2340-
/* punt if NULL */
2341-
if (filename == NULL || header == NULL)
2342-
EARLY_EXIT(err = CHDERR_INVALID_PARAMETER);
2341+
/* verify parameters */
2342+
if (file == NULL || header == NULL)
2343+
return CHDERR_INVALID_PARAMETER;
23432344

2344-
/* open the file */
2345-
chd.file = core_stdio_fopen(filename);
2346-
if (chd.file == NULL)
2347-
EARLY_EXIT(err = CHDERR_FILE_NOT_FOUND);
2345+
chd.file = file;
23482346

23492347
/* attempt to read the header */
23502348
err = header_read(&chd, header);
23512349
if (err != CHDERR_NONE)
2352-
EARLY_EXIT(err);
2350+
return err;
23532351

23542352
/* validate the header */
2355-
err = header_validate(header);
2356-
if (err != CHDERR_NONE)
2357-
EARLY_EXIT(err);
2353+
return header_validate(header);
2354+
}
23582355

2359-
cleanup:
2360-
if (chd.file != NULL)
2361-
core_fclose(chd.file);
2356+
/*-------------------------------------------------
2357+
chd_read_header - read CHD header data
2358+
from file into the pointed struct
2359+
-------------------------------------------------*/
2360+
2361+
CHD_EXPORT chd_error chd_read_header_file(FILE *file, chd_header *header)
2362+
{
2363+
chd_error err;
2364+
core_file *stream = malloc(sizeof(core_file));
2365+
if (!stream)
2366+
return CHDERR_OUT_OF_MEMORY;
2367+
stream->argp = file;
2368+
stream->fsize = core_stdio_fsize;
2369+
stream->fread = core_stdio_fread;
2370+
stream->fclose = core_stdio_fclose_nonowner;
2371+
stream->fseek = core_stdio_fseek;
23622372

2373+
err = chd_read_header_core_file(stream, header);
2374+
core_fclose(stream);
2375+
return err;
2376+
}
2377+
2378+
/*-------------------------------------------------
2379+
chd_read_header - read CHD header data
2380+
from file into the pointed struct
2381+
-------------------------------------------------*/
2382+
2383+
CHD_EXPORT chd_error chd_read_header(const char *filename, chd_header *header)
2384+
{
2385+
chd_error err;
2386+
core_file *file = NULL;
2387+
2388+
if (filename == NULL)
2389+
{
2390+
err = CHDERR_INVALID_PARAMETER;
2391+
goto cleanup;
2392+
}
2393+
2394+
/* open the file */
2395+
file = core_stdio_fopen(filename);
2396+
if (file == 0)
2397+
{
2398+
err = CHDERR_FILE_NOT_FOUND;
2399+
goto cleanup;
2400+
}
2401+
2402+
err = chd_read_header_core_file(file, header);
2403+
2404+
cleanup:
2405+
if (file != NULL)
2406+
core_fclose(file);
23632407
return err;
23642408
}
23652409

0 commit comments

Comments
 (0)