cog/Frameworks/psflib/psflib/psflib.h

72 lines
2.3 KiB
C

#ifndef PSFLIB_H
#define PSFLIB_H
#include <stdio.h>
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct psf_file_callbacks
{
/* list of characters which act as path separators, null terminated */
const char * path_separators;
/* accepts UTF-8 encoding, returns file handle */
void * (* fopen )(const char *);
/* reads to specified buffer, returns count of size bytes read */
size_t (* fread )(void *, size_t size, size_t count, void * handle);
/* returns zero on success, -1 on error */
int (* fseek )(void * handle, int64_t, int);
/* returns zero on success, -1 on error */
int (* fclose)(void * handle);
/* returns current file offset */
long (* ftell )(void * handle);
} psf_file_callbacks;
/* Receives exe and reserved bodies, with deepest _lib->_lib->_lib etc head first, followed
* by the specified file itself, then followed by numbered library chains.
*
* Example:
*
* outermost file, a.psf, has _lib=b.psf and _lib2=c.psf tags; b.psf has _lib=d.psf:
*
* the callback will be passed the contents of d.psf, then b.psf, then a.psf, then c.psf
*
* Returning non-zero indicates an error.
*/
typedef int (* psf_load_callback)(void * context, const uint8_t * exe, size_t exe_size,
const uint8_t * reserved, size_t reserved_size);
/* Receives the name/value pairs from the outermost file, one at a time.
*
* Returning non-zero indicates an error.
*/
typedef int (* psf_info_callback)(void * context, const char * name, const char * value);
/* Loads the PSF chain starting with uri, opened using file_callbacks, passes the tags,
* if any, to the optional info_target callback, then passes all loaded data to load_target
* with the highest priority file first.
*
* allowed_version may be set to zero to probe the file version, but is not recommended when
* actually loading files into an emulator state.
*
* Both load_target and info_target are optional.
*
* Returns negative on error, PSF version on success.
*/
int psf_load( const char * uri, const psf_file_callbacks * file_callbacks, uint8_t allowed_version,
psf_load_callback load_target, void * load_context, psf_info_callback info_target, void * info_context );
#ifdef __cplusplus
}
#endif
#endif // PSFLIB_H