diff options
Diffstat (limited to 'debian/htdig/htdig-3.2.0b6/htword/WordDBCompress.cc')
-rw-r--r-- | debian/htdig/htdig-3.2.0b6/htword/WordDBCompress.cc | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/debian/htdig/htdig-3.2.0b6/htword/WordDBCompress.cc b/debian/htdig/htdig-3.2.0b6/htword/WordDBCompress.cc new file mode 100644 index 00000000..4fe9f738 --- /dev/null +++ b/debian/htdig/htdig-3.2.0b6/htword/WordDBCompress.cc @@ -0,0 +1,175 @@ +// +// WordDBCompress.h +// +// WordDBCompress: Implements specific compression scheme for +// Berkeley DB pages containing WordReferences objects. +// +// Part of the ht://Dig package <http://www.htdig.org/> +// Copyright (c) 1999-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: WordDBCompress.cc,v 1.7 2004/05/28 13:15:26 lha Exp $ +// + +#ifdef HAVE_CONFIG_H +#include "htconfig.h" +#endif /* HAVE_CONFIG_H */ + +#include <ctype.h> + +#include "WordDBPage.h" +#include "WordDBCompress.h" +#include "WordBitCompress.h" + +/* + * WordDBCompress: C-callbacks, actually called by Berkeley-DB + * they just call their WordDBCompress equivalents (by using user_data) + */ +extern "C" +{ + +static int WordDBCompress_compress_c(const u_int8_t* inbuff, int inbuff_length, u_int8_t** outbuffp, int* outbuff_lengthp, void *user_data) +{ + if(!user_data) { + fprintf(stderr, "WordDBCompress_compress_c:: user_data is NULL"); + return NOTOK; + } + return ((WordDBCompress *)user_data)->Compress((unsigned char*)inbuff, inbuff_length, (unsigned char**)outbuffp, outbuff_lengthp); +} + +static int WordDBCompress_uncompress_c(const u_int8_t* inbuff, int inbuff_length, u_int8_t* outbuff, int outbuff_length, void *user_data) +{ + if(!user_data) { + fprintf(stderr, "WordDBCompress_uncompress_c:: user_data is NULL"); + return NOTOK; + } + return ((WordDBCompress *)user_data)->Uncompress((unsigned char *)inbuff, inbuff_length, (unsigned char*)outbuff, outbuff_length); +} + +} + +// *********************************************** +// *********** WordDBCompress ******************* +// *********************************************** + +WordDBCompress::WordDBCompress() +{ + + cmprInfo = 0; + + // + // DEBUGING / BENCHMARKING + // + debug = 0; + + //zlib WordDB Compression + use_zlib = 0; + zlib_level = 0; + +} + + +WordDBCompress::WordDBCompress(int zlib, int level) +{ + + cmprInfo = 0; + + // + // DEBUGING / BENCHMARKING + // + debug = 0; + + //zlib WordDB Compression + use_zlib = zlib; + zlib_level = level; +} + + +DB_CMPR_INFO* WordDBCompress::CmprInfo() +{ + + DB_CMPR_INFO *cmpr_info = new DB_CMPR_INFO; + + cmpr_info->user_data = (void *)this; + cmpr_info->compress = WordDBCompress_compress_c; + cmpr_info->uncompress = WordDBCompress_uncompress_c; + cmpr_info->coefficient = 3; // reduce page size by factor of 1<<3 = 8 + cmpr_info->max_npages = 9; + + if(use_zlib == 1) + cmpr_info->zlib_flags = zlib_level; + else + cmpr_info->zlib_flags = 0; + + cmprInfo = cmpr_info; + + return cmpr_info; +} + +int +WordDBCompress::Compress(const u_int8_t *inbuff, int inbuff_length, u_int8_t **outbuffp, int *outbuff_lengthp) +{ + WordDBPage pg(inbuff, inbuff_length); + + if(debug > 2) { + printf("########################### WordDBCompress::Compress: #################################################\n"); + pg.show(); + printf("~~~~~~~~~~~~~\n"); + } + + if(debug) TestCompress(inbuff, inbuff_length); + + Compressor *res = pg.Compress(0, cmprInfo); + + (*outbuffp) = res->get_data(); + (*outbuff_lengthp) = res->buffsize(); + + if(debug > 2) { + res->show(); + printf("\n%%%%%%%% Final COMPRESSED size:%4d %f\n",res->size(),res->size()/8.0); + printf("*************************** #################################################\n"); + } + + delete res; + if(debug > 2) printf("WordDBCompress::Compress: final output size:%6d (inputsize:%6d)\n", (*outbuff_lengthp), inbuff_length); + + pg.unset_page(); + + return(0); +} + +int +WordDBCompress::Uncompress(const u_int8_t *inbuff, int inbuff_length, u_int8_t *outbuff,int outbuff_length) +{ + if(debug > 2) printf("WordDBCompress::Uncompress:: %5d -> %5d\n", inbuff_length, outbuff_length); + + WordDBPage pg(outbuff_length); + + if(debug > 2) printf("------------------------ WordDBCompress::Uncompress: --------------------------------\n"); + + Compressor in(inbuff_length); + in.set_data(inbuff,inbuff_length*8); + in.rewind(); + + pg.Uncompress(&in,0); + + memcpy((void *)outbuff, (void *)pg.pg, outbuff_length); + + if(debug > 2) printf("------------------------ WordDBCompress::Uncompress: END\n"); + + // DEBUGING / BENCHMARKING + + pg.delete_page(); + return(0); +} + +int +WordDBCompress::TestCompress(const u_int8_t* pagebuff, int pagebuffsize) +{ + WordDBPage pg(pagebuff,pagebuffsize); + pg.TestCompress(debug); + pg.unset_page(); + return 0; +} |