Пример #1
0
int
deflatezlibblock(uchar *dst, int dsize, uchar *src, int ssize, int level, int debug)
{
	ulong adler;
	int n;

	if(dsize < 6)
		return FlateOutputFail;

	n = deflateblock(dst + 2, dsize - 6, src, ssize, level, debug);
	if(n < 0)
		return n;

	dst[0] = ZlibDeflate | ZlibWin32k;

	/* bogus zlib encoding of compression level */
	dst[1] = ((level > 2) + (level > 5) + (level > 8)) << 6;

	/* header check field */
	dst[1] |= 31 - ((dst[0] << 8) | dst[1]) % 31;

	adler = adler32(1, src, ssize);
	dst[n + 2] = adler >> 24;
	dst[n + 3] = adler >> 16;
	dst[n + 4] = adler >> 8;
	dst[n + 5] = adler;

	return n + 6;
}
Пример #2
0
ulong
writeBlock(uchar *b, int type)
{
	uchar *cb, *ob;
	int n;
	PaqBlock bh;
	uchar buf[BlockSize];
	ulong offset;

	offset = Boffset(out);

	bh.magic = BlockMagic;
	bh.size = blocksize;	
	bh.type = type;
	bh.encoding = NoEnc;
	bh.adler32 = adler32(0, b, blocksize);
	ob = b;

	if(!uflag) {
		cb = emallocz(blocksize);
		n = deflateblock(cb, blocksize, b, blocksize, 6, 0);
		if(n > 0 && n < blocksize) {
			bh.encoding = DeflateEnc;
			bh.size = n;
			ob = cb;
		}	
	}

	putBlock(buf, &bh);
	outWrite(buf, sizeof(buf));
	outWrite(ob, bh.size);
	
	if(ob != b)
		free(ob);
	return offset;
}