diff options
Diffstat (limited to 'src/osd/osdmini/minifile.c')
-rw-r--r-- | src/osd/osdmini/minifile.c | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/src/osd/osdmini/minifile.c b/src/osd/osdmini/minifile.c new file mode 100644 index 00000000000..f4e54062d23 --- /dev/null +++ b/src/osd/osdmini/minifile.c @@ -0,0 +1,125 @@ +//============================================================ +// +// minifile.c - Minimal core file access functions +// +// Copyright (c) 1996-2007, Nicola Salmoria and the MAME Team. +// Visit http://mamedev.org for licensing and usage restrictions. +// +//============================================================ + +#include "osdcore.h" + + +//============================================================ +// osd_open +//============================================================ + +file_error osd_open(const char *path, UINT32 openflags, osd_file **file, UINT64 *filesize) +{ + const char *mode; + FILE *fileptr; + + // based on the flags, choose a mode + if (openflags & OPEN_FLAG_WRITE) + { + if (openflags & OPEN_FLAG_READ) + mode = (openflags & OPEN_FLAG_CREATE) ? "w+b" : "r+b"; + else + mode = "wb"; + } + else if (openflags & OPEN_FLAG_READ) + mode = "rb"; + else + return FILERR_INVALID_ACCESS; + + // open the file + fileptr = fopen(path, mode); + if (fileptr == NULL) + return FILERR_NOT_FOUND; + + // store the file pointer directly as an osd_file + *file = (osd_file *)fileptr; + + // get the size -- note that most fseek/ftell implementations are limited to 32 bits + fseek(fileptr, 0, SEEK_END); + *filesize = ftell(fileptr); + fseek(fileptr, 0, SEEK_SET); + + return FILERR_NONE; +} + + +//============================================================ +// osd_read +//============================================================ + +file_error osd_read(osd_file *file, void *buffer, UINT64 offset, UINT32 length, UINT32 *actual) +{ + size_t count; + + // seek to the new location; note that most fseek implementations are limited to 32 bits + fseek((FILE *)file, offset, SEEK_SET); + + // perform the read + count = fread(buffer, 1, length, (FILE *)file); + if (actual != NULL) + *actual = count; + + return FILERR_NONE; +} + + +//============================================================ +// osd_write +//============================================================ + +file_error osd_write(osd_file *file, const void *buffer, UINT64 offset, UINT32 length, UINT32 *actual) +{ + size_t count; + + // seek to the new location; note that most fseek implementations are limited to 32 bits + fseek((FILE *)file, offset, SEEK_SET); + + // perform the write + count = fwrite(buffer, 1, length, (FILE *)file); + if (actual != NULL) + *actual = count; + + return FILERR_NONE; +} + + +//============================================================ +// osd_close +//============================================================ + +file_error osd_close(osd_file *file) +{ + // close the file handle + fclose((FILE *)file); + return FILERR_NONE; +} + + +//============================================================ +// osd_get_physical_drive_geometry +//============================================================ + +int osd_get_physical_drive_geometry(const char *filename, UINT32 *cylinders, UINT32 *heads, UINT32 *sectors, UINT32 *bps) +{ + // there is no standard way of doing this, so we always return FALSE, indicating + // that a given path is not a physical drive + return FALSE; +} + + +//============================================================ +// osd_uchar_from_osdchar +//============================================================ + +int osd_uchar_from_osdchar(UINT32 /* unicode_char */ *uchar, const char *osdchar, size_t count) +{ + // we assume a standard 1:1 mapping of characters to the first 256 unicode characters + *uchar = (UINT8)*osdchar; + return 1; +} |