5#if !defined( MFILE_MMAP ) && \
6 !defined( RETROFLAT_API_WINCE ) && \
7 !defined( RETROFLAT_API_PALM )
27# define MAUG_PATH_MAX 256
42#define MFILE_CADDY_TYPE_FILE 0x01
47#define MFILE_CADDY_TYPE_MEM_BUFFER 0x80
51#define MFILE_FLAG_READ_ONLY 0x01
66#define MFILE_READ_FLAG_LSBF 0x01
73#define MFILE_READ_FLAG_MSBF 0x01
75#ifndef MFILE_TRACE_LVL
76# define MFILE_TRACE_LVL 0
79#ifndef MFILE_TRACE_CONTENTS_LVL
80# define MFILE_TRACE_CONTENTS_LVL 0
85typedef off_t (*mfile_has_bytes_t)(
struct MFILE_CADDY* p_file );
89 struct MFILE_CADDY* p_file, uint8_t* buf,
size_t buf_sz );
92 struct MFILE_CADDY* p_file, uint8_t* buf,
size_t buf_sz, uint8_t flags );
94 struct MFILE_CADDY* p_file,
char* buf, off_t buf_sz, uint8_t flags );
103 union MFILE_HANDLE
h;
111 mfile_has_bytes_t has_bytes;
112 mfile_read_byte_t read_byte;
113 mfile_read_block_t read_block;
115 mfile_read_int_t read_int;
116 mfile_read_line_t read_line;
121off_t mfile_file_has_bytes(
struct MFILE_CADDY* p_file );
126 struct MFILE_CADDY* p_file, uint8_t* buf,
size_t buf_sz );
129 struct MFILE_CADDY* p_f, uint8_t* buf,
size_t buf_sz, uint8_t flags );
134 struct MFILE_CADDY* p_f,
char* buffer, off_t buffer_sz, uint8_t flags );
136#define mfile_check_lock( p_file ) (NULL != (p_file)->mem_buffer)
138#define mfile_get_sz( p_file ) ((p_file)->sz)
165 struct MFILE_CADDY* p_file, uint8_t* buf,
size_t buf_sz, uint8_t flags
172#elif defined( MAUG_MSBF )
176 debug_printf( MFILE_TRACE_LVL,
"reading integer forward" );
178 retval = p_file->read_block( p_file, buf, buf_sz );
181 debug_printf( MFILE_TRACE_LVL,
"reading integer reversed" );
183 while( 0 < buf_sz ) {
184 retval = p_file->read_byte( p_file, (buf + (buf_sz - 1)) );
185 maug_cleanup_if_not_ok();
197off_t mfile_mem_has_bytes(
struct MFILE_CADDY* p_file ) {
204 return p_file->read_block( p_file, buf, 1 );
210 struct MFILE_CADDY* p_file, uint8_t* buf,
size_t buf_sz
217 while( 0 < buf_sz-- ) {
233 debug_printf( MFILE_TRACE_LVL,
234 "seeking memory buffer to position " OFF_T_FMT
" (" OFF_T_FMT
")",
243 struct MFILE_CADDY* p_f,
char* buffer, off_t buffer_sz, uint8_t flags
250 while( i < buffer_sz - 1 && p_f->has_bytes( p_f ) ) {
252 if( i + 1 >= buffer_sz ) {
253 error_printf(
"overflow reading string from file!" );
254 retval = MERROR_FILE;
258 p_f->read_int( p_f, (uint8_t*)&(buffer[i]), 1, 0 );
259 if(
'\n' == buffer[i] ) {
266 assert( i < buffer_sz );
277 MAUG_MHANDLE handle, off_t handle_sz, mfile_t* p_file
282 "locking handle %p as file %p (" OFF_T_FMT
" bytes)...",
283 handle, p_file, handle_sz );
289 p_file->has_bytes = mfile_mem_has_bytes;
290 p_file->read_byte = mfile_mem_read_byte;
291 p_file->read_block = mfile_mem_read_block;
292 p_file->read_int = mfile_file_read_int;
293 p_file->seek = mfile_mem_seek;
294 p_file->read_line = mfile_mem_read_line;
296 p_file->sz = handle_sz;
305# if defined( MVFS_ENABLED )
307# elif defined( MFILE_MMAP )
308 uint8_t* bytes_ptr = NULL;
317# if defined( MVFS_ENABLED )
319 while( NULL != gc_mvfs_data[i] ) {
320 if( 0 == strcmp( filename, gc_mvfs_filenames[i] ) ) {
321 debug_printf( 1,
"found file \"%s\" at VFS index: " SIZE_T_FMT
322 " (size: " OFF_T_FMT
" bytes)",
323 filename, i, *(gc_mvfs_lens[i]) );
329 if( NULL == gc_mvfs_data[i] ) {
330 retval = MERROR_FILE;
331 error_printf(
"file \"%s\" not found in VFS!", filename );
337 p_file->has_bytes = mfile_mem_has_bytes;
338 p_file->read_byte = mfile_mem_read_byte;
339 p_file->read_block = mfile_mem_read_block;
340 p_file->read_int = mfile_file_read_int;
341 p_file->seek = mfile_mem_seek;
342 p_file->read_line = mfile_mem_read_line;
344 p_file->flags = MFILE_FLAG_READ_ONLY;
346 p_file->sz = *(gc_mvfs_lens[i]);
354 retval = mfile_plt_open_read( filename, p_file );
365 munmap( bytes_ptr_h, bytes_sz );
368 switch( p_file->
type ) {
374 mfile_plt_close( p_file );
381 debug_printf( 1,
"unlocked handle %p from file %p...",
382 p_file->
h.mem, p_file );
388 error_printf(
"unknown file type: %d", (p_file)->type );
int MERROR_RETVAL
Return type indicating function returns a value from this list.
Definition merror.h:19
#define maug_mzero(ptr, sz)
Zero the block of memory pointed to by ptr.
Definition mmem.h:65
#define MFILE_CADDY_TYPE_FILE
A standard UNIX file.
Definition mfile.h:42
#define MFILE_CADDY_TYPE_MEM_BUFFER
An array of bytes in memory abstracted through this library.
Definition mfile.h:47
#define MFILE_READ_FLAG_MSBF
Flag for mfile_read_int_t() indicating integer should always be read most significant byte first.
Definition mfile.h:73
#define MFILE_READ_FLAG_LSBF
Flag for mfile_read_int_t() indicating integer should always be read least significant byte first.
Definition mfile.h:66
MERROR_RETVAL mfile_open_read(const char *filename, mfile_t *p_file)
Open a file and read it into memory or memory-map it.
void mfile_close(mfile_t *p_file)
Close a file opened with mfile_open_read().
MERROR_RETVAL mfile_lock_buffer(MAUG_MHANDLE, off_t, mfile_t *p_file)
Lock a buffer and assign it to an mfile_t to read/write.
off_t mem_cursor
Current position if its type is MFILE_CADDY_TYPE_MEM_BUFFER.
Definition mfile.h:107
uint8_t type
The RetroFile Types flag describing this file.
Definition mfile.h:101
union MFILE_HANDLE h
The physical handle or pointer to access the file by.
Definition mfile.h:103
uint8_t * mem_buffer
Locked pointer for MFILE_HANDLE::mem.
Definition mfile.h:109