summaryrefslogtreecommitdiffstats
path: root/debian/htdig/htdig-3.2.0b6/htcommon/HtZlibCodec.cc
diff options
context:
space:
mode:
Diffstat (limited to 'debian/htdig/htdig-3.2.0b6/htcommon/HtZlibCodec.cc')
-rw-r--r--debian/htdig/htdig-3.2.0b6/htcommon/HtZlibCodec.cc136
1 files changed, 136 insertions, 0 deletions
diff --git a/debian/htdig/htdig-3.2.0b6/htcommon/HtZlibCodec.cc b/debian/htdig/htdig-3.2.0b6/htcommon/HtZlibCodec.cc
new file mode 100644
index 00000000..ac48877f
--- /dev/null
+++ b/debian/htdig/htdig-3.2.0b6/htcommon/HtZlibCodec.cc
@@ -0,0 +1,136 @@
+//
+// HtZlibCodec.cc
+//
+// HtZlibCodec: Provide a generic access to the zlib compression routines.
+// If zlib is not present, encode and decode are simply
+// assignment functions.
+//
+// Part of the ht://Dig package <http://www.htdig.org/>
+// Copyright (c) 1995-2004 The ht://Dig Group
+// For copyright details, see the file COPYING in your distribution
+// or the GNU Library General Public License (LGPL) version 2 or later
+// <http://www.gnu.org/copyleft/lgpl.html>
+//
+// $Id: HtZlibCodec.cc,v 1.4 2004/05/28 13:15:12 lha Exp $
+//
+
+#ifdef HAVE_CONFIG_H
+#include "htconfig.h"
+#endif /* HAVE_CONFIG_H */
+
+#include "HtZlibCodec.h"
+#include "defaults.h" // For "config"
+
+#if defined(HAVE_LIBZ) && defined(HAVE_ZLIB_H)
+#include <zlib.h>
+#endif
+
+
+HtZlibCodec::HtZlibCodec()
+{
+}
+
+HtZlibCodec::~HtZlibCodec()
+{
+}
+
+String HtZlibCodec::encode(const String &str) const
+{
+ String s = str;
+#if defined(HAVE_LIBZ) && defined(HAVE_ZLIB_H)
+ HtConfiguration* config= HtConfiguration::config();
+ static int cf=config->Value("compression_level",0);
+ if (cf) {
+ //
+ // Now compress s into c_s
+ //
+ unsigned char c_buffer[16384];
+ String c_s;
+ z_stream c_stream; /* compression stream */
+ c_stream.zalloc=(alloc_func)0;
+ c_stream.zfree=(free_func)0;
+ c_stream.opaque=(voidpf)0;
+ // Get compression factor, default to best
+ if (cf<-1) cf=-1; else if (cf>9) cf=9;
+ int err=deflateInit(&c_stream,cf);
+ if (err!=Z_OK) return 0;
+ int len=s.length();
+ c_stream.next_in=(Bytef*)(char *)s;
+ c_stream.avail_in=len;
+ while (err==Z_OK && c_stream.total_in!=(uLong)len) {
+ c_stream.next_out=c_buffer;
+ c_stream.avail_out=sizeof(c_buffer);
+ err=deflate(&c_stream,Z_NO_FLUSH);
+ c_s.append((char *)c_buffer,c_stream.next_out-c_buffer);
+ }
+ // Finish the stream
+ for (;;) {
+ c_stream.next_out=c_buffer;
+ c_stream.avail_out=sizeof(c_buffer);
+ err=deflate(&c_stream,Z_FINISH);
+ c_s.append((char *)c_buffer,c_stream.next_out-c_buffer);
+ if (err==Z_STREAM_END) break;
+ //CHECK_ERR(err, "deflate");
+ }
+ err=deflateEnd(&c_stream);
+ s=c_s;
+ }
+#endif // HAVE_LIBZ && HAVE_ZLIB_H
+ return s;
+}
+
+
+String HtZlibCodec::decode(const String &str) const
+{
+ String s = str;
+#if defined(HAVE_LIBZ) && defined(HAVE_ZLIB_H)
+ HtConfiguration* config= HtConfiguration::config();
+ static int cf=config->Value("compression_level",0);
+ if (cf) {
+ String c_s;
+ // Decompress stream
+ unsigned char c_buffer[16384];
+ z_stream d_stream;
+ d_stream.zalloc=(alloc_func)0;
+ d_stream.zfree=(free_func)0;
+ d_stream.opaque=(voidpf)0;
+
+ unsigned int len=s.length();
+ d_stream.next_in=(Bytef*)(char *)s;
+ d_stream.avail_in=len;
+
+ int err=inflateInit(&d_stream);
+ if (err!=Z_OK) return 1;
+
+ while (err==Z_OK && d_stream.total_in<len) {
+ d_stream.next_out=c_buffer;
+ d_stream.avail_out=sizeof(c_buffer);
+ err=inflate(&d_stream,Z_NO_FLUSH);
+ c_s.append((char *)c_buffer,d_stream.next_out-c_buffer);
+ if (err==Z_STREAM_END) break;
+ }
+
+ err=inflateEnd(&d_stream);
+ s=c_s;
+ }
+#endif // HAVE_LIBZ && HAVE_ZLIB_H
+ return s;
+}
+
+
+// Canonical singleton interface.
+HtZlibCodec *
+HtZlibCodec::instance()
+{
+ static HtZlibCodec *_instance = 0;
+
+ if (_instance == 0)
+ {
+ _instance = new HtZlibCodec();
+ }
+
+ return _instance;
+}
+
+
+// End of HtZlibCodec.cc