95351749a6
revised file format to make compression global --HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%4035
82 lines
2.3 KiB
C
82 lines
2.3 KiB
C
#ifndef _INCLUDE_SPFILE_H
|
|
#define _INCLUDE_SPFILE_H
|
|
|
|
#include "sp_file_headers.h"
|
|
|
|
/**
|
|
* Used for overwriting writing routines.
|
|
*/
|
|
typedef struct sp_writefuncs_s
|
|
{
|
|
void *(*fnOpen)(const char *); /* filename, returns handle */
|
|
void (*fnClose)(void *); /* handle */
|
|
/* buffer, size, count, handle, returns count written */
|
|
size_t (*fnWrite)(const void *, size_t, size_t, void *);
|
|
/* buffer, size, count, handle, returns count read */
|
|
size_t (*fnRead)(void *, size_t, size_t, void *);
|
|
/* returns current position from start */
|
|
size_t (*fnGetPos)(void *);
|
|
/* sets current position from start, return 0 for success, nonzero for error */
|
|
int (*fnSetPos)(void *, size_t);
|
|
} sp_writefuncs_t;
|
|
|
|
typedef struct sp_file_s
|
|
{
|
|
sp_file_hdr_t header;
|
|
sp_file_section_t *sections;
|
|
size_t *offsets;
|
|
sp_writefuncs_t funcs;
|
|
size_t lastsection;
|
|
size_t curoffs;
|
|
void *handle;
|
|
int state;
|
|
char *nametab;
|
|
size_t nametab_idx;
|
|
} sp_file_t;
|
|
|
|
/**
|
|
* Creates a new SourcePawn binary file.
|
|
* You may optionally specify alternative writing functions.
|
|
*/
|
|
sp_file_t *spfw_create(const char *name, sp_writefuncs_t *optfuncs);
|
|
|
|
/**
|
|
* Closes file handle and frees memory.
|
|
*/
|
|
void spfw_destroy(sp_file_t *spf);
|
|
|
|
/**
|
|
* Adds a section name to the header.
|
|
* Only valid BEFORE finalization.
|
|
* Returns the number of sections, or 0 on failure.
|
|
*/
|
|
uint8_t spfw_add_section(sp_file_t *spf, const char *name);
|
|
|
|
/**
|
|
* Finalizes the section header.
|
|
* This means no more sections can be added after this call.
|
|
* Also, aligns the writer to the first section.
|
|
* Returns 0 on success, nonzero on error.
|
|
*/
|
|
int spfw_finalize_header(sp_file_t *spf);
|
|
|
|
/**
|
|
* Finalizes the current section and advances to the next.
|
|
* In order for this to be accurate, the file pointer must
|
|
* reside at the end before calling this, because the size
|
|
* is calculated by differencing with the last known offset.
|
|
* Returns 1 if there are more sections left, 0 otherwise.
|
|
* Returns -1 if the file state is wrong.
|
|
*/
|
|
int spfw_next_section(sp_file_t *spf);
|
|
|
|
/**
|
|
* Finalizes all sections.
|
|
* Cannot be called until all sections are used.
|
|
* Must be called with the file pointer at the end.
|
|
* Also does compression!
|
|
*/
|
|
int spfw_finalize_all(sp_file_t *spf);
|
|
|
|
#endif //_INCLUDE_SPFILE_H
|