#include <clib/asyncio_protos.h>
#include <zlib.h>
#include "msg.h"

#define LOCAL		static
#define GLOBAL		extern
#define BUFSIZE		4096
#define UNIX2AMIGA_TIME	( 2922 * 86400 )	/* Borrowed from DICE C sources */
#define TAR_NAME_LEN	100

struct TarHeader
{					/* byte offset */
	TEXT	Name[ 100 ];		/*   0 */
	TEXT	Mode[ 8 ];		/* 100 */
	TEXT	UserID[ 8 ];		/* 108 */
	TEXT	GroupID[ 8 ];		/* 116 */
	TEXT	Size[ 12 ];		/* 124 */
	TEXT	MTime[ 12 ];		/* 136 */
	TEXT	Checksum[ 8 ];		/* 148 */
	TEXT	Typeflag;		/* 156 */
	TEXT	Linkname[ 100 ];	/* 157 */
	TEXT	Magic[ 6 ];		/* 257 */
	TEXT	Version[ 2 ];		/* 263 */
	TEXT	UserName[ 32 ];		/* 265 */
	TEXT	GroupName[ 32 ];	/* 297 */
	TEXT	DevMajor[ 8 ];		/* 329 */
	TEXT	DevMinor[ 8 ];		/* 337 */
	TEXT	Prefix[ 155 ];		/* 345 */
};					/* 500 */

/* Values used in typeflag field.  */
#define TF_FILE		'0'	/* Regular file */
#define TF_AFILE	'\0'	/* Regular file */
#define TF_LINK		'1'	/* Link */
#define TF_SYM		'2'	/* Reserved - but GNU tar uses this for links... */
#define TF_CHAR		'3'	/* Character special */
#define TF_BLOCK	'4'	/* Block special */
#define TF_DIR		'5'	/* Drawer */
#define TF_FIFO		'6'	/* FIFO special */
#define TF_CONT		'7'	/* Reserved */

/* Bits used in the mode field, values in octal.  */
#define TM_SUID		04000	/* Set UID on execution */
#define TM_SGID		02000	/* Set GID on execution */
#define TM_SVTX		01000	/* Reserved */
				/* File permissions */
#define TM_UREAD	00400	/* Read by owner */
#define TM_UWRITE	00200	/* Write by owner */
#define TM_UEXEC	00100	/* Execute/search by owner */
#define TM_GREAD	00040	/* Read by group */
#define TM_GWRITE	00020	/* Write by group */
#define TM_GEXEC	00010	/* Execute/search by group */
#define TM_OREAD	00004	/* Read by other */
#define TM_OWRITE	00002	/* Write by other */
#define TM_OEXEC	00001	/* Execute/search by other */

/* The size of a tar block */
#define BLOCKSIZE 512

/* A block in a tar file */
union TarBuffer
{
	UBYTE			Buffer[ BLOCKSIZE ];
	struct TarHeader	Header;
};


/* UnTAR.c */

GLOBAL struct DosLibrary	*DOSBase;
GLOBAL struct Library		*UtilityBase;


/* Dos.c */

VOID	PrintfFault( LONG err, const STRPTR msg, ... );
LONG	SetTarTime( const STRPTR filename, LONG time );
LONG	SetTarMode( const STRPTR filename, LONG mode );
LONG	Makedir( STRPTR newdir );
BPTR	ChangeDir( const STRPTR dirname );
LONG	OverwriteOk( const STRPTR name );

VOID	FreePatterns( struct List *list );
LONG	ParsePatterns( struct List *list, const STRPTR *patterns, LONG caseSensitive );
BOOL	MatchName( const STRPTR name, struct List *patterns );


/* GZIO.c */

typedef struct gzStream
{
	z_stream	Stream;
	AsyncFile	*File;		/* .gz file */
	STRPTR		Path;		/* for debugging */
	STRPTR		Msg;		/* error message */
	APTR		Buffer;		/* input buffer */
	LONG		BufferSize;	/* size of input buffer */
	ULONG		Crc;		/* crc32 of uncompressed data */
	LONG		Eof;		/* Set if end of input file */
	LONG		Err;		/* Error code for last stream operation */
	BYTE		Transparent;	/* 1 if input file is not a .gz file */
} gzStream;

gzStream *OpenGZ( const STRPTR name, LONG bufsize );
LONG	CloseGZ( gzStream *file );
ULONG	ReadGZ( gzStream *file, APTR buf, ULONG len );
STRPTR	ErrorGZ( gzStream *file );


/* Locale.c */

GLOBAL LONG		GMTOffset;

const STRPTR	GetString( STRPTR str );
const STRPTR	GetMonthString( LONG month );


/* Memory.c */

APTR	MemAlloc( ULONG size );
VOID	MemFree( APTR mem );

