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
 |