7 DBigLenCode = 0x3c, /* minimum code for large lenth encoding */
9 DBigLenBase = 1 /* starting items to encode for big lens */
12 static uchar lenval[1 << (DBigLenBits - 1)] =
14 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
15 3, 3, 3, 3, 3, 3, 3, 3,
23 static uchar lenbits[] =
29 static uchar offbits[16] =
31 5, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 12, 13
34 static ushort offbase[16] =
48 unwhackinit(Unwhack *uw)
54 unwhack(Unwhack *uw, uchar *dst, int ndst, uchar *src, int nsrc)
56 uchar *s, *d, *dmax, *smax, lit;
57 ulong uwbits, lithist;
58 int i, off, len, bits, use, code, uwnbits, overbits;
68 while(src < smax || uwnbits - overbits >= MinDecode){
81 len = lenval[(uwbits >> (uwnbits - 5)) & 0x1f];
85 lit = (uwbits >> uwnbits) & 0xff;
89 lit = (uwbits >> uwnbits) & 0x7f;
93 lit = (lit << 2) | ((uwbits >> uwnbits) & 3);
96 lit = (lit << 3) | ((uwbits >> uwnbits) & 7);
98 lit = (lit - 64) & 0xff;
102 snprint(uw->err, WhackErrLen, "too much output");
106 lithist = (lithist << 1) | (lit < 32) | (lit > 127);
114 uwnbits -= lenbits[len];
116 uwnbits -= DBigLenBits;
117 code = ((uwbits >> uwnbits) & ((1 << DBigLenBits) - 1)) - DBigLenCode;
120 bits = (DBigLenBits & 1) ^ 1;
127 snprint(uw->err, WhackErrLen, "len out of range");
130 code |= (uwbits >> uwnbits) & 1;
136 while(uwnbits <= 24){
150 bits = (uwbits >> uwnbits) & 0xf;
152 bits = offbits[bits];
155 off |= (uwbits >> uwnbits) & ((1 << bits) - 1);
159 snprint(uw->err, WhackErrLen, "offset out of range: off=%d d=%ld len=%d nbits=%d", off, d - dst, len, uwnbits);
163 snprint(uw->err, WhackErrLen, "len out of range");
167 for(i = 0; i < len; i++)
171 if(uwnbits < overbits){
172 snprint(uw->err, WhackErrLen, "compressed data overrun");