plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

deflatezlibblock.c (686B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <flate.h>
      4 #include "zlib.h"
      5 
      6 int
      7 deflatezlibblock(uchar *dst, int dsize, uchar *src, int ssize, int level, int debug)
      8 {
      9 	ulong adler;
     10 	int n;
     11 
     12 	if(dsize < 6)
     13 		return FlateOutputFail;
     14 
     15 	n = deflateblock(dst + 2, dsize - 6, src, ssize, level, debug);
     16 	if(n < 0)
     17 		return n;
     18 
     19 	dst[0] = ZlibDeflate | ZlibWin32k;
     20 
     21 	/* bogus zlib encoding of compression level */
     22 	dst[1] = ((level > 2) + (level > 5) + (level > 8)) << 6;
     23 
     24 	/* header check field */
     25 	dst[1] |= 31 - ((dst[0] << 8) | dst[1]) % 31;
     26 
     27 	adler = adler32(1, src, ssize);
     28 	dst[n + 2] = adler >> 24;
     29 	dst[n + 3] = adler >> 16;
     30 	dst[n + 4] = adler >> 8;
     31 	dst[n + 5] = adler;
     32 
     33 	return n + 6;
     34 }