#define	NOERROR			1
#define	ERROR			0
#define	ERROR_NOTCRUNCHED	XPKERR_WRONGFORM
#define	ERROR_LESSMEM		XPKERR_NOMEM
#define	ERROR_OVERFLOW		XPKERR_EXPANSION

#ifndef	BITSPERBYTE
#define	BITSPERBYTE	8
#endif
#ifndef	BITSPERINT
#define	BITSPERINT	32
#endif

#define	INDEX_BITS	2
#define	INDEX_MASK	((1 << INDEX_BITS) - 1)
#define	INDEX_LENGTH	(BITSPERINT / INDEX_BITS)

#define	HISTORY_BITS	16
#define	HISTORY_MASK	((1 << HISTORY_BITS) - 1)
#define	HISTORY_LENGTH	HISTORY_MASK

#define	MATCHLEN_BITS	8
#define	MATCHLEN_MASK	((1 << MATCHLEN_BITS) - 1)
#define	MATCHLEN_LENGTH	MATCHLEN_MASK

#define	LITERAL_BITS	8
#define	LITERAL_MASK	((1 << LITERAL_BITS) - 1)
#define	LITERAL_LENGTH	LITERAL_MASK

#define	MIN_MATCH	((HISTORY_BITS + MATCHLEN_BITS) / BITSPERBYTE)
#define	MAX_MATCH	(MATCHLEN_LENGTH + MIN_MATCH)

#define	MAX_REVIEW	3					/* sizes grow if more than 3 */

#define	LOOKUP_BITS	16
#define	LOOKUP_SIZE	(1 << LOOKUP_BITS)
#define	LOOKUP_MASK	(LOOKUP_SIZE - 1)
#define	LOOKUP_LENGTH	LOOKUP_MASK
#if 0
#define	LOOKUP_PREFUNCTION(address) \
			((*((unsigned char *)     ((address) + 0)) << 8) ^ \
			 (*((unsigned short int *)((address) + 0 + sizeof(unsigned char)))))
#define	LOOKUP_POSTFUNCTION(address, index) \
			((*((unsigned char *)     ((address) + index)) << 8) ^ \
			 (*((unsigned short int *)((address) + index + sizeof(unsigned char)))))
#else
#define	LOOKUP_PREFUNCTION(address) \
			((*((unsigned short int *)((address) + 0))) ^ \
			 (*((unsigned char *)     ((address) + 0 + sizeof(unsigned short int)))))
#define	LOOKUP_POSTFUNCTION(address, index) \
			((*((unsigned short int *)((address) + index))) ^ \
			 (*((unsigned char *)     ((address) + index + sizeof(unsigned short int)))))
#endif

#define	NODES_CLUSTER	64
#define	NODES_MIN	2
#define	NODES_BACKWALL	1
#define	NODES_SIZE(num)	(((num + NODES_BACKWALL) * sizeof(unsigned char *)) + sizeof(struct hashnode))

//#define	RESIZED_HISTORY					/* does not work, I don't know who to convert my asm to c */

struct hashnode {
  int count;							/* number of valid hashentries */
  unsigned char *entries[0];					/* the entries */
};

struct hashroot {
  int maxcount;							/* maximum number of hashentries */
  struct hashnode *node;					/* the node */
};

int annihilate(register int inSize __asm__ ("d0"),
	       register unsigned char *inMem __asm__ ("a0"),
	       register int outSize __asm__ ("d1"),
	       register unsigned char *outMem __asm__ ("a1"),
	       int Mode);
int reanimate(register int inSize __asm__ ("d1"),
	      register unsigned char *inMem __asm__ ("a0"),
	      register int outSize __asm__ ("d0"),
	      register unsigned char *outMem __asm__ ("a1"));
