src/lib/zlibFace.c 1.1

1.1 2009/11/10 23:05:52 kent
Adding zlib interface routines.
Index: src/lib/zlibFace.c
===================================================================
RCS file: src/lib/zlibFace.c
diff -N src/lib/zlibFace.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ src/lib/zlibFace.c	10 Nov 2009 23:05:52 -0000	1.1
@@ -0,0 +1,91 @@
+/* Wrappers around zlib to make interfacing to it a bit easier. */
+
+#include "common.h"
+#include <zlib.h>
+
+static char *zlibErrorMessage(int err)
+/* Convert error code to errorMessage */
+{
+switch (err)
+    {
+    case Z_STREAM_END:
+        return "zlib stream end";
+    case Z_NEED_DICT:
+        return "zlib need dictionary";
+    case Z_ERRNO:
+        return "zlib errno";
+    case Z_STREAM_ERROR:
+        return "zlib data error";
+    case Z_DATA_ERROR:
+        return "zlib data error";
+    case Z_MEM_ERROR:
+        return "zlib mem error";
+    case Z_BUF_ERROR:
+        return "zlib buf error";
+    case Z_VERSION_ERROR:
+        return "zlib version error";
+    case Z_OK:
+        return NULL;
+    default:
+	{
+	static char msg[128];
+	safef(msg, sizeof(msg), "zlib error code %d", err);
+        return msg;
+	}
+    }
+}
+
+size_t zCompress(
+	void *uncompressed, 	/* Start of area to compress. */
+	size_t uncompressedSize,  /* Size of area to compress. */
+	void *compBuf,       /* Where to put compressed bits */
+	size_t compBufSize) /* Size of compressed bits - calculate using zCompBufSize */
+/* Compress data from memory to memory.  Returns size after compression. */
+{
+uLongf compSize = compBufSize;
+int err = compress((Bytef*)compBuf, &compSize, (Bytef*)uncompressed, (uLong)uncompressedSize);
+if (err != 0)
+    errAbort("Couldn't zCompress %lld bytes: %s", 
+    	(long long)uncompressedSize, zlibErrorMessage(err));
+return compSize;
+}
+
+size_t zCompBufSize(size_t uncompressedSize)
+/* Return size of buffer needed to compress something of given size uncompressed. */
+{
+return 1.001*uncompressedSize + 13;
+}
+
+size_t zUncompress(
+        void *compressed,	/* Compressed area */
+	size_t compressedSize,	/* Size after compression */
+	void *uncompBuf,	/* Where to put uncompressed bits */
+	size_t uncompBufSize)	/* Max size of uncompressed bits. */
+/* Uncompress data from memory to memory.  Returns size after decompression. */
+{
+uLongf uncSize = uncompBufSize;
+int err = uncompress(uncompBuf,  &uncSize, compressed, compressedSize);
+if (err != 0)
+    errAbort("Couldn't zUncompress %lld bytes: %s", 
+    	(long long)compressedSize, zlibErrorMessage(err));
+return uncSize;
+}
+
+void zSelfTest(int count)
+/* Run an internal diagnostic. */
+{
+bits32 testData[count];
+int uncSize = count*sizeof(bits32);
+int i;
+for (i=0; i<count; ++i)
+    testData[i] = i;
+int compBufSize = zCompBufSize(uncSize);
+char compBuf[compBufSize];
+int compSize = zCompress(testData, uncSize, compBuf, compBufSize);
+char uncBuf[uncSize];
+zUncompress(compBuf, compSize, uncBuf, uncSize);
+if (memcmp(uncBuf, testData, uncSize) != 0)
+    errAbort("zSelfTest %d failed", count);
+else
+    verbose(2, "zSelfTest %d passed, compression ratio %3.1f\n", count, (double)compSize/uncSize);
+}