5#if !defined( DEBUG_THRESHOLD )
6# define DEBUG_THRESHOLD 1
9#ifndef UPRINTF_BUFFER_SZ_MAX
10# define UPRINTF_BUFFER_SZ_MAX 1024
13#if !defined( MAUG_NO_RETRO ) && !defined( DOCUMENTATION )
15 uint8_t flags,
const char* title,
const char* format, ... );
18#if !defined( MFILE_MMAP ) && !defined( MAUG_NO_STAT )
36#ifndef MAUG_PATH_SZ_MAX
38# define MAUG_PATH_SZ_MAX 40
53#define MFILE_CADDY_TYPE_FILE 0x01
58#define MFILE_CADDY_TYPE_MEM_BUFFER 0x80
66#define MFILE_FLAG_READ_ONLY 0x01
74#define MFILE_FLAG_HANDLE_LOCKED 0x02
95#define MFILE_READ_FLAG_LSBF 0x01
102#define MFILE_READ_FLAG_MSBF 0x01
104#define MFILE_ASSIGN_FLAG_TRIM_EXT 0x01
106#ifndef MFILE_READ_TRACE_LVL
107# define MFILE_READ_TRACE_LVL 0
110#ifndef MFILE_WRITE_TRACE_LVL
111# define MFILE_WRITE_TRACE_LVL 0
114#ifndef MFILE_SEEK_TRACE_LVL
115# define MFILE_SEEK_TRACE_LVL 0
118#ifndef MFILE_CONTENTS_TRACE_LVL
119# define MFILE_CONTENTS_TRACE_LVL 0
143#define mfile_cmp_path( a, b ) strncmp( a, b, MAUG_PATH_SZ_MAX )
155off_t mfile_mem_cursor(
struct MFILE_CADDY* p_file );
156off_t mfile_mem_has_bytes(
struct MFILE_CADDY* p_file );
159 struct MFILE_CADDY* p_file, uint8_t* buf,
size_t buf_sz );
162 struct MFILE_CADDY* p_f,
char* buffer, off_t buffer_sz, uint8_t flags );
164 mfile_t* p_file, uint8_t flags,
const char* fmt, va_list args );
174 struct MFILE_CADDY* p_f,
const uint8_t* buf,
size_t buf_sz );
188 union MFILE_HANDLE
h;
221off_t mfile_file_has_bytes(
struct MFILE_CADDY* p_file );
224 struct MFILE_CADDY* p_file, uint8_t* buf,
size_t buf_sz );
229 struct MFILE_CADDY* p_f,
char* buffer, off_t buffer_sz, uint8_t flags );
232 struct MFILE_CADDY* p_f, uint8_t flags,
const char* fmt, ... );
235 struct MFILE_CADDY* p_f,
const uint8_t* buf,
size_t buf_sz );
238 struct MFILE_CADDY* p_f, uint8_t flags,
const char* fmt, va_list args );
249off_t mfile_has_bytes(
struct MFILE_CADDY* p_file );
252 struct MFILE_CADDY* p_file, uint8_t* buf,
size_t buf_sz );
257 struct MFILE_CADDY* p_file, uint8_t* buf,
size_t buf_sz, uint8_t flags );
260 struct MFILE_CADDY* p_file,
char* buf, off_t buf_sz, uint8_t flags );
263 struct MFILE_CADDY* p_file, uint8_t flags,
const char* fmt, ... );
266 struct MFILE_CADDY* p_f,
const uint8_t* buf,
size_t buf_sz );
276 struct MFILE_CADDY* p_file, uint8_t flags,
const char* fmt, va_list args );
280#define mfile_get_sz( p_file ) ((p_file)->sz)
286 MAUG_MHANDLE,
void* ptr, off_t,
mfile_t* p_file );
309 switch( p_file->
type ) {
311 return mfile_file_cursor( p_file );
313 return mfile_mem_cursor( p_file );
320off_t mfile_has_bytes(
struct MFILE_CADDY* p_file ) {
321 switch( p_file->
type ) {
323 return mfile_file_has_bytes( p_file );
325 return mfile_mem_has_bytes( p_file );
333 struct MFILE_CADDY* p_file, uint8_t* buf,
size_t buf_sz
335 switch( p_file->
type ) {
337 return mfile_file_read_block( p_file, buf, buf_sz );
339 return mfile_mem_read_block( p_file, buf, buf_sz );
347 switch( p_file->
type ) {
349 return mfile_file_seek( p_file, pos );
351 return mfile_mem_seek( p_file, pos );
359 struct MFILE_CADDY* p_file, uint8_t* buf,
size_t buf_sz, uint8_t flags
366#elif defined( MAUG_MSBF )
370 debug_printf( MFILE_READ_TRACE_LVL,
"reading integer forward" );
372 switch( p_file->
type ) {
374 retval = mfile_file_read_block( p_file, buf, buf_sz );
377 retval = mfile_mem_read_block( p_file, buf, buf_sz );
382 debug_printf( MFILE_READ_TRACE_LVL,
"reading integer reversed" );
384 while( 0 < buf_sz ) {
385 switch( p_file->
type ) {
387 retval = mfile_file_read_block( p_file, (buf + (buf_sz - 1)), 1 );
390 retval = mfile_mem_read_block( p_file, (buf + (buf_sz - 1)), 1 );
394 maug_cleanup_if_not_ok();
407 struct MFILE_CADDY* p_file,
char* buf, off_t buf_sz, uint8_t flags
409 switch( p_file->
type ) {
411 return mfile_file_read_line( p_file, buf, buf_sz, flags );
413 return mfile_mem_read_line( p_file, buf, buf_sz, flags );
421 struct MFILE_CADDY* p_file, uint8_t flags,
const char* fmt, ...
426 va_start( vargs, fmt );
427 switch( p_file->
type ) {
429 retval = mfile_file_vprintf( p_file, flags, fmt, vargs );
432 retval = mfile_mem_vprintf( p_file, flags, fmt, vargs );
444 struct MFILE_CADDY* p_f,
const uint8_t* buf,
size_t buf_sz
446 switch( p_f->
type ) {
448 return mfile_file_write_block( p_f, buf, buf_sz );
464off_t mfile_file_has_bytes(
struct MFILE_CADDY* p_file ) {
466 cursor = mfile_cursor( p_file );
467 if( p_file->
sz > cursor ) {
468#if MFILE_READ_TRACE_LVL > 0
469 debug_printf( MFILE_READ_TRACE_LVL,
470 "file has " OFF_T_FMT
" bytes left...",
471 p_file->
sz - cursor );
473 return p_file->
sz - cursor;
475#if MFILE_READ_TRACE_LVL > 0
477 debug_printf( MFILE_READ_TRACE_LVL,
"file has error bytes left!" );
489 char* ext_ptr = NULL;
494 if( MFILE_ASSIGN_FLAG_TRIM_EXT == (MFILE_ASSIGN_FLAG_TRIM_EXT & flags) ) {
495 ext_ptr = maug_strrchr( tgt,
'.' );
496 if( NULL != ext_ptr ) {
524off_t mfile_mem_cursor(
struct MFILE_CADDY* p_file ) {
530off_t mfile_mem_has_bytes(
struct MFILE_CADDY* p_file ) {
545 if( (MAUG_MHANDLE)NULL != p_f->
h.mem ) {
556static void mfile_mem_release(
struct MFILE_CADDY* p_f ) {
562 p_f->flags &= ~MFILE_FLAG_HANDLE_LOCKED;
569 struct MFILE_CADDY* p_file, uint8_t* buf,
size_t buf_sz
577 retval = mfile_mem_lock( p_file );
578 maug_cleanup_if_not_ok();
580 while( 0 < buf_sz-- ) {
586 mfile_mem_release( p_file );
600 debug_printf( MFILE_SEEK_TRACE_LVL,
601 "seeking memory buffer to position " OFF_T_FMT
" (" OFF_T_FMT
")",
610 struct MFILE_CADDY* p_f,
char* buffer, off_t buffer_sz, uint8_t flags
618 if( !mfile_mem_has_bytes( p_f ) ) {
619 error_printf(
"file %s out of bytes!", p_f->filename );
620 retval = MERROR_FILE;
624 while( i < buffer_sz - 1 && mfile_mem_has_bytes( p_f ) ) {
626 if( i + 1 >= buffer_sz ) {
627 error_printf(
"overflow reading string from file %s!", p_f->filename );
628 retval = MERROR_FILE;
632 retval = mfile_mem_read_block( p_f, (uint8_t*)&(buffer[i]), 1 );
633 maug_cleanup_if_not_ok();
634 if(
'\n' == buffer[i] ) {
641 assert( i < buffer_sz );
654 mfile_t* p_file, uint8_t flags,
const char* fmt, va_list args
663 error_printf(
"writing to memory buffer not currently supported!" );
675 struct MFILE_CADDY* p_f,
const uint8_t* buf,
size_t buf_sz
689 retval = mfile_mem_lock( p_f );
690 maug_cleanup_if_not_ok();
692#if MFILE_WRITE_TRACE_LVL > 0
693 debug_printf( MFILE_WRITE_TRACE_LVL,
"p: %p, sz: %u, cur: %u, buf_sz: %u\n",
714 mfile_mem_release( p_f );
722 MAUG_MHANDLE handle,
void* ptr, off_t handle_sz,
mfile_t* p_file
726 debug_printf( MFILE_SEEK_TRACE_LVL,
727 "locking handle %p as file %p (" OFF_T_FMT
" bytes)...",
728 handle, p_file, handle_sz );
730 maug_mzero( p_file,
sizeof(
struct MFILE_CADDY ) );
733 if( (MAUG_MHANDLE)NULL == handle && NULL != ptr ) {
735 }
else if( (MAUG_MHANDLE)NULL != handle && NULL == ptr ) {
736 p_file->
h.mem = handle;
739 error_printf(
"must specify handle or pointer!" );
740 retval = MERROR_FILE;
746 p_file->
sz = handle_sz;
761 retval = mfile_plt_open_read( filename, p_file );
763 if( MERROR_OK == retval ) {
778 retval = mfile_plt_open_write( filename, p_file );
780 if( MERROR_OK == retval ) {
791# if MFILE_SEEK_TRACE_LVL > 0
792 debug_printf( MFILE_SEEK_TRACE_LVL,
"closing file..." );
795 munmap( bytes_ptr_h, bytes_sz );
798 switch( p_file->
type ) {
804 mfile_plt_close( p_file );
811 debug_printf( MFILE_SEEK_TRACE_LVL,
812 "unlocked handle %p from file %p...",
813 p_file->
h.mem, p_file );
819 error_printf(
"unknown file type: %d", (p_file)->
type );
uint16_t MERROR_RETVAL
Return type indicating function returns a value from this list.
Definition: merror.h:28
MERROR_RETVAL mfile_mem_write_block(struct MFILE_CADDY *p_f, const uint8_t *buf, size_t buf_sz)
Insert provided buffer into the given file.
#define MFILE_CADDY_TYPE_FILE
A standard UNIX file.
Definition: mfile.h:53
#define MFILE_CADDY_TYPE_MEM_BUFFER
An array of bytes in memory abstracted through this library.
Definition: mfile.h:58
MERROR_RETVAL mfile_vprintf(struct MFILE_CADDY *p_file, uint8_t flags, const char *fmt, va_list args)
Callback to printf the given format string, replacing tokens from the providied pre-initialized list ...
MERROR_RETVAL mfile_open_read(const maug_path filename, mfile_t *p_file)
Open a file and read it into memory or memory-map it.
MERROR_RETVAL mfile_lock_buffer(MAUG_MHANDLE, void *ptr, off_t, mfile_t *p_file)
Lock a buffer and assign it to an ::mfile_t to read/write.
#define MAUG_PATH_SZ_MAX
Maximum size allocated for asset paths.
Definition: mfile.h:38
#define MFILE_READ_FLAG_MSBF
Flag for mfile_read_int_t() indicating integer should always be read most significant byte first.
Definition: mfile.h:102
#define MFILE_READ_FLAG_LSBF
Flag for mfile_read_int_t() indicating integer should always be read least significant byte first.
Definition: mfile.h:95
void mfile_close(mfile_t *p_file)
Close a file opened with mfile_open_read().
MERROR_RETVAL mfile_assign_path(maug_path tgt, const maug_path src, uint8_t flags)
Copy a maug_path from one place to another, safely observing character limits, etc.
char maug_path[MAUG_PATH_SZ_MAX]
Path/name used to load an asset from disk or access other files.
Definition: mfile.h:138
void retroflat_message(uint8_t flags, const char *title, const char *format,...)
Display a message in a dialog box and/or on stderr.
off_t mem_cursor
Current position if its type is MFILE_CADDY_TYPE_MEM_BUFFER.
Definition: mfile.h:191
#define MFILE_FLAG_HANDLE_LOCKED
Flag for MFILE_CADDY::flags indicating subsequent internal unlocks should unlock the handle back to i...
Definition: mfile.h:74
uint8_t type
The RetroFile Types flag describing this file.
Definition: mfile.h:186
union MFILE_HANDLE h
The physical handle or pointer to access the file by.
Definition: mfile.h:188
uint8_t * mem_buffer
Locked pointer for MFILE_HANDLE::mem.
Definition: mfile.h:193
#define MFILE_FLAG_READ_ONLY
Flag for MFILE_CADDY::flags indicating this file is read-only.
Definition: mfile.h:66
off_t sz
Size of the current file/buffer in bytes.
Definition: mfile.h:196