|  | typedef struct Whack		Whack; | 
|  | typedef struct Unwhack		Unwhack; | 
|  |  | 
|  | enum | 
|  | { | 
|  | WhackStats	= 8, | 
|  | WhackErrLen	= 64,		/* max length of error message from thwack or unthwack */ | 
|  | WhackMaxOff	= 16*1024,	/* max allowed offset */ | 
|  |  | 
|  | HashLog		= 14, | 
|  | HashSize	= 1<<HashLog, | 
|  | HashMask	= HashSize - 1, | 
|  |  | 
|  | MinMatch	= 3,		/* shortest match possible */ | 
|  |  | 
|  | MinDecode	= 8,		/* minimum bits to decode a match or lit; >= 8 */ | 
|  |  | 
|  | MaxSeqMask	= 8,		/* number of bits in coding block mask */ | 
|  | MaxSeqStart	= 256		/* max offset of initial coding block */ | 
|  | }; | 
|  |  | 
|  | struct Whack | 
|  | { | 
|  | ushort		begin;			/* time of first byte in hash */ | 
|  | ushort		hash[HashSize]; | 
|  | ushort		next[WhackMaxOff]; | 
|  | uchar		*data; | 
|  | }; | 
|  |  | 
|  | struct Unwhack | 
|  | { | 
|  | char		err[WhackErrLen]; | 
|  | }; | 
|  |  | 
|  | void	whackinit(Whack*, int level); | 
|  | void	unwhackinit(Unwhack*); | 
|  | int	whack(Whack*, uchar *dst, uchar *src, int nsrc, ulong stats[WhackStats]); | 
|  | int	unwhack(Unwhack*, uchar *dst, int ndst, uchar *src, int nsrc); | 
|  |  | 
|  | int	whackblock(uchar *dst, uchar *src, int ssize); |