1
// Data reader interface for uniform access
3
// File_Extractor 0.4.0
7
#include "blargg_common.h"
9
// Supports reading and finding out how many bytes are remaining
12
virtual ~Data_Reader() { }
14
static const char eof_error []; // returned by read() when request goes beyond end
16
// Read at most count bytes and return number actually read, or <= 0 if error
17
virtual long read_avail( void*, long n ) = 0;
19
// Read exactly count bytes and return error if they couldn't be read
20
virtual blargg_err_t read( void*, long count );
22
// Number of bytes remaining until end of file
23
virtual long remain() const = 0;
25
// Read and discard count bytes
26
virtual blargg_err_t skip( long count );
30
typedef blargg_err_t error_t; // deprecated
33
Data_Reader( const Data_Reader& );
34
Data_Reader& operator = ( const Data_Reader& );
37
// Supports seeking in addition to Data_Reader operations
38
class File_Reader : public Data_Reader {
41
virtual long size() const = 0;
43
// Current position in file
44
virtual long tell() const = 0;
47
virtual blargg_err_t seek( long ) = 0;
50
blargg_err_t skip( long n );
54
class Std_File_Reader : public File_Reader {
56
blargg_err_t open( const char* path );
63
blargg_err_t read( void*, long );
64
long read_avail( void*, long );
66
blargg_err_t seek( long );
71
// Treats range of memory as a file
72
class Mem_File_Reader : public File_Reader {
74
Mem_File_Reader( const void*, long size );
78
long read_avail( void*, long );
80
blargg_err_t seek( long );
82
const char* const begin;
87
// Makes it look like there are only count bytes remaining
88
class Subset_Reader : public Data_Reader {
90
Subset_Reader( Data_Reader*, long count );
94
long read_avail( void*, long );
100
// Joins already-read header and remaining data into original file (to avoid seeking)
101
class Remaining_Reader : public Data_Reader {
103
Remaining_Reader( void const* header, long size, Data_Reader* );
107
long read_avail( void*, long );
108
blargg_err_t read( void*, long );
111
char const* header_end;
113
long read_first( void* out, long count );
116
// Invokes callback function to read data. Size of data must be specified in advance.
117
class Callback_Reader : public Data_Reader {
119
typedef const char* (*callback_t)( void* data, void* out, long count );
120
Callback_Reader( callback_t, long size, void* data = 0 );
122
long read_avail( void*, long );
123
blargg_err_t read( void*, long );
126
callback_t const callback;
132
// Gzip compressed file reader
133
class Gzip_File_Reader : public File_Reader {
135
blargg_err_t open( const char* path );
142
long read_avail( void*, long );
144
blargg_err_t seek( long );