You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
4.4 KiB
C++
176 lines
4.4 KiB
C++
//
|
|
// 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;
|
|
}
|