#pragma pack(1)

/* zip-archive headers
 * See: http://www.pkware.com/appnote.html
 */

struct eof_cdir {
    long tag;	/* must be 0x06054b50 */
    short disknum;
    short firstdisk;
    short nTotalCDirThis;
    short nTotalCDir;
    long nBytesCDir;
    long ofsCDir;
    short commentlen;
};

struct cdir {
    long tag;	/* must be 0x02014b50 */
    short version_made;
    short version_extract;
    short gp_bitflag;
    short comp_method;
    short last_mod_file_time;
    short last_mod_file_date;
    long crc32;
    long comp_size;
    long uncomp_size;
    short fname_length;
    short extra_length;
    short comment_length;
    short disknum_start;
    short int_file_attr;
    long ext_file_attr;
    long ofs_local_header;
};

struct fhdr {
    long tag;	/* must be 0x04034b50 */
    short version_needed;
    short flags;
    short method;
    short last_mod_file_time;
    short last_mod_file_date;
    long crc32;
    long comp_size;
    long uncomp_size;
    short fname_length;
    short extra_length;
};


struct meta_data_hdr {
    int tag;
    int uncomp_size;
};

#pragma pack()

typedef int (*NOTIFYPROC)(int code, LPSTR text, ...);

extern BOOL extract_file (char *dst, char *src, int method, int comp_size,
			  int uncomp_size, NOTIFYPROC notify);
extern BOOL unzip_archive (char *dirname, char *data, DWORD size,
			   NOTIFYPROC callback);
extern char *map_new_file (DWORD flags, char *filename, char
			   *pathname_part, int size,
			   WORD wFatDate, WORD wFatTime,
			   NOTIFYPROC callback);
extern BOOL ensure_directory (char *pathname, char *new_part,
			      NOTIFYPROC callback);

#define DIR_CREATED 1
#define CAN_OVERWRITE 2
#define FILE_CREATED 3
#define ZLIB_ERROR 4
#define SYSTEM_ERROR 5
#define NUM_FILES 6
#define FILE_OVERWRITTEN 7
