29#pragma warning(push,1)
50 bitsunshifted = qs[0] | (bitsunshifted << 8);\
51 bitsunshifted = qs[1] | (bitsunshifted << 8);\
55#define SQgetbits(v,n)\
58 v = bits >> (32-(n));\
67 bits = bitsunshifted<<(-bitsleft);\
91 while ((int)bits>=0);\
110 v = (v1|(v<<16))+(1<<n)-4;\
120#define SQmemset(ptr, val, amt) \
123 int intval = (val<<24)|(val<<16)|(val<<8)|val;\
124 int* lptr = (int*)ptr;\
137static int HUFF_decompress(
unsigned char *packbuf,
unsigned char *unpackbuf)
148 unsigned int bitsunshifted=0;
163 unsigned int deltatbl[16];
164 unsigned int cmptbl[16];
165 unsigned char codetbl[256];
166 unsigned char quickcodetbl[256];
167 unsigned char quicklentbl[256];
209 unsigned int basecmp;
214 clue = (
unsigned char)t;
219 basecmp = (
unsigned int) 0;
226 deltatbl[numbits] = basecmp-numchars;
229 bitnumtbl[numbits] = bitnum;
236 cmp = (basecmp << (16-numbits) & 0xffff);
238 cmptbl[numbits++] = cmp;
241 while (!bitnum || cmp);
243 cmptbl[numbits-1] = 0xffffffff;
245 mostbits = numbits-1;
250 signed char leap[256];
251 unsigned char nextchar;
254 nextchar = (
unsigned char) -1;
256 for (i=0;i<numchars;++i)
271 codetbl[i] = nextchar;
289 unsigned char *codeptr;
290 unsigned char *quickcodeptr;
291 unsigned char *quicklenptr;
294 quickcodeptr = quickcodetbl;
295 quicklenptr = quicklentbl;
297 for (bits=1; bits<=mostbits; ++bits)
299 bitnum = bitnumtbl[bits];
302 numbitentries = 1<<(8-bits);
306 nextcode = *codeptr++;
313 for (i=0; i<numbitentries; ++i)
315 *quickcodeptr++ = (
unsigned char) nextcode;
316 *quicklenptr++ = (
unsigned char) nextlen;
329 unsigned char *quickcodeptr = quickcodetbl;
330 unsigned char *quicklenptr = quicklentbl;
339 *qd++ = quickcodeptr[bits>>24];
341 bits = bitsunshifted<<(16-bitsleft);
346 numbits = quicklenptr[bits>>24];
353 *qd++ = quickcodeptr[bits>>24];
356 numbits = quicklenptr[bits>>24];
358 if (bitsleft<0)
break;
359 *qd++ = quickcodeptr[bits>>24];
362 numbits = quicklenptr[bits>>24];
364 if (bitsleft<0)
break;
365 *qd++ = quickcodeptr[bits>>24];
368 numbits = quicklenptr[bits>>24];
370 if (bitsleft<0)
break;
371 *qd++ = quickcodeptr[bits>>24];
374 numbits = quicklenptr[bits>>24];
377 }
while (bitsleft>=0);
381 }
while (bitsleft>=0);
383 bitsleft = bitsleft-16+numbits;
395 cmp = (
unsigned int) (bits>>16);
402 while (cmp>=cmptbl[numbits]);
408 cmp = bits >> (32-(numbits));
410 bitsleft -= (numbits);
412 code = codetbl[cmp-deltatbl[numbits]];
414 if (code!=clue && bitsleft>=0)
423 bits = bitsunshifted<<-bitsleft;
462 code = (
unsigned char)t;
479 if (type==0x32fb || type==0xb2fb)
483 while (qd<unpackbuf+ulen)
486 *qd++ = (
unsigned char) i;
489 else if (type==0x34fb || type==0xb4fb)
495 while (qd<unpackbuf+ulen)
499 *qd++ = (
unsigned char) nextchar;
522 int packtype=ggetm(compresseddata,2);
549 int packtype=ggetm(compresseddata,2);
550 int ssize=(packtype&0x8000)?4:3;
554 len = ggetm((
char *)compresseddata+2+ssize,ssize);
558 len = ggetm((
char *)compresseddata+2,ssize);
566 return(HUFF_decompress((
unsigned char *)compresseddata, (
unsigned char *)dest));
bool GCALL HUFF_is(const void *compresseddata)
int GCALL HUFF_decode(void *dest, const void *compresseddata, int *compressedsize)
#define SQmemset(ptr, val, amt)
int GCALL HUFF_size(const void *compresseddata)