picodrive/unzip/unzip.h
notaz cc68a136aa initial import
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@2 be3aeb3a-fb24-0410-a615-afba39da0efa
2006-12-19 20:53:21 +00:00

144 lines
3.5 KiB
C

#ifndef __UNZIP_H
#define __UNZIP_H
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
// notaz: something's missing this
#ifndef UINT16
#define UINT32 unsigned int
#define UINT16 unsigned short
#define UINT8 unsigned char
#endif
/***************************************************************************
* Support for retrieving files from zipfiles
***************************************************************************/
struct zipent {
UINT32 cent_file_header_sig;
UINT8 version_made_by;
UINT8 host_os;
UINT8 version_needed_to_extract;
UINT8 os_needed_to_extract;
UINT16 general_purpose_bit_flag;
UINT16 compression_method;
UINT16 last_mod_file_time;
UINT16 last_mod_file_date;
UINT32 crc32;
UINT32 compressed_size;
UINT32 uncompressed_size;
UINT16 filename_length;
UINT16 extra_field_length;
UINT16 file_comment_length;
UINT16 disk_number_start;
UINT16 internal_file_attrib;
UINT32 external_file_attrib;
UINT32 offset_lcl_hdr_frm_frst_disk;
char* name; /* 0 terminated */
};
typedef struct _ZIP {
char* zip; /* zip name */
FILE* fp; /* zip handler */
long length; /* length of zip file */
char* ecd; /* end_of_cent_dir data */
unsigned ecd_length; /* end_of_cent_dir length */
char* cd; /* cent_dir data */
unsigned cd_pos; /* position in cent_dir */
struct zipent ent; /* buffer for readzip */
/* end_of_cent_dir */
UINT32 end_of_cent_dir_sig;
UINT16 number_of_this_disk;
UINT16 number_of_disk_start_cent_dir;
UINT16 total_entries_cent_dir_this_disk;
UINT16 total_entries_cent_dir;
UINT32 size_of_cent_dir;
UINT32 offset_to_start_of_cent_dir;
UINT16 zipfile_comment_length;
char* zipfile_comment; /* pointer in ecd */
} ZIP;
/* Opens a zip stream for reading
return:
!=0 success, zip stream
==0 error
*/
ZIP* openzip(const char* path);
/* Closes a zip stream */
void closezip(ZIP* zip);
/* Reads the current entry from a zip stream
in:
zip opened zip
return:
!=0 success
==0 error
*/
struct zipent* readzip(ZIP* zip);
/* Suspend access to a zip file (release file handler)
in:
zip opened zip
note:
A suspended zip is automatically reopened at first call of
readuncompressd() or readcompressed() functions
*/
void suspendzip(ZIP* zip);
/* Resets a zip stream to the first entry
in:
zip opened zip
note:
ZIP file must be opened and not suspended
*/
void rewindzip(ZIP* zip);
/* Read compressed data from a zip entry
in:
zip opened zip
ent entry to read
out:
data buffer for data, ent.compressed_size UINT8s allocated by the caller
return:
==0 success
<0 error
*/
int readcompresszip(ZIP* zip, struct zipent* ent, char* data);
/* Read decompressed data from a zip entry
in:
zip zip stream open
ent entry to read
out:
data buffer for data, ent.uncompressed_size UINT8s allocated by the caller
return:
==0 success
<0 error
*/
int readuncompresszip(ZIP* zip, struct zipent* ent, char* data);
/* public functions */
int /* error */ load_zipped_file (const char *zipfile, const char *filename,
unsigned char **buf, unsigned int *length);
int /* error */ checksum_zipped_file (const char *zipfile, const char *filename, unsigned int *length, unsigned int *sum);
void unzip_cache_clear(void);
/* public globals */
extern int gUnzipQuiet; /* flag controls error messages */
#ifdef __cplusplus
}
#endif
#endif