17dd7cddfSDavid du Colombier typedef struct Thwack Thwack; 27dd7cddfSDavid du Colombier typedef struct Unthwack Unthwack; 37dd7cddfSDavid du Colombier typedef struct ThwBlock ThwBlock; 47dd7cddfSDavid du Colombier typedef struct UnthwBlock UnthwBlock; 57dd7cddfSDavid du Colombier 67dd7cddfSDavid du Colombier enum 77dd7cddfSDavid du Colombier { 87dd7cddfSDavid du Colombier ThwStats = 8, 97dd7cddfSDavid du Colombier ThwErrLen = 64, /* max length of error message from thwack or unthwack */ 107dd7cddfSDavid du Colombier ThwMaxBlock = 1600, /* max size of compressible block */ 117dd7cddfSDavid du Colombier 127dd7cddfSDavid du Colombier HashLog = 12, 137dd7cddfSDavid du Colombier HashSize = 1<<HashLog, 147dd7cddfSDavid du Colombier HashMask = HashSize - 1, 157dd7cddfSDavid du Colombier 167dd7cddfSDavid du Colombier MinMatch = 3, /* shortest match possible */ 177dd7cddfSDavid du Colombier 187dd7cddfSDavid du Colombier MaxOff = 8, 197dd7cddfSDavid du Colombier OffBase = 6, 207dd7cddfSDavid du Colombier 217dd7cddfSDavid du Colombier MinDecode = 8, /* minimum bits to decode a match or lit; >= 8 */ 227dd7cddfSDavid du Colombier 237dd7cddfSDavid du Colombier CompBlocks = 10, /* max blocks used to encode data */ 24*59cc4ca5SDavid du Colombier EWinBlocks = 64, /* blocks held in encoder window */ 25*59cc4ca5SDavid du Colombier DWinBlocks = EWinBlocks, /* blocks held in decoder window */ 267dd7cddfSDavid du Colombier 277dd7cddfSDavid du Colombier MaxSeqMask = 8, /* number of bits in coding block mask */ 287dd7cddfSDavid du Colombier MaxSeqStart = 256 /* max offset of initial coding block */ 297dd7cddfSDavid du Colombier }; 307dd7cddfSDavid du Colombier 317dd7cddfSDavid du Colombier struct ThwBlock 327dd7cddfSDavid du Colombier { 337dd7cddfSDavid du Colombier ulong seq; /* sequence number for this data */ 347dd7cddfSDavid du Colombier uchar acked; /* ok to use this block; the decoder has it */ 357dd7cddfSDavid du Colombier ushort begin; /* time of first byte in hash */ 367dd7cddfSDavid du Colombier uchar *edata; /* last byte of valid data */ 377dd7cddfSDavid du Colombier ushort maxoff; /* time of last valid hash entry */ 387dd7cddfSDavid du Colombier ushort *hash; 397dd7cddfSDavid du Colombier uchar *data; 407dd7cddfSDavid du Colombier }; 417dd7cddfSDavid du Colombier 427dd7cddfSDavid du Colombier struct Thwack 437dd7cddfSDavid du Colombier { 447dd7cddfSDavid du Colombier QLock acklock; /* locks slot, blocks[].(acked|seq) */ 457dd7cddfSDavid du Colombier int slot; /* next block to use */ 467dd7cddfSDavid du Colombier ThwBlock blocks[EWinBlocks]; 477dd7cddfSDavid du Colombier ushort hash[EWinBlocks][HashSize]; 487dd7cddfSDavid du Colombier Block *data[EWinBlocks]; 497dd7cddfSDavid du Colombier }; 507dd7cddfSDavid du Colombier 517dd7cddfSDavid du Colombier struct UnthwBlock 527dd7cddfSDavid du Colombier { 537dd7cddfSDavid du Colombier ulong seq; /* sequence number for this data */ 547dd7cddfSDavid du Colombier ushort maxoff; /* valid data in each block */ 557dd7cddfSDavid du Colombier uchar *data; 567dd7cddfSDavid du Colombier }; 577dd7cddfSDavid du Colombier 587dd7cddfSDavid du Colombier struct Unthwack 597dd7cddfSDavid du Colombier { 607dd7cddfSDavid du Colombier int slot; /* next block to use */ 61*59cc4ca5SDavid du Colombier char err[ThwErrLen]; 627dd7cddfSDavid du Colombier UnthwBlock blocks[DWinBlocks]; 637dd7cddfSDavid du Colombier uchar data[DWinBlocks][ThwMaxBlock]; 647dd7cddfSDavid du Colombier }; 657dd7cddfSDavid du Colombier 667dd7cddfSDavid du Colombier void thwackinit(Thwack*); 677dd7cddfSDavid du Colombier void thwackcleanup(Thwack *tw); 687dd7cddfSDavid du Colombier void unthwackinit(Unthwack*); 69*59cc4ca5SDavid du Colombier int thwack(Thwack*, int mustadd, uchar *dst, int ndst, Block *bsrc, ulong seq, ulong stats[ThwStats]); 707dd7cddfSDavid du Colombier void thwackack(Thwack*, ulong seq, ulong mask); 717dd7cddfSDavid du Colombier int unthwack(Unthwack*, uchar *dst, int ndst, uchar *src, int nsrc, ulong seq); 727dd7cddfSDavid du Colombier ulong unthwackstate(Unthwack *ut, uchar *mask); 73*59cc4ca5SDavid du Colombier int unthwackadd(Unthwack *ut, uchar *src, int nsrc, ulong seq); 74