1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
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;
}
|