summaryrefslogtreecommitdiff
path: root/os/boot/libflate/deflatezlibblock.c
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2006-12-22 21:39:35 +0000
committerCharles.Forsyth <devnull@localhost>2006-12-22 21:39:35 +0000
commit74a4d8c26dd3c1e9febcb717cfd6cb6512991a7a (patch)
treec6e220ba61db3a6ea4052e6841296d829654e664 /os/boot/libflate/deflatezlibblock.c
parent46439007cf417cbd9ac8049bb4122c890097a0fa (diff)
20060303
Diffstat (limited to 'os/boot/libflate/deflatezlibblock.c')
-rw-r--r--os/boot/libflate/deflatezlibblock.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/os/boot/libflate/deflatezlibblock.c b/os/boot/libflate/deflatezlibblock.c
new file mode 100644
index 00000000..696cddf2
--- /dev/null
+++ b/os/boot/libflate/deflatezlibblock.c
@@ -0,0 +1,33 @@
+#include "lib9.h"
+#include <flate.h>
+#include "zlib.h"
+
+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;
+}